Ubuntu下PHP-FPM错误日志分析与排查指南
PHP-FPM的错误日志默认存储路径因Ubuntu版本和PHP版本略有差异,常见位置包括:
/var/log/php-fpm.log/var/log/php7.x-fpm.log(如php7.4-fpm.log、php8.1-fpm.log,x为具体PHP版本号)/var/log/php-fpm/error.log或/var/log/php-fpm/www-error.log。ls /var/log/php-fpm/命令查看目录下具体日志文件,或通过sudo find /var/log -name "*php-fpm*log"命令全局搜索。使用tail -f命令实时查看日志文件的新增内容,便于快速定位正在发生的错误:
sudo tail -f /var/log/php-fpm.log(替换为实际日志路径)。
通过grep命令筛选关键错误,提升分析效率:
sudo grep "PHP Fatal error" /var/log/php-fpm.logsudo grep "PHP Warning" /var/log/php-fpm.logsudo grep "PHP Notice" /var/log/php-fpm.logsudo grep "child exited on signal" /var/log/php-fpm.log。表现:脚本无法继续执行,常见于未定义函数、类或语法严重错误。
示例:PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/script.php:12
含义:脚本第12行调用了未定义的函数foo(),可能原因包括函数名拼写错误、未引入对应文件或扩展未加载。
表现:脚本继续执行但提示潜在问题,常见于文件/目录不存在、类型转换问题。
示例:PHP Warning: include(/var/www/inc/config.php): failed to open stream: No such file or directory in /var/www/index.php:5
含义:config.php文件不存在,需检查文件路径或权限。
表现:提示运行时小问题,通常不影响脚本执行,但可能隐藏逻辑错误。
示例:PHP Notice: Undefined variable: username in /var/www/login.php:20
含义:使用了未定义的变量$username,需检查变量初始化逻辑。
表现:日志中出现child exited on signal 7 (SIGBUS)或Segmentation fault,进程突然终止。
含义:通常因内存访问违规(如非法指针操作、扩展bug)导致,需检查代码或扩展兼容性。
表现:Nginx/Apache返回502错误,常见于PHP-FPM未启动或通信失败。
含义:Web服务器无法连接到PHP-FPM进程,需检查PHP-FPM服务状态(systemctl status php7.x-fpm)及监听地址(listen配置)。
表现:请求超时报错,页面长时间无响应。
含义:PHP脚本执行时间超过request_terminate_timeout设置(默认30秒),或PHP-FPM进程数不足(pm.max_children过小)。
sudo systemctl status php7.x-fpm(若未运行,执行sudo systemctl start php7.x-fpm)。journalctl -xe | grep php-fpm查看系统日志,定位具体原因(如配置错误、端口冲突)。表现:日志中出现Address already in use或socket already in use。
解决:
sudo netstat -tulnp | grep 9000(默认端口9000);sudo lsof /run/php/php7.x-fpm.sock;sudo kill -9 <PID>)或修改PHP-FPM监听地址(编辑/etc/php/7.x/fpm/pool.d/www.conf中的listen配置,如改为127.0.0.1:9001)。表现:日志中出现Permission denied,常见于套接字文件或脚本目录无法访问。
解决:
sudo mkdir -p /run/php && sudo chown -R www-data:www-data /run/php(www-data为PHP-FPM默认用户);www.conf中的user/group设置,确保与Web服务器用户一致(如Nginx通常为www-data)。表现:日志中出现Unable to create or open pid file或pm.max_children reached(进程池耗尽)。
解决:
/etc/php/7.x/fpm/php-fpm.conf,调整process.max(如设为200);pm配置:将pm = static改为pm = dynamic,并根据服务器内存调整pm.max_children(如每GB内存分配10-20个进程)。表现:日志中出现Unable to load dynamic library 'xxx.so'。
解决:
php -m;php.ini中的扩展行未被注释(如extension=xxx.so);sudo apt-get install --reinstall php7.x-xxx(如php7.4-mysql)。www.conf中添加slowlog = /var/log/php-fpm/slow.log和request_slowlog_timeout = 5s(记录执行超过5秒的脚本),便于性能调优。logrotate防止日志过大,编辑/etc/logrotate.d/php-fpm,添加如下内容:/var/log/php-fpm.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload php7.x-fpm > /dev/null 2>&1 || true
    endscript
}
tail -f或日志分析工具(如ELK、Graylog)实时监控错误日志,及时发现潜在问题。