温馨提示×

PHP-FPM在Linux中的日志管理

小樊
42
2026-01-08 16:39:16
栏目: 编程语言

PHP-FPM 在 Linux 中的日志管理

一 日志类型与典型路径

  • PHP-FPM 的日志分为两类:
    1. FPM 自身日志(进程、告警、启动停止等),由全局配置 error_loglog_level 控制;
    2. 池级日志(请求级错误、慢请求、访问日志),由各个 pool 配置(如 www.conf)中的 error_log、access.log、slowlog、request_slowlog_timeout 控制。
  • 常见路径与差异:
    • FPM 全局错误日志:常见为 /var/log/php-fpm.log,也可能在 /var/log/php-fpm/error.log/run/php-fpm/*.log(如 /run/php-fpm/www-error.log)。
    • 池级错误日志:通常在 /var/log/php-fpm/*.log/var/log/php-fpm/www-error.log
    • 访问日志:若启用,常见为 /var/log/php-fpm/access.log
    • 慢日志:若启用,常见为 /var/log/php-fpm/*.slow.log
  • 注意:在 Nginx + PHP-FPM 架构下,PHP 脚本错误不会进入 Nginx error_log,应查看 PHP-FPM 的错误日志 与(若启用)慢日志

二 关键配置项与推荐值

  • 全局配置(如 /etc/php-fpm.conf/etc/php/{version}/fpm/php-fpm.conf):
    • error_log:建议设置为 /var/log/php-fpm/error.log(确保目录存在且可写)。
    • log_level:建议生产环境设为 warning/error,调试阶段可设为 notice/debug
  • 池级配置(如 /etc/php-fpm.d/www.conf/etc/php/{version}/fpm/pool.d/www.conf):
    • php_admin_value[error_log]:如 /var/log/php-fpm/www-error.log
    • php_admin_flag[log_errors] = on:开启池内错误记录。
    • catch_workers_output = yes:将 stdout/stderr 重定向到 FPM 错误日志,便于捕获脚本输出与错误。
    • 访问日志(可选):access.log = /var/log/php-fpm/access.log
    • 慢日志:slowlog = /var/log/php-fpm/www-slow.logrequest_slowlog_timeout = 3s(按需调整阈值)。
  • PHP 层面(如 php.ini):
    • log_errors = Onerror_reporting = E_ALLdisplay_errors = Off(生产环境不显示错误到页面)。
    • error_log = /var/log/php_errors.log(若希望脚本错误单独记录)。
  • 修改后需重启服务:如 systemctl restart php-fpmsystemctl restart php{version}-fpm

三 查看与排查

  • 实时查看:
    • FPM 错误日志:tail -f /var/log/php-fpm/error.log
    • 慢日志:tail -f /var/log/php-fpm/www-slow.log
    • 全部 FPM 日志:tail -f /var/log/php-fpm/*.log
  • 定位配置与路径:
    • 查看 /etc/php-fpm.d/www.conf/etc/php/{version}/fpm/pool.d/www.conf 中的 error_log、access.log、slowlog 等指令;
    • 若不确定日志位置,可用 grep -r “error_log” /etc/phpfind / -type f -name “error_log” 搜索;
    • Nginx + FPM 场景,500 错误细节通常在 FPM 错误日志 而非 Nginx error_log

四 日志轮转与清理

  • 使用 logrotate 管理 FPM 日志(创建 /etc/logrotate.d/php-fpm):
    • 示例:
      /var/log/php-fpm/*.log {
          daily
          missingok
          rotate 7
          compress
          notifempty
          create 0640 root adm
      }
      
    • 手动测试:logrotate -f /etc/logrotate.d/php-fpm
  • 若使用 systemd 管理的 FPM,可在 postrotate 中执行 /usr/sbin/php-fpm -k(发送 USR1 触发日志重新打开),示例:
    /var/log/php-fpm.log {
        daily
        rotate 10
        compress
        missingok
        notifempty
        create 0640 root adm
        postrotate
            /usr/sbin/php-fpm -k
        endscript
    }
    
  • 清理策略:除 logrotate 外,也可按需用 cron 清理超期日志(如保留 7 天):
    0 0 * * * find /var/log/php-fpm -type f -name "*.log" -mtime +7 -delete
    
  • 建议为日志目录设置合适权限(如 /var/log/php-fpm 属主 root:adm,文件权限 0640),并确保 logrotate 定时任务已启用。

五 进阶建议

  • 集中式日志:将 PHP-FPM 日志通过 rsyslog/syslog-ngFilebeat 发送到 ELK/Graylog/Splunk,便于检索、告警与可视化。
  • 性能与噪声控制:生产环境将 log_level 设为 warning/error,仅在排障时临时提升;按需开启 catch_workers_output慢日志,避免过多日志影响性能。
  • 多实例与多版本:不同 poolPHP 版本 使用独立日志文件与目录,命名清晰(如 www-error.log、api-error.log),便于隔离与审计。

0