在 Ubuntu 上 Apache 内存占用高是很常见的问题,通常不是“Apache 本身有 bug”,而是配置和使用方式导致的。下面按最常见原因 → 解释 → 解决建议来说明。
Apache 有几种工作模式:
每个请求 = 一个进程
进程多 → 内存爆炸
apache2ctl -V | grep -i mpm
如果看到:
Server MPM: prefork
那就是典型原因。
✅ 解决:
MaxClients常见于:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
MaxRequestWorkers 200
MaxConnectionsPerChild 0
</IfModule>
➡️ 200 个进程 × 每个 30~50MB = 6~10GB 内存
✅ 建议:
MaxRequestWorkers 50
MaxConnectionsPerChild 1000
如果你用 Apache + PHP:
memory_limit = 512M
每个 PHP 进程都可能吃 512MB!
✅ 检查:
php -i | grep memory_limit
✅ 建议:
memory_limit = 128M
常见“内存杀手”模块:
✅ 查看已加载模块:
apache2ctl -M
✅ 禁用不用的:
sudo a2dismod php7.4
sudo a2dismod security2
mod_php = 每个 Apache 进程都带 PHP
✅ 更优方案:
proxy_fcgi内存可下降 50% 以上
✅ 查看连接数:
sudo netstat -ant | grep :80 | wc -l
✅ 解决:
✅ 解决:
MaxConnectionsPerChild 500
强制进程重启
# 查看 Apache 进程内存
ps aux | grep apache
# 每个进程平均内存
ps -eo pid,user,rss,comm | grep apache2
# Apache 状态
apache2ctl status
✅ Apache (event) + PHP-FPM
✅ MaxRequestWorkers 控制在 50 以内
✅ memory_limit = 128M
✅ 禁用无用模块
你可以直接贴:
free -h
ps aux | grep apache2
apache2ctl -V