Linux 上排查 PHP-FPM 错误的实用流程
一 快速定位思路
二 定位步骤与命令
sudo systemctl status php<version>-fpm(是否 active、是否 failed、最近的 journal 报错)sudo journalctl -u php<version>-fpm -f/var/log/php<version>-fpm.log、/var/log/php-fpm.log、/var/log/php-fpm/error.log;若未单独配置,可能写入系统日志(如 /var/log/syslog)。也可在 www.conf 的 error_log 指令查看自定义路径。sudo php-fpm<version> -t(检查主配置与所有包含的 pool.d/*.conf 是否有语法错误)sudo ss -tulnp | grep 9000(如监听 127.0.0.1:9000 被占用,需改 listen 或释放占用)ls -l /run/php/php<version>-fpm.sock(确认存在且权限正确)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;、fastcgi_pass 与 FPM 的 listen 一致(同为 127.0.0.1:9000 或同为 /run/php/…sock)三 常见症状与处理要点
| 症状 | 常见原因 | 快速处理 |
|---|---|---|
| 502 Bad Gateway | FPM 未启动、崩溃或通信地址不匹配 | systemctl status/restart php-fpm;核对 Nginx fastcgi_pass 与 FPM listen 一致;检查端口/套接字占用 |
| 504 Gateway Timeout | 脚本执行超时、FPM 进程不足 | 调整 FPM 的 request_terminate_timeout、pm.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)listen = 127.0.0.1:9000 ↔ Nginx fastcgi_pass 127.0.0.1:9000listen = /run/php/php<version>-fpm.sock ↔ Nginx fastcgi_pass unix:/run/php/php<version>-fpm.sockchown -R www-data:www-data /var/www/html /var/log/php<version>-fpm五 进阶排查工具
www.conf 开启 slowlog 与 request_slowlog_timeout,分析耗时调用栈与 SQL。strace -f -ff -t -d -p <PID> 抓取系统调用,定位卡死/崩溃点。