在 Ubuntu 上 Apache 内存占用高是非常常见的问题,通常不是“Apache 本身有 bug”,而是配置或使用方式导致的。下面按最常见原因 → 解决思路给你梳理一下。
prefork 模式(最吃内存)Ubuntu 默认 Apache 通常是:
mpm_prefork
特点:
✅ 查看当前 MPM:
apachectl -V | grep -i mpm
例如:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
</IfModule>
如果服务器只有 1–2G 内存,150 个进程可能直接 OOM。
✅ 估算公式(粗略):
MaxRequestWorkers ≈ 总内存 / 单进程内存
mod_php(内存灾难)如果你用的是:
apt install php libapache2-mod-php
那 PHP 是嵌在 Apache 进程里的:
✅ 查看:
apache2ctl -M | grep php
如果有 php7_module / php8_module,就是 mod_php
每个模块都会增加进程内存。
查看已启用模块:
apache2ctl -M
大量请求 → 大量 Apache 进程 → 内存满
ps aux | grep apache2
或:
top -p $(pgrep apache2 | tr '\n' ',' | sed 's/,$//')
netstat -ant | grep :80 | wc -l
php -i | grep memory_limit
event + PHP-FPM这是现代 Ubuntu 服务器标准做法
# 禁用 prefork + mod_php
a2dismod php8.1 mpm_prefork
# 启用 event + proxy_fcgi
a2enmod mpm_event proxy_fcgi setenvif
a2enconf php8.1-fpm
# 重启
systemctl restart apache2 php8.1-fpm
效果:
编辑:
/etc/apache2/mods-enabled/mpm_prefork.conf
示例(2G 内存):
StartServers 2
MinSpareServers 2
MaxSpareServers 4
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
防止内存泄漏累积。
Ubuntu 上 Apache 内存高,90% 是因为 prefork + mod_php + 并发配置不合理
如果你愿意,可以告诉我:
我可以直接帮你给一份最优配置。