温馨提示×

如何排查Linux php-fpm的错误

小樊
48
2025-11-22 15:11:35
栏目: 编程语言

Linux 上排查 PHP-FPM 错误的实用流程


一 快速定位思路

  • 先看服务状态与最近日志,确认是否为进程未起、配置错误或权限问题。
  • 再做配置语法校验与端口/套接字占用检查,排除“起不来”的直接原因。
  • 结合 Web 服务器错误页与 PHP-FPM 自身日志,锁定是上游网关问题还是 FPM 内部问题。
  • 最后针对常见症状(如 502/504、空白页、慢脚本)做专项调参与优化。

二 定位步骤与命令

  • 查看服务状态与日志
    • 状态:sudo systemctl status php<version>-fpm(是否 active、是否 failed、最近的 journal 报错)
    • 实时日志:sudo journalctl -u php<version>-fpm -f
    • FPM 错误日志常见路径:/var/log/php<version>-fpm.log/var/log/php-fpm.log/var/log/php-fpm/error.log;若未单独配置,可能写入系统日志(如 /var/log/syslog)。也可在 www.conferror_log 指令查看自定义路径。
  • 配置语法与包含文件检查
    • 语法:sudo php-fpm<version> -t(检查主配置与所有包含的 pool.d/*.conf 是否有语法错误)
  • 进程与端口/套接字冲突
    • 端口占用(TCP):sudo ss -tulnp | grep 9000(如监听 127.0.0.1:9000 被占用,需改 listen 或释放占用)
    • 套接字文件(Unix Socket):ls -l /run/php/php<version>-fpm.sock(确认存在且权限正确)
  • 与 Web 服务器联动核对
    • Nginx 常见 FastCGI 关键参数:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass 与 FPM 的 listen 一致(同为 127.0.0.1:9000 或同为 /run/php/…sock
    • 访问触发错误页时,同时查看 Nginx/Apache 错误日志PHP-FPM 日志,交叉定位是网关连通问题还是脚本/进程问题。

三 常见症状与处理要点

症状 常见原因 快速处理
502 Bad Gateway FPM 未启动、崩溃或通信地址不匹配 systemctl status/restart php-fpm;核对 Nginx fastcgi_pass 与 FPM listen 一致;检查端口/套接字占用
504 Gateway Timeout 脚本执行超时、FPM 进程不足 调整 FPM 的 request_terminate_timeoutpm.max_children;优化慢脚本
空白页 错误未显示、语法错误 临时开启 display_errors = On(仅测试环境);查看 FPM/PHP 错误日志;php -l script.php 语法检查
Primary script unknown Nginx 未正确传递脚本路径 确保 SCRIPT_FILENAME $document_root$fastcgi_script_name;root 路径正确
进程池耗尽 并发超过 pm.max_children 合理提升 pm.max_children 或改为 ondemand/dynamic;优化应用与数据库
Permission denied(套接字) FPM 与 Web 服务器运行用户/组或权限不匹配 www.conf 设置 listen.owner/listen.group 与 Web 服务器一致;必要时调整 listen.mode;重启 FPM
Allowed memory exhausted 脚本内存超限 提升 memory_limit(php.ini);优化代码与查询
日志文件过大 未做日志轮转 配置 logrotate;按需调整 log_level
以上要点与处置方向可结合日志与配置逐项验证与修复。

四 配置与权限检查清单

  • 主配置与进程池
    • 主配置:/etc/php/<version>/fpm/php-fpm.conf(如 error_log、log_level
    • 进程池:/etc/php/<version>/fpm/pool.d/www.conf(如 listen、user/group、pm、request_terminate_timeout、slowlog、rlimit_files
  • 监听方式一致性
    • TCP:listen = 127.0.0.1:9000 ↔ Nginx fastcgi_pass 127.0.0.1:9000
    • Unix Socket:listen = /run/php/php<version>-fpm.sock ↔ Nginx fastcgi_pass unix:/run/php/php<version>-fpm.sock
  • 权限与目录
    • 确保运行用户(如 www-data)对网站目录与日志目录可读写:chown -R www-data:www-data /var/www/html /var/log/php<version>-fpm
    • 套接字目录与文件权限正确,避免因权限导致 13: Permission denied
  • 日志可达
    • 若自定义了 error_log,确认目录存在且 FPM 有写权限;必要时先创建目录并设置属主/权限再重启。

五 进阶排查工具

  • 慢脚本定位:在 www.conf 开启 slowlogrequest_slowlog_timeout,分析耗时调用栈与 SQL。
  • 进程跟踪:对异常退出的 FPM 子进程使用 strace -f -ff -t -d -p <PID> 抓取系统调用,定位卡死/崩溃点。
  • 动态调参与热重启:按需调整 pm 策略与子进程数;使用信号 USR2 进行优雅重启,减少中断时间。

0