优化Apache内存使用需结合MPM模块选择、配置参数调整、内存管理工具及监控等多方面操作,以下是具体步骤:
Apache的多路处理模块(MPM)直接影响内存占用,CentOS默认使用prefork(多进程模型,内存消耗高),建议切换至worker(多进程+多线程,内存效率更高)或event(worker的改进版,支持异步处理,内存占用更低)。
/etc/httpd/conf/httpd.conf,注释prefork模块,启用worker模块:# 注释prefork模块
# <IfModule mpm_prefork_module>
# StartServers 5
# MinSpareServers 5
# MaxSpareServers 10
# MaxRequestWorkers 150
# MaxConnectionsPerChild 0
# </IfModule>
# 启用worker模块
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
worker,但更适合高并发场景,配置示例如下:<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
注:修改后需重启Apache(
sudo systemctl restart httpd)使配置生效。
根据服务器内存(如8GB内存)和预期负载(如1000并发),调整以下关键参数:
(总内存 - 系统预留内存) / 单个进程内存占用(如单个prefork进程占用10MB,则MaxRequestWorkers= (8192-1024)/10≈700)。MinSpareServers的1.5倍(如MinSpareThreads=25,则StartServers=4)。worker/event模块使用线程,prefork模块使用进程)。KeepAlive可减少TCP连接开销,但会增加内存占用(长连接保持进程/线程活跃)。调整以下参数:
KeepAlive On
MaxKeepAliveRequests 100 # 单个连接最大请求数(设为0表示无限制)
KeepAliveTimeout 5 # 连接保持时间(秒,建议5-10秒)
注:若网站静态资源较多,可适当增大
MaxKeepAliveRequests;若动态内容占比高,缩短KeepAliveTimeout以释放内存。
Apache默认加载大量模块(如mod_autoindex、mod_negotiation),禁用未使用的模块可减少内存占用:
# 查看已加载模块
httpd -M
# 禁用模块(如mod_autoindex)
sudo a2dismod autoindex # Debian/Ubuntu
sudo yum remove mod_autoindex # CentOS(需确认模块是否由httpd提供)
注:禁用模块前需确认其是否被网站功能依赖(如
mod_rewrite用于URL重写)。
通过缓存静态资源(HTML、CSS、JS)和动态内容,减少Apache对内存的频繁访问:
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
CacheEnable disk / # 缓存根目录
CacheRoot "/var/cache/apache2"
CacheDirLevels 2
CacheDirLength 1
LoadModule deflate_module modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/css application/javascript
DeflateCompressionLevel 6 # 压缩级别(1-9,6为平衡值)
注:缓存目录需提前创建(
sudo mkdir -p /var/cache/apache2)并设置权限(sudo chown -R apache:apache /var/cache/apache2)。
通过sysctl命令调整内核参数,提升内存使用效率:
# 减少系统对交换空间的依赖(swappiness值越小,越倾向于使用物理内存)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
# 更谨慎地分配内存(避免OOM killer过度杀进程)
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
# 应用配置
sudo sysctl -p
使用工具实时监控Apache内存使用,根据实际情况调整参数:
httpd)的内存占用(%MEM列),识别内存泄漏进程。sudo yum install apachetop)。error_log(/var/log/httpd/error_log)查看内存泄漏或配置错误信息。php.ini中的memory_limit(如memory_limit=128M),防止PHP脚本占用过多内存。swap使用率超过20%),升级物理内存是最有效的解决方案。以上步骤需根据服务器实际负载(如并发量、静态/动态内容比例)和硬件配置(如内存大小)进行调整,建议在测试环境验证后再应用于生产环境。