1. 定位PHP-FPM错误日志位置
Linux系统中,PHP-FPM错误日志的默认路径通常为/var/log/php-fpm/error.log
或/var/log/php7.x-fpm.log
(7.x
为具体PHP版本号)。部分系统可能将日志分散在/var/log/php-fpm/www-error.log
(虚拟主机错误)或/var/log/php-fpm/access.log
(访问日志)。若路径不确定,可通过以下命令查找:
/etc/php-fpm.conf
)中的error_log
指令;/etc/php/7.x/fpm/pool.d/www.conf
)中的php_admin_value[error_log]
设置;php -i | grep error_log
命令查看全局错误日志路径。2. 实时查看与过滤错误日志
使用tail
命令实时监控错误日志的最新内容(适用于排查正在发生的错误):
sudo tail -f /var/log/php-fpm/error.log
若需筛选特定类型的错误(如“fatal error”“permission denied”),可结合grep
命令:
sudo tail -f /var/log/php-fpm/error.log | grep -E "fatal|permission"
这能快速定位关键错误信息,避免被大量无关日志干扰。
3. 分析常见错误类型及解决方法
502 Bad Gateway(网关错误)
原因:PHP-FPM进程崩溃、未启动,或Nginx/Apache与PHP-FPM的通信配置不一致(如监听地址/端口不匹配)。
解决:
sudo systemctl status php-fpm
,若未运行则启动:sudo systemctl start php-fpm
;www.conf
中的listen
指令)与Web服务器配置一致(如Nginx中的fastcgi_pass
指令)。504 Gateway Timeout(网关超时)
原因:PHP脚本执行时间超过request_terminate_timeout
设置,或PHP-FPM进程资源不足(如pm.max_children
过小)。
解决:
php-fpm.conf
,增加request_terminate_timeout = 300
(单位:秒);pm.max_children
(根据服务器内存计算,如每进程占用100MB内存,1GB内存可设置为pm.max_children = 10
)。Permission Denied(权限拒绝)
原因:PHP-FPM进程用户(如www-data
)无权访问脚本、目录或套接字文件。
解决:
sudo chown -R www-data:www-data /var/www/html
(替换为实际项目路径),sudo chmod -R 755 /var/www/html
;www.conf
中的listen.owner
和listen.group
设置,确保与运行用户一致(如listen.owner = www-data
,listen.group = www-data
)。Memory Exhausted(内存耗尽)
原因:PHP脚本占用内存超过memory_limit
设置(如memory_limit = 128M
)。
解决:
php.ini
,修改memory_limit = 256M
(根据实际需求调整);LIMIT
分页查询数据库)。Primary Script Unknown(主脚本未知)
原因:Nginx未正确传递脚本路径到PHP-FPM(如SCRIPT_FILENAME
参数设置错误)。
解决:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 与PHP-FPM监听地址一致 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
root
指令指向的项目路径是否正确。4. 检查配置文件语法
在修改PHP-FPM配置文件(如php-fpm.conf
或www.conf
)后,需验证语法是否正确,避免因配置错误导致服务无法启动:
sudo php-fpm7.x -t # 替换为实际PHP版本号,如php-fpm8.2
若输出Configuration file is valid
则表示语法正确;若提示错误(如“directive not found”),需根据提示修正配置文件中的错误。
5. 调试与高级排查
php-fpm.conf
中的log_level
为debug
(默认为notice
),重启服务后查看更详细的日志信息:log_level = debug sudo systemctl restart php-fpm
strace
命令跟踪进程的系统调用,定位崩溃原因:sudo strace -f -p $(pgrep php-fpm) # pgrep获取PHP-FPM进程ID
top
、htop
或df -h
命令查看CPU、内存、磁盘空间是否充足,资源不足可能导致PHP-FPM进程被系统杀死。6. 重启PHP-FPM服务
修改配置文件或修复问题后,需重启PHP-FPM服务使更改生效:
sudo systemctl restart php-fpm # 大多数现代Linux系统
或使用传统service
命令:
sudo service php-fpm restart # 旧版系统