温馨提示×

ubuntu apache为何内存占用高

小樊
41
2026-09-23 12:08:30
栏目: 智能运维

在 Ubuntu 上 Apache 内存占用高是很常见的问题,通常不是“Apache 本身有 bug”,而是配置和使用方式导致的。下面按最常见原因 → 解释 → 解决建议来说明。


一、最常见原因

1️⃣ Apache 工作模式(MPM)配置不当

Apache 有几种工作模式:

  • prefork(默认,进程模型)
  • worker
  • event(推荐)

prefork 模式最容易吃内存

每个请求 = 一个进程
进程多 → 内存爆炸

apache2ctl -V | grep -i mpm

如果看到:

Server MPM: prefork

那就是典型原因。

✅ 解决:

  • 改用 event / worker
  • 或限制 MaxClients

2️⃣ MaxRequestWorkers / 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

3️⃣ PHP 内存配置过高(非常常见)

如果你用 Apache + PHP:

memory_limit = 512M

每个 PHP 进程都可能吃 512MB!

✅ 检查:

php -i | grep memory_limit

✅ 建议:

memory_limit = 128M

4️⃣ 加载了太多 Apache 模块

常见“内存杀手”模块:

  • mod_php
  • mod_security
  • mod_pagespeed
  • mod_perl

✅ 查看已加载模块:

apache2ctl -M

✅ 禁用不用的:

sudo a2dismod php7.4
sudo a2dismod security2

5️⃣ 使用了 mod_php(而不是 php-fpm)

mod_php = 每个 Apache 进程都带 PHP

✅ 更优方案:

  • Apache + php-fpm
  • 使用 proxy_fcgi

内存可下降 50% 以上


6️⃣ 网站流量 / 爬虫 / 被攻击

  • 并发访问高
  • 搜索引擎疯狂爬
  • CC / DoS 攻击

✅ 查看连接数:

sudo netstat -ant | grep :80 | wc -l

✅ 解决:

  • 限流
  • 上 Nginx 反代
  • 用 fail2ban

7️⃣ 内存泄漏(程序问题)

  • 老旧 PHP 程序
  • 无限循环
  • 长连接不释放

✅ 解决:

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 ✅ 禁用无用模块


四、如果你愿意,我可以:

  • 帮你 看具体内存占用
  • 帮你 选 MPM
  • 给你一套 Ubuntu + Apache 最优配置
  • 判断该不该 换 Nginx

你可以直接贴:

free -h
ps aux | grep apache2
apache2ctl -V

0 踩