我的知识记录

502 Bad Gateway排查?PHP-FPM进程崩溃恢复?

502 Bad Gateway错误通常发生在Nginx与后端服务(如PHP-FPM)通信失败时。以下是系统化的排查方法和PHP-FPM进程崩溃的恢复方案。

1. 502错误快速定位

核心排查流程


 
bash
# 1. 检查Nginx错误日志(通常路径) tail -100 /var/log/nginx/error.log | grep "502" # 2. 检查PHP-FPM状态 systemctl status php-fpm # 或php7.4-fpm/php8.2-fpm # 3. 测试PHP-FPM端口响应 nc -zv 127.0.0.1 9000 # 默认PHP-FPM端口
常见原因 典型日志线索 解决方案
PHP-FPM进程崩溃 connect() failed (111: Connection refused) 重启服务+优化配置(见第2节)
后端超时 upstream timed out 调整fastcgi_read_timeout
资源耗尽 Too many open files 增加系统/进程文件限制

2. PHP-FPM进程崩溃专项处理

(1) 崩溃原因分析


 
bash
# 查看PHP-FPM最新崩溃日志 journalctl -u php-fpm --no-pager -n 50 # 检查核心转储(需提前启用) ls -lh /var/coredumps/ # 或grep "core dumped" /var/log/syslog
高频崩溃根源
✅ 内存泄漏:PHP脚本未释放大数组/对象
✅ 第三方扩展冲突:如xdebug、opcache兼容性问题
✅ 无限递归/死循环:导致进程卡死

(2) 紧急恢复操作


 
bash
# 强制重启PHP-FPM(保留当前连接) sudo kill -USR2 $(pgrep php-fpm) # 或完全重启 sudo systemctl restart php-fpm

(3) 长期稳定方案


 
ini
; /etc/php/8.2/fpm/php-fpm.conf 关键配置 emergency_restart_threshold = 3 ; 3次异常后自动重启 emergency_restart_interval = 1m ; 1分钟内触发阈值才生效 process_control_timeout = 10s ; 子进程终止超时时间 pm = dynamic ; 动态进程管理 pm.max_children = 50 ; 根据内存调整(公式:可用内存/单个进程内存) pm.start_servers = 5 ; 初始进程数 pm.min_spare_servers = 2 ; 最小空闲进程 pm.max_spare_servers = 8 ; 最大空闲进程
内存计算工具

 
bash
# 统计单个PHP-FPM进程内存占用(RSS) ps --no-headers -o "rss" -C php-fpm | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

3. 高级监控与自动化

(1) 进程守护脚本


 
bash
#!/bin/bash if ! nc -z 127.0.0.1 9000; then echo "$(date) - PHP-FPM down! Restarting..." >> /var/log/php-monitor.log systemctl restart php-fpm fi # 加入crontab每分钟检查 * * * * * /path/to/script.sh

(2) 资源限制调优


 
bash
# 调整系统限制(临时生效) ulimit -n 65535 # 永久生效(编辑/etc/security/limits.conf) * soft nofile 65535 * hard nofile 65535

4. 典型场景解决方案

场景1:间歇性502错误

  • 排查方向
    🔹 MySQL连接池耗尽 → 优化max_connections
    🔹 PHP脚本执行超时 → 调整request_terminate_timeout

场景2:高并发时崩溃

  • 优化策略
    🔹 启用pm.status_path监控FPM状态
    🔹 使用opcache.preload提升性能
压力测试工具

 
bash
ab -n 1000 -c 50 http://test.site/ # 模拟高并发

总结流程图


 
mermaid
graph TD A[出现502错误] --> B{检查Nginx日志} B -->|连接拒绝| C[重启PHP-FPM] B -->|超时| D[调整fastcgi_timeout] C --> E[分析崩溃原因] E --> F[内存泄漏?扩展冲突?] F --> G[对应优化+监控]
最终建议
1️⃣ 生产环境推荐使用pm=ondemand节省资源
2️⃣ 关键业务部署双机热备PHP-FPM
3️⃣ 长期监控工具:New Relic/Datadog(追踪PHP异常)
 

502 Bad Gateway排查?PHP-FPM进程崩溃恢复?

标签:502错误、Nginx、PHP-FPM、进程崩溃、资源监控、自动恢复

更新时间:2025-06-02 12:42:35

上一篇:网站网页连接失败是怎么回事?如何排查网络问题?

下一篇:网站密码找回与安全策略查看指南