在调整前,需先了解Apache及系统的内存占用现状,为后续参数设置提供依据:
ps aux | grep httpd
命令,重点关注%MEM
(内存占用百分比)和RSS
(实际内存使用量,单位KB)列,识别高内存进程。top
命令(按M
键按内存排序)或free -m
命令,查看系统总内存、已用内存、剩余内存及Swap使用情况。Apache的内存使用主要由**MPM(多处理模块)**决定,CentOS默认使用prefork
(进程模式,适合兼容性场景),高性能场景建议切换至worker
(线程模式)或event
(异步线程模式)。需根据模块类型调整对应参数:
编辑Apache配置文件(/etc/httpd/conf/httpd.conf
或/etc/apache2/apache2.conf
),注释prefork
模块,启用worker
或event
模块:
# 注释prefork模块(若存在)
# <IfModule mpm_prefork_module>
# ...
# </IfModule>
# 启用worker模块(示例配置)
<IfModule mpm_worker_module>
StartServers 2 # 启动时的工作进程数(每个进程包含多个线程)
MinSpareThreads 25 # 最小空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadLimit 64 # 单个进程的最大线程数(需≤ThreadsPerChild)
ThreadsPerChild 25 # 每个工作进程创建的线程数
MaxRequestWorkers 150 # 最大并发请求数(=ThreadsPerChild×StartServers)
MaxConnectionsPerChild 0 # 每个进程处理的请求数(0=无限制,建议设为1000~10000防内存泄漏)
</IfModule>
注:
worker
模式通过线程处理请求,内存占用远低于prefork
(每个线程共享进程内存)。
若因兼容性需保留prefork
模块,需调整以下参数平衡并发与内存:
<IfModule mpm_prefork_module>
StartServers 5 # 启动时的进程数(根据负载调整)
MinSpareServers 5 # 最小空闲进程数(避免频繁创建进程)
MaxSpareServers 10 # 最大空闲进程数(避免内存浪费)
MaxRequestWorkers 150 # 最大并发进程数(关键参数,需匹配内存容量)
MaxConnectionsPerChild 1000 # 每个进程处理的请求数(防内存泄漏)
</IfModule>
KeepAlive可减少TCP连接开销,但会增加内存占用(长连接保持进程/线程活跃)。调整以下参数:
KeepAlive On # 启用KeepAlive
MaxKeepAliveRequests 100 # 每个连接的最大请求数(避免单个连接占用过久)
KeepAliveTimeout 5 # 连接保持时间(秒,建议5~10秒)
注:若网站静态资源多(如图片、CSS),可适当增大
MaxKeepAliveRequests
;若动态请求多,建议缩短KeepAliveTimeout
。
Apache默认加载大量模块,禁用未使用的模块可释放内存。执行以下命令查看已加载模块:
httpd -M # 或 apachectl -M
禁用模块(如status
、autoindex
):
LoadModule status_module modules/mod_status.so # 注释掉此行(在配置文件中)
通过缓存静态资源(HTML、CSS、JS)减少重复请求,降低内存负载:
# 启用mod_cache和mod_disk_cache
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_disk_cache.so
# 配置缓存路径和大小
CacheEnable disk /
CacheRoot "/var/cache/apache2"
CacheDirLevels 2
CacheDirLength 1
通过修改内核参数优化内存管理:
# 降低vm.swappiness(减少Swap使用,优先用物理内存)
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
# 允许内存过量使用(避免OOM Killer频繁终止进程)
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
sudo systemctl restart httpd
(CentOS 7/8)或sudo systemctl restart apache2
(部分版本)使更改生效。top
、htop
或apachetop
(sudo yum install apachetop
)实时查看内存占用,若MaxRequestWorkers
设置过高导致内存耗尽,需逐步降低该值至系统稳定。MaxRequestWorkers
需根据服务器内存计算(如每进程占用50MB,1GB内存建议设置为1024MB/50MB=20
,留足系统预留内存)。/var/log/httpd/error_log
(或error.log
),关注内存泄漏或配置错误提示。