温馨提示×

PHP-FPM在Linux中的错误排查

小樊
45
2026-01-08 16:45:12
栏目: 编程语言

PHP-FPM 在 Linux 中的错误排查

一 快速定位流程

  • 查看服务状态与失败原因:执行systemctl status php-fpm,若出现Active: failed (Result: start-limit),说明短时间内多次启动失败,systemd 已暂时停止重启。先执行systemctl reset-failed php-fpm重置失败计数,再继续排查。
  • 验证配置文件语法:执行php-fpm -t或带配置路径的**/usr/local/php/sbin/php-fpm --test --fpm-config /usr/local/php/etc/php-fpm.conf**;输出“configuration file … is valid”表示语法无误。
  • 查看错误日志:打开php-fpm.conf中的error_log配置项(常见路径如**/var/log/php-fpm/error.log**),执行tail -n50 /var/log/php-fpm/error.log定位具体报错。
  • 前台运行以获取实时错误:执行**/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf**,前台会直接打印启动失败原因。
  • 核对监听与上游连通:确认listen(如127.0.0.1:9000或**/run/php-fpm.sock**)与 Nginx/Apachefastcgi_pass一致;端口占用用ss -tulnp | grep 9000netstat -tulnp | grep 9000排查。

二 常见错误与修复对照表

症状 高频原因 快速修复
启动失败且 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;核对listenfastcgi_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

三 配置与性能关键点

  • 进程管理参数(以 pm=dynamic 为例):确保max_children > max_spare_servers ≥ min_spare_servers,且start_servers通常取两者之间(如**(min+max)/2**)。示例(8GB内存):max_children=500,start_servers=200,min_spare_servers=100,max_spare_servers=300(需结合实际内存与业务评估)。
  • 请求与稳定性:设置request_terminate_timeout(0 表示关闭,注意与php.ini max_execution_time的关系);开启request_slowlog_timeout=10s记录慢脚本;按需配置pm.status_path=/statusping.path=/ping用于监控。
  • 监听与权限:TCP 方式常用listen=127.0.0.1:9000;Unix Socket 方式需设置listen.owner / listen.group / listen.mode(如0666),并确保 Web 服务与 FPM 运行用户对套接字与目录有相应权限。
  • 文件描述符限制:若报资源限制,可在 systemd 服务单元**[Service]段增加LimitNOFILE=65535systemctl daemon-reload**。

四 一键排查脚本示例

#!/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验证。

0