PHP-FPM 在 Linux 中的错误排查
一 快速定位流程
二 常见错误与修复对照表
| 症状 | 高频原因 | 快速修复 |
|---|---|---|
| 启动失败且 status=78 | 配置语法/路径/权限错误 | 执行php-fpm -t定位;检查listen路径、目录权限;必要时前台运行查看报错 |
| systemd 报 “start request repeated too quickly” | 连续启动失败触发保护 | 先systemctl reset-failed php-fpm,修复根因后再启动 |
| 502 Bad Gateway | PHP-FPM 未启动或通信失败 | systemctl status/restart php-fpm;核对listen与fastcgi_pass一致 |
| 504 Gateway Timeout | 脚本执行超时或进程不足 | 调整request_terminate_timeout、增大pm.max_children;优化慢脚本 |
| “Primary script unknown” | Nginx 未正确传递脚本路径 | 在 Nginx 配置中加入:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 并确保root正确 |
| 进程池耗尽 | 并发超过pm.max_children | 合理提升max_children并优化应用;必要时切换pm=dynamic并调整start/min_spare/max_spare_servers |
| 权限错误 | FPM 运行用户对目录/套接字无权限 | 确认user/group;对**/run/php-fpm/、/var/log/php-fpm/、/run/php-fpm.sock**设置正确属主/权限 |
| 日志文件过大 | 未做日志轮转 | 配置logrotate;按需调整log_level |
三 配置与性能关键点
四 一键排查脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
echo "=== 1) 重置 systemd 失败计数 ==="
systemctl reset-failed php-fpm 2>/dev/null || true
echo "=== 2) 检查服务状态 ==="
systemctl status php-fpm --no-pager || true
echo "=== 3) 测试配置语法 ==="
if command -v php-fpm7.x >/dev/null 2>&1; then
php-fpm7.x -t
elif command -v php-fpm >/dev/null 2>&1; then
php-fpm -t
else
echo "未找到 php-fpm 可执行文件,请确认安装路径与版本。"
exit 1
fi
echo "=== 4) 查看错误日志尾部 ==="
tail -n50 /var/log/php-fpm/error.log 2>/dev/null || echo "未找到 /var/log/php-fpm/error.log,请检查 error_log 配置。"
echo "=== 5) 检查监听端口/套接字占用 ==="
ss -tulnp | grep ':9000' || echo "端口 9000 未被占用或未监听。"
ss -lunpx | grep 'php-fpm' || echo "未发现 php-fpm.sock 监听。"
echo "=== 6) 前台运行以获取实时错误 ==="
if command -v php-fpm7.x >/dev/null 2>&1; then
php-fpm7.x --nodaemonize --fpm-config /etc/php/7.x/fpm/php-fpm.conf
elif command -v php-fpm >/dev/null 2>&1; then
php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
fi
将脚本中的php-fpm7.x与配置文件路径替换为你的实际环境;执行后根据输出修复对应问题,再执行systemctl start php-fpm验证。