在 TencentOS Server 3.1(基于 CentOS/RHEL 8 体系)上运行 PHP-FPM 不稳定,通常由资源限制、配置不当、内核参数或系统服务冲突引起。以下是系统化的排查与优化方案:
🔍 一、常见不稳定表现
- PHP-FPM 进程频繁重启(
max_children耗尽) - 请求超时(502 Bad Gateway / 504 Gateway Timeout)
- CPU/内存使用率突增后崩溃
- 日志中出现
ERROR: pool www seems to be busy或failed to process request
✅ 二、系统化排查步骤
1️⃣ 检查 PHP-FPM 错误日志
# 默认路径(根据安装方式可能不同)
tail -f /var/log/php-fpm/error.log
journalctl -u php-fpm.service --since "1 hour ago" --no-pager
关注关键词:
out of memorychild exited with signalpool www worker limit reachedfailed to open script
2️⃣ 检查系统资源使用情况
# 查看 CPU、内存、磁盘 I/O
top -c
htop
vmstat 1 10
iostat -x 1 10
# 查看是否有 OOM Killer 介入
dmesg | grep -i "oom|killed process"
💡 如果看到
OOM killer killed php-fpm,说明内存不足,需优化或扩容。
3️⃣ 检查 PHP-FPM 配置(关键!)
编辑对应池配置文件(如 /etc/php-fpm.d/www.conf):
✅ 推荐基础优化参数:
[www]
; 动态模式更适合高并发
pm = dynamic
pm.max_children = 50 ; 根据内存计算:总可用内存 / (每子进程平均内存)
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500 ; 防止内存泄漏,定期重启worker
; 超时设置
request_terminate_timeout = 60s ; 单个请求最大执行时间
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 30s ; 慢查询阈值
; 安全加固
security.limit_extensions = .php
chdir = /
📌 如何计算
max_children?max_children = (服务器总内存 - OS保留内存) / (每个PHP子进程平均内存)可通过以下命令估算单进程内存:
ps -ylC php-fpm --sort:rss | awk '{sum+=$8; count++} END {print sum/count/1024 " MB"}'
4️⃣ 调整系统级限制
a) 文件描述符限制
# 编辑 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# 生效(重新登录或重启)
ulimit -n
b) 内核参数优化(sysctl)
编辑 /etc/sysctl.conf:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 65535
vm.swappiness = 10
应用:
sysctl -p
c) Nginx/Apache 配合优化(如果使用反向X_X)
确保 nginx 的 proxy_read_timeout 和 fastcgi_read_timeout 大于 PHP 的 request_terminate_timeout。
5️⃣ 检查 SELinux 和防火墙
TencentOS Server 默认启用 SELinux,可能阻止 PHP-FPM 访问某些资源:
# 查看 SELinux 状态
getenforce
# 临时设为 permissive 测试
setenforce 0
# 如果问题解决,需配置正确策略而非关闭 SELinux
ausearch -m avc -ts recent | audit2allow -M mypol
semodule -i mypol.pp
6️⃣ 检查数据库连接问题(常见瓶颈)
如果 PHP 脚本依赖 MySQL/MariaDB:
- 检查 MySQL 连接数是否耗尽
- 启用慢查询日志
- 确保 PHP 使用持久连接或合理释放连接
SHOW PROCESSLIST;
SHOW VARIABLES LIKE 'max_connections';
7️⃣ 监控与告警建议
安装并配置监控工具:
# 安装 atop 或 netdata
yum install atop netdata
# 或使用腾讯云的云监控插件
重点监控指标:
- PHP-FPM 活跃/空闲进程数
- 请求队列长度
- 响应时间 P95/P99
- 内存泄漏趋势
🛠️ 三、快速诊断脚本
创建一个诊断脚本 diagnose-php-fpm.sh:
#!/bin/bash
echo "=== PHP-FPM Status ==="
systemctl status php-fpm --no-pager | head -20
echo -e "n=== Active Processes ==="
ps aux | grep php-fpm | grep -v grep | wc -l
echo -e "n=== Memory Usage ==="
free -h
echo -e "n=== Recent Errors ==="
journalctl -u php-fpm --since "30 minutes ago" --no-pager | grep -i error
echo -e "n=== Open Files Limit ==="
ulimit -n
echo -e "n=== Disk Space ==="
df -h /var/log
📌 四、总结 Checklist
| 项目 | 操作 |
|---|---|
| ✅ 日志分析 | 检查 /var/log/php-fpm/error.log |
| ✅ 资源监控 | top/vmstat/dmesg 查 OOM/CPU/IO |
| ✅ FPM 配置 | 调整 max_children, max_requests, timeout |
| ✅ 系统限制 | ulimit -n, sysctl 网络参数 |
| ✅ SELinux | 检查并配置正确策略 |
| ✅ 数据库 | 检查连接数和慢查询 |
| ✅ 监控 | 部署 atop/netdata/腾讯云监控 |
🆘 如果仍不稳定?
- 升级 PHP 版本:旧版可能存在已知 bug
- 切换为静态模式(调试用):
pm = static+ 固定pm.max_children - 分离前端后端:Nginx 直接返回静态内容,PHP 仅处理 API
- 联系腾讯云技术支持:提供完整日志和
tencentos-server-support信息
如需进一步帮助,请提供:
php-fpm -v版本- 完整
www.conf配置 - 最近 100 行错误日志
top输出截图
云小栈