温馨提示×

centos apache为什么占内存高

小樊
38
2026-10-05 22:11:26
栏目: 智能运维

在 CentOS 上 Apache(httpd)占用内存高,通常不是“Apache 本身有 bug”,而是配置 + 使用场景共同导致的。下面按最常见原因 → 对应解决办法来说明。


一、最常见原因

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

CentOS 默认常用:

  • prefork(进程模式)
  • worker / event(线程模式)

prefork 模式(最吃内存)

<IfModule prefork.c>
    StartServers        8
    MinSpareServers     5
    MaxSpareServers     20
    ServerLimit         256
    MaxClients          256
    MaxRequestsPerChild 4000
</IfModule>

问题:

  • 每个请求 = 一个进程
  • 每个进程 几 MB~几十 MB
  • 并发一高,内存直接爆

✅ 解决:

  • 降低 MaxClients
  • 或改为 worker / event

2️⃣ MaxClients / MaxRequestWorkers 设置过大

ps aux | grep httpd

如果看到 几十上百个 httpd 进程,基本就是这个值太大。

✅ 建议:

ServerLimit 150
MaxClients 150

3️⃣ PHP 内存占用高(非常常见)

如果你用的是:

  • mod_php
  • WordPress / Laravel / ThinkPHP

那 Apache 内存 ≈ PHP 内存

检查 PHP 配置

php -i | grep memory_limit

常见:

memory_limit = 128M

并发 50 → 50 × 128M = 6.4G

✅ 解决:

  • 降低 memory_limit
  • 使用 php-fpm(推荐)

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

mod_php:

  • 每个 Apache 进程都带 PHP
  • 内存永远下不来

✅ 推荐架构:

Apache + php-fpm

5️⃣ 开启了不必要的模块

httpd -M

常见吃内存模块:

  • mod_proxy
  • mod_php
  • mod_security
  • mod_perl

✅ 关闭不用的:

yum remove mod_php

6️⃣ 网站被爬虫 / 攻击 / 并发暴涨

表现:

  • 内存突然升高
  • httpd 进程暴增

✅ 检查:

netstat -an | grep :80 | wc -l

✅ 解决:

  • 限流
  • 防火墙
  • CDN

7️⃣ KeepAlive 设置不合理

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

问题:

  • 连接不释放 → 进程不退出

✅ 建议:

KeepAliveTimeout 5

二、快速排查步骤(实用)

# 看 Apache 进程数
ps -ef | grep httpd | wc -l

# 看每个进程内存
ps -o pid,user,rss,comm -C httpd

# 看总内存
free -m

# 看 Apache 配置
httpd -V | grep MPM

三、推荐优化方案(CentOS 标准做法)

✅ 最佳实践

  • Apache:event + php-fpm
  • 控制并发
  • 关闭无用模块
  • 加 Swap(应急)

四、如果你愿意

你可以直接把下面信息贴出来,我可以精确告诉你怎么改:

  1. CentOS 版本
  2. Apache 版本
  3. 是否用 PHP
  4. httpd -M 输出
  5. free -m 结果

我可以给你一套可直接用的配置。

0 踩