Linux中PHP-FPM日志分析指南
PHP-FPM的日志文件路径取决于Linux发行版和具体配置,常见位置包括:
/var/log/php-fpm/error.log、/var/log/php-fpm/www-error.log 或 /var/log/php7.x-fpm.log(x为PHP版本号,如7.4、8.2);/var/log/php-fpm/access.log(需手动开启,默认可能未启用);/var/log/php-fpm/www-slow.log(需配置后生成)。php-fpm.conf(主配置文件)或www.conf(pool配置文件,通常位于/etc/php/{version}/fpm/pool.d/)中的error_log、access.log、slowlog参数确认具体路径。使用tail -f命令实时跟踪日志文件的新增内容,便于快速发现近期错误:
sudo tail -f /var/log/php-fpm/error.log # 实时查看错误日志
sudo tail -f /var/log/php-fpm/access.log # 实时查看访问日志(需开启)
通过grep命令筛选关键错误信息,缩小排查范围:
grep 'error' /var/log/php-fpm/error.log # 查找包含“error”的行
grep 'warning' /var/log/php-fpm/error.log # 查找包含“warning”的行
grep 'PHP Fatal error' /var/log/php-fpm/error.log # 查找致命错误
grep '502' /var/log/nginx/error.log # 结合Nginx日志查找502错误(常见于PHP-FPM通信问题)
结合sort、uniq命令统计重复出现的错误,快速定位高频问题:
grep 'Permission denied' /var/log/php-fpm/error.log | sort | uniq -c | sort -rn # 统计权限被拒绝的次数(降序排列)
grep '/api/orders' /var/log/php-fpm/access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -rn | head -10 # 找出访问/api/orders的前10个IP地址
慢日志记录了处理时间超过阈值的请求,帮助定位性能瓶颈。需先在www.conf中开启慢日志:
slowlog = /var/log/php-fpm/www-slow.log # 慢日志文件路径
slowlog_threshold = 1000 # 慢请求阈值(单位:微秒,1000微秒=1毫秒)
重启PHP-FPM后,使用以下命令分析慢日志(找出执行时间最长的脚本):
sudo tail -f /var/log/php-fpm/www-slow.log # 实时查看慢日志
cat /var/log/php-fpm/www-slow.log | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 # 统计慢脚本出现次数(降序排列)
原因:PHP-FPM进程崩溃或未启动;Nginx/Apache与PHP-FPM通信失败(如监听地址/端口不一致)。
日志分析要点:
fastcgi_pass指令是否与PHP-FPM的listen指令一致(如fastcgi_pass 127.0.0.1:9000;对应listen = 127.0.0.1:9000)。原因:PHP脚本执行超时;PHP-FPM资源不足(如pm.max_children过小,无法处理并发请求)。
日志分析要点:
www.conf中的request_terminate_timeout(脚本执行超时时间,默认30秒)和pm.max_children(最大子进程数,根据服务器内存调整,如每进程占用100MB内存,1GB内存可设置为10)参数。原因:PHP-FPM进程用户(如www-data)无权访问脚本或目录。
日志分析要点:
chown -R www-data:www-data /var/www/html)和所属组,以及www.conf中的listen.owner、listen.group(Unix socket权限)设置。原因:脚本内存超出memory_limit限制(如memory_limit = 128M,但脚本使用了256M内存)。
日志分析要点:
php.ini中的memory_limit参数(建议根据脚本需求调整,如256M或512M),并结合top、htop命令查看PHP-FPM进程的内存使用情况。原因:并发请求超过pm.max_children设置,导致新请求排队或拒绝。
日志分析要点:
www.conf中的pm.max_children参数(如1GB内存可设置为10-20,需预留系统内存),以及pm.mode(建议使用dynamic模式,动态调整进程数)。通过grep、awk、sort、uniq等命令的组合,可实现基础的日志过滤、统计和排序,适用于快速排查简单问题(如上述示例)。
适用于大规模日志存储、实时分析和可视化,支持全文搜索、趋势图表、告警等功能,帮助快速定位复杂问题(如分布式系统的性能瓶颈)。
商业日志分析工具,提供强大的搜索、分析和可视化功能,支持自定义仪表盘和告警,适用于企业级环境。
开源日志管理工具,支持集中式日志收集、分析和告警,功能类似Splunk但成本更低,适用于中小型企业。