怎样排查ubuntu上php-fpm的故障
1. 检查PHP-FPM服务状态
首先确认PHP-FPM服务是否正在运行,使用以下命令查看服务状态:
sudo systemctl status php7.x-fpm(将7.x替换为实际PHP版本,如8.1)。
若服务未运行(显示“inactive (dead)”),尝试启动服务:sudo systemctl start php7.x-fpm;若启动失败,继续下一步排查。
2. 查看PHP-FPM错误日志
错误日志是定位问题的核心依据,通常位于/var/log/php-fpm.log或/var/log/php7.x-fpm.log(7.x为PHP版本)。使用以下命令实时查看最新错误:
sudo tail -f /var/log/php-fpm.log
或过滤特定关键词(如“fatal error”):
sudo grep 'fatal error' /var/log/php-fpm.log
日志中会明确提示配置错误、权限问题、端口冲突等具体原因。
3. 验证配置文件语法
PHP-FPM的主配置文件(/etc/php/7.x/fpm/php-fpm.conf)或池配置文件(/etc/php/7.x/fpm/pool.d/www.conf)可能存在语法错误。使用以下命令测试语法正确性:
sudo php-fpm7.x -t(7.x为PHP版本)。
若输出“Configuration file is valid”,说明语法无误;若报错,根据提示修改对应配置文件并保存。
4. 解决端口/套接字冲突
若PHP-FPM配置为监听TCP端口(默认9000),需检查端口是否被其他进程占用:
sudo netstat -tulnp | grep 9000
或使用ss命令:
sudo ss -tulnp | grep 9000
若端口被占用,可杀死占用进程(sudo kill -9 <
PID>
)或修改PHP-FPM监听端口(编辑www.conf中的listen指令,如listen = 127.0.0.1:9001)。
若配置为Unix套接字(如listen = /run/php/php7.x-fpm.sock),检查套接字文件是否被占用:
sudo lsof /run/php/php7.x-fpm.sock
同样,杀死占用进程或修改套接字路径。
5. 检查文件权限
PHP-FPM进程(通常为www-data用户)需具备访问配置文件、日志文件、网站根目录的权限。常见操作:
- 确保套接字文件目录存在且有正确权限:
sudo mkdir -p /run/php
sudo chown -R www-data:www-data /run/php - 检查池配置中的
user和group设置(www.conf中):
user = www-data
group = www-data - 确保网站根目录(如
/var/www/html)权限正确:
sudo chown -R www-data:www-data /var/www/html
6. 调整进程池配置
若出现“502 Bad Gateway”(进程崩溃)或“pm.max_children reached”(进程池耗尽),需调整进程池参数:
- 编辑
www.conf中的pm.max_children(最大子进程数),根据服务器内存调整(如每进程占用100MB内存,1GB内存可设置为pm.max_children = 10)。 - 修改
pm模式为dynamic(动态调整进程数),并设置pm.start_servers(启动时的进程数)、pm.min_spare_servers(最小空闲进程数)、pm.max_spare_servers(最大空闲进程数),例如:
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
调整后重启服务:sudo systemctl restart php7.x-fpm。
7. 处理扩展加载失败
若日志中出现“Unable to load dynamic library”(无法加载扩展),需检查扩展配置:
- 查看已安装的PHP模块:
php -m。 - 检查
php.ini中的扩展加载行(/etc/php/7.x/fpm/php.ini),注释掉有问题的扩展(如; extension=redis.so)。 - 重新安装有问题的扩展:
sudo apt-get install --reinstall php7.x-redis(以redis为例)。
8. 测试Web服务器与PHP-FPM通信
若出现“502 Bad Gateway”(网关错误),需确认Web服务器(如Nginx)与PHP-FPM的通信配置正确:
- 检查Nginx配置中的
fastcgi_pass指令,确保与PHP-FPM的listen指令一致(如fastcgi_pass unix:/run/php/php7.x-fpm.sock;或fastcgi_pass 127.0.0.1:9000;)。 - 确保Nginx配置中包含
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;(传递脚本路径给PHP-FPM)。
修改后重启Nginx:sudo systemctl restart nginx。
9. 监控系统资源
若出现“Allowed memory exhausted”(内存耗尽)或“Too many open files”(文件描述符过多),需监控系统资源:
- 使用
free -h查看内存使用情况,调整memory_limit(php.ini中,如memory_limit = 256M)。 - 使用
ulimit -n查看文件描述符限制,若需增加,编辑/etc/security/limits.conf,添加:
www-data soft nofile 65535
www-data hard nofile 65535 - 重启系统或重新登录使限制生效。
10. 启用调试模式
若以上步骤无法解决问题,可启用PHP-FPM调试模式,获取更详细的日志:
- 编辑
php-fpm.conf,设置log_level = debug(默认为notice)。 - 重启PHP-FPM:
sudo systemctl restart php7.x-fpm,查看日志中的详细调试信息。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 怎样排查ubuntu上php-fpm的故障
本文地址: https://pptw.com/jishu/742523.html
