温馨提示×

Ubuntu PHP-FPM的错误日志怎么分析

小樊
42
2026-01-05 01:49:57
栏目: 编程语言

Ubuntu 上分析 PHP-FPM 错误日志的实用流程


一 定位日志文件与快速查看

  • 常见日志路径
    • PHP-FPM 进程日志:/var/log/php**{version}**-fpm.log 或 /var/log/php-fpm/error.log(按发行版与安装方式不同而异)。
    • PHP 应用错误日志:由 php.ini 的 error_log 决定,常见有 /var/log/php_errors.log;若使用 Nginx,相关错误也可能落在 /var/log/nginx/error.log
  • 快速查看与跟踪
    • 实时跟踪:sudo tail -f /var/log/php**{version}**-fpm.log
    • 分页查看:less +F /var/log/php**{version}**-fpm.log
  • 确认 PHP 错误日志路径与开关
    • 命令行:php -r “echo ini_get(‘error_log’);”
    • 在 php.ini 中确保:log_errors = On,error_log 指向有效路径;生产环境建议 display_errors = Off。

二 读懂日志关键信息

  • 错误级别与含义
    • Parse error:语法错误,脚本无法解析(需立即修复)。
    • Fatal error:致命错误,脚本终止(如调用未定义函数)。
    • Warning/Notice:非致命问题,但提示潜在缺陷或不当用法。
  • 上下文线索
    • 时间戳、进程/池名、脚本文件名与行号:用于快速定位问题代码。
    • 请求信息:如 URI、响应状态(如 500),帮助判断是否为服务器级错误。
    • 性能指标:如 响应时间、内存使用,用于发现性能瓶颈。
  • 与 Web 服务器日志联动
    • 当出现 502/504 等网关错误时,同时查看 Nginx/Apache 错误日志,核对 FastCGI 通信与上游状态。

三 常见错误模式与排查路径

  • 502 Bad Gateway
    • 可能原因:PHP-FPM 未启动/崩溃;Nginx/Apache 与 PHP-FPM 通信地址不匹配(如 listen = 127.0.0.1:9000 与 fastcgi_pass 不一致)。
    • 排查:systemctl status php**{version}**-fpm;核对 listen 与 fastcgi_pass;必要时重启服务。
  • 504 Gateway Timeout
    • 可能原因:脚本执行超时;进程/资源不足。
    • 排查:调整 request_terminate_timeout(或 php.ini 的 max_execution_time);增加 pm.max_children;优化慢脚本。
  • “Primary script unknown”
    • 可能原因:Nginx 未正确传递脚本路径。
    • 排查:确保 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name 且 root 路径正确。
  • 进程池耗尽(pm.max_children reached)
    • 可能原因:并发超过进程上限。
    • 排查:适当提升 pm.max_children;优化应用与并发;必要时切换 pm 策略(static/dynamic)。
  • 权限问题
    • 可能原因:PHP-FPM 运行用户对代码目录无读/执行权限。
    • 排查:chown -R www-data:www-data /path/to/app;chmod -R 755 /path/to/app;核对 listen.owner/group。
  • 内存耗尽(Allowed memory exhausted)
    • 可能原因:脚本内存超限。
    • 排查:提升 php.ini 的 memory_limit;优化代码与查询。

四 配置与工具优化

  • 调整日志级别与路径
    • /etc/php/{version}/fpm/pool.d/www.conf 中设置:
      • php_admin_value[error_log] /var/log/php-fpm/custom_error.log
      • php_admin_flag[log_errors] on
      • error_reporting(如 E_ALL & E_DEPRECATED & E_STRICT)
    • 修改后重启:sudo systemctl restart php**{version}**-fpm
  • 开启慢日志定位性能瓶颈
    • 在 pool 配置中启用:request_slowlog_timeout 与 slowlog,记录执行时间超过阈值的脚本栈,便于优化 SQL/外部调用。
  • 语法校验与配置测试
    • 修改配置后先执行:php-fpm -t(语法检查);再重启服务,避免配置错误导致不可用。
  • 日志轮转与容量控制
    • 使用 logrotate 定期切割 PHP-FPM 日志,防止单个日志过大影响分析与磁盘空间。
  • 动态确认与临时调试
    • 确认 error_log:php -r “echo ini_get(‘error_log’);”
    • 开发环境可临时开启 display_errors 辅助定位,生产环境务必关闭,仅记录日志。

五 高效排查命令清单

  • 实时跟踪与检索
    • 跟踪 FPM 日志:sudo tail -f /var/log/php**{version}**-fpm.log
    • 检索致命错误:grep -i “Fatal” /var/log/php**{version}**-fpm.log
    • 检索慢日志:grep -i “slow” /var/log/php**{version}**-fpm.log(开启慢日志后)
  • 服务与配置
    • 查看状态:systemctl status php**{version}**-fpm
    • 语法检查:php-fpm -t
    • 重启服务:sudo systemctl restart php**{version}**-fpm
  • 权限与资源
    • 修正权限:chown -R www-data:www-data /var/www/html;chmod -R 755 /var/www/html
    • 资源检查:free -m(内存)、df -h(磁盘)

0