问题背景
服务器环境:
- Linux(Alibaba Cloud)
- 宝塔面板
- Apache + PHP-FPM + MySQL
- 16个网站
- 4个 WordPress 网站
- PHP 5.6 / 7.4 / 8.0 共存
- 内存 8GB
某天登录服务器发现内存长期处于高占用状态:
free -h
输出:
total used free shared buff/cache available
7.4G 6.5G 553M 18M 741M 553M
虽然网站访问正常,但可用内存已经非常低。
第一步:检查系统负载
查看系统状态:
top
发现 CPU 使用率很低:
Cpu(s): 91% idle
说明问题不是 CPU,而是内存占用异常。
第二步:定位内存消耗进程
查看内存占用最高的进程:
ps aux --sort=-%mem | head -20
发现大量 PHP-FPM 进程:
php-fpm: pool www
RSS ≈ 110MB
进一步统计:
ps -ef | grep php-fpm | grep -v grep | wc -l
结果:
95
服务器中竟然运行着 95 个 PHP-FPM 进程。
第三步:检查 MySQL
查看 MySQL 占用:
ps aux | grep mysqld
结果:
mysqld RES ≈ 500MB
对于 16 个站点来说非常正常。
因此可以排除:
- MySQL 配置异常
- 慢查询导致内存暴涨
问题基本锁定在 PHP-FPM。
第四步:检查 PHP-FPM 配置
查看 PHP 8.0 配置:
cat /www/server/php/80/etc/php-fpm.conf | grep pm.
结果:
pm = dynamic
pm.max_children = 150
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
PHP7.4 和 PHP5.6 也是完全相同的配置。
看到这里问题已经很明显:
pm.max_children = 150
对于 8G 内存服务器严重超配。
为什么会导致内存暴涨?
实际统计发现:
单个 PHP-FPM 进程 ≈ 100MB
理论上:
100MB × 95
≈ 9.5GB
虽然部分内存共享,但实际占用数 GB 完全正常。
这也是服务器内存长期居高不下的根本原因。
第五步:发现 Apache 配置异常
继续检查 Apache:
grep -R "MaxRequestWorkers" /www/server/apache/conf
结果:
MaxRequestWorkers 3200
查看:
grep -R "ServerLimit" /www/server/apache/conf
结果:
ServerLimit 3200
这个配置对于企业站来说完全离谱。
服务器只有 8G 内存:
MaxRequestWorkers 3200
ServerLimit 3200
等于允许 Apache 无限扩张。
一旦遭遇搜索引擎爬虫:
- Amazonbot
- AhrefsBot
- DotBot
- SemrushBot
就可能导致 Apache 和 PHP-FPM 同时膨胀。
第六步:创建 Swap
原服务器没有 Swap:
Swap: 0
增加 2G Swap:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
验证:
free -h
显示:
Swap: 2.0G
完成。
第七步:调整 PHP-FPM
通过宝塔面板修改:
软件商店
→ PHP
→ 设置
→ 配置修改
修改为:
pm = dynamic
pm.max_children = 40
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
保存并重启 PHP。
第八步:调整 Apache
通过宝塔面板:
软件商店
→ Apache
→ 设置
→ 配置修改
修改:
ServerLimit 300
MaxRequestWorkers 300
保存并重载 Apache。
优化后效果
再次检查:
free -h
结果:
total used free shared buff/cache available
7.4G 1.9G 4.8G 18M 741M 5.2G
查看 PHP-FPM 数量:
ps -ef | grep php-fpm | grep -v grep | wc -l
结果:
22
优化前后对比:
| 项目 | 优化前 | 优化后 |
|---|---|---|
| 内存占用 | 6.5G | 1.9G |
| 可用内存 | 553MB | 5.2G |
| PHP-FPM进程 | 95 | 22 |
| Swap | 无 | 2G |
| Apache Worker | 3200 | 300 |
验证是否配置过小
检查 PHP-FPM 是否达到上限:
tail -100 /www/server/php/80/var/log/php-fpm.log | grep max_children
以及:
tail -100 /www/server/php/74/var/log/php-fpm.log | grep max_children
结果均为空。
说明:
当前 PHP-FPM 配置完全够用
没有出现:
server reached pm.max_children setting
的告警。
最终结论
本次问题并不是:
- MySQL 占用过高
- WordPress 插件问题
- CPU 性能不足
真正原因是:
1. PHP-FPM 严重超配
pm.max_children = 150
导致 PHP 进程膨胀。
2. Apache 配置严重超配
ServerLimit 3200
MaxRequestWorkers 3200
为后续内存暴涨埋下隐患。
3. 没有配置 Swap
服务器缺少缓冲空间。
最终状态
优化完成后:
内存使用:1.9G
可用内存:5.2G
PHP-FPM:22个
Swap:2G
CPU空闲:90%+
服务器恢复健康运行。
对于中小型企业站、外贸站、展示型 WordPress 网站来说,这套配置已经足够长期稳定运行。
本文由 好主题 原创整理,致力于分享实用的 WordPress 建站知识与主题开发经验。 我们专注于提供高质量的 WordPress企业主题 资源,帮助中小企业轻松构建专业网站。 转载请注明来源,并保留原文链接,感谢您的支持与理解。