首先通过以下命令确认内存使用情况及Apache进程的资源消耗:
free -m:查看系统内存总量、已用内存、剩余内存及Swap分区使用情况,判断是否因内存不足导致溢出。top -M 或 htop:按%MEM字段排序,找出占用内存最高的进程(通常为Apache的httpd或apache2进程);若发现异常进程(如非系统关键进程占用过高内存),可使用kill -9 <PID>终止(需谨慎操作)。ps aux | grep apache2:查看Apache进程的数量及内存占用详情,确认是否存在过多子进程。Apache的内存溢出多与并发设置不合理有关,需调整核心参数以限制资源消耗:
prefork或worker,Apache 2.4+推荐event):
prefork模块(适用于兼容性场景):/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf中,调整以下参数:<IfModule mpm_prefork_module>
StartServers 5 # 启动时的进程数(根据服务器负载调整)
MinSpareServers 5 # 最小空闲进程数
MaxSpareServers 10 # 最大空闲进程数
MaxRequestWorkers 150 # 最大并发请求数(关键参数,根据内存大小调整,如每进程占用100MB,则150进程约需1.5GB内存)
MaxConnectionsPerChild 1000 # 每个子进程处理的最大请求数(防止内存泄漏累积)
</IfModule>
event模块(推荐,性能更优):event模块(需注释prefork/worker配置,取消event注释):<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
</IfModule>
MaxKeepAliveRequests避免资源泄露:KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
logrotate工具定期分割日志,避免单个日志文件过大占用内存:sudo yum install logrotate -y
sudo nano /etc/logrotate.d/httpd
添加以下内容(每日分割,保留7天):/var/log/httpd/*.log {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
postrotate
systemctl reload httpd
endscript
}
Apache加载的模块越多,内存占用越高。通过以下命令查看已加载模块:
sudo apache2ctl -M # 或 sudo httpd -M(CentOS 7及以下)
禁用不需要的模块(如mod_cgi、mod_autoindex等),编辑配置文件(/etc/httpd/conf.modules.d/00-base.conf或/etc/apache2/mods-enabled/下的符号链接),注释或删除对应模块的LoadModule行,然后重启Apache:
sudo systemctl restart httpd
通过缓存静态资源(HTML、CSS、JS、图片等),减少Apache对硬盘的频繁读取,降低内存占用:
mod_cache和mod_disk_cache:LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache.c>
CacheQuickHandler off
CacheLock on
CacheLockPath /tmp/mod_cache-lock
CacheLockMaxAge 5
CacheIgnoreHeaders Set-Cookie
<IfModule mod_cache_disk.c>
CacheRoot /var/cache/apache2
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
</IfModule>
</IfModule>
创建缓存目录并设置权限:sudo mkdir -p /var/cache/apache2
sudo chown -R apache:apache /var/cache/apache2 # CentOS 7及以下为apache用户
sudo systemctl restart httpd
通过修改内核参数,提高系统对内存的处理能力:
/etc/sysctl.conf,添加以下内容:vm.swappiness = 10 # 降低Swap使用倾向(值越低越优先使用物理内存,范围0-100)
vm.overcommit_memory = 1 # 更谨慎地分配内存,避免OOM(内存溢出)
fs.file-max = 65536 # 增加系统最大文件描述符数
net.ipv4.tcp_tw_reuse = 1 # 复用TIME-WAIT状态的TCP连接,减少资源占用
使配置生效:sudo sysctl -p
若物理内存不足,可通过Swap分区作为虚拟内存,缓解内存溢出问题:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
/etc/fstab:/swapfile swap swap defaults 0 0
注意:Swap性能远低于物理内存,仅作为临时解决方案。若使用旧版本Apache(如2.0.x),升级到最新稳定版(如2.4.x),修复已知内存泄漏bug(如MaxRequestsPerChild相关问题)。升级前备份配置文件:
sudo yum update httpd -y # CentOS默认仓库升级
# 或通过源码编译升级(需下载最新版本)
netdata、apachetop或sar,实时监控Apache的内存、CPU使用情况及请求响应时间,及时发现异常。sudo systemctl restart httpd
通过以上步骤,可有效解决CentOS下Apache2的内存溢出问题。需根据服务器的实际负载(如并发请求数、静态资源占比)调整参数,建议在测试环境验证后再应用到生产环境。