温馨提示×

ubuntu apache为啥内存占用高

小樊
45
2026-09-17 09:20:46
栏目: 智能运维

在 Ubuntu 上 Apache 内存占用高是非常常见的问题,通常不是“Apache 本身有 bug”,而是配置或使用方式导致的。下面按最常见原因 → 解决思路给你梳理一下。


一、最常见原因

1️⃣ Apache 使用的是 prefork 模式(最吃内存)

Ubuntu 默认 Apache 通常是:

mpm_prefork

特点:

  • 每个请求一个进程
  • 每个进程占用 几十 MB 甚至上百 MB
  • 并发一高,内存直接爆

✅ 查看当前 MPM:

apachectl -V | grep -i mpm

2️⃣ MaxClients / MaxRequestWorkers 设太大

例如:

<IfModule mpm_prefork_module>
    StartServers        5
    MinSpareServers     5
    MaxSpareServers     10
    MaxRequestWorkers   150
</IfModule>

如果服务器只有 1–2G 内存,150 个进程可能直接 OOM。

✅ 估算公式(粗略):

MaxRequestWorkers ≈ 总内存 / 单进程内存

3️⃣ PHP 是 mod_php(内存灾难)

如果你用的是:

apt install php libapache2-mod-php

那 PHP 是嵌在 Apache 进程里的

  • 每个 Apache 进程都带完整 PHP
  • 内存直接翻倍

✅ 查看:

apache2ctl -M | grep php

如果有 php7_module / php8_module,就是 mod_php


4️⃣ 开了太多模块(mod_rewrite、mod_security 等)

每个模块都会增加进程内存。

查看已启用模块:

apache2ctl -M

5️⃣ 网站代码问题(内存泄漏 / 死循环)

  • PHP 脚本吃内存
  • 请求长时间不结束
  • Apache 进程一直不释放

6️⃣ 被爬虫 / 攻击(CC、扫描)

大量请求 → 大量 Apache 进程 → 内存满


二、如何快速排查

1️⃣ 看 Apache 进程占多少内存

ps aux | grep apache2

或:

top -p $(pgrep apache2 | tr '\n' ',' | sed 's/,$//')

2️⃣ 看当前连接数

netstat -ant | grep :80 | wc -l

3️⃣ 看是不是 PHP 问题

php -i | grep memory_limit

三、推荐解决方案(重点)

✅ 方案 1(最推荐):换 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

效果:

  • Apache 只处理连接
  • PHP 单独进程
  • 内存直接降 50%+

✅ 方案 2:限制 prefork 数量(不换架构)

编辑:

/etc/apache2/mods-enabled/mpm_prefork.conf

示例(2G 内存):

StartServers        2
MinSpareServers     2
MaxSpareServers     4
MaxRequestWorkers   30

✅ 方案 3:定期回收进程

MaxConnectionsPerChild 1000

防止内存泄漏累积。


四、简单总结一句话

Ubuntu 上 Apache 内存高,90% 是因为 prefork + mod_php + 并发配置不合理

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • Apache / PHP 版本
  • 内存大小
  • 是否 WordPress / Laravel / 其他程序

我可以直接帮你给一份最优配置

0