首先确认php-FPM服务是否运行,检查nginx的fastcgi_pass配置与PHP-FPM监听路径是否匹配,确保两者协议一致;接着验证PHP-FPM池配置中listen地址、权限设置正确,重启服务;然后排查文件权限及appArmor限制;最后通过Nginx和PHP-FPM错误日志定位具体原因。

如果您在访问使用 Nginx 和 PHP-FPM 构建的网站时遇到“502 Bad gateway”错误,这通常意味着 Nginx 无法成功将请求转发给 PHP-FPM 处理。该问题常见于 PHP-FPM 服务未运行、配置路径不匹配或进程崩溃等情况。
本文运行环境:Dell Poweredge R750,ubuntu 22.04
一、确认 PHP-FPM 服务是否正在运行
PHP-FPM 是处理 PHP 请求的核心服务,若其未启动或异常终止,Nginx 将无法与之通信,从而导致 502 错误。
1、打开终端并执行以下命令检查 PHP-FPM 服务状态:
sudo systemctl status php-fpm 或 sudo systemctl status php8.1-fpm(根据实际安装版本调整)
2、如果服务未运行,使用以下命令启动服务:
sudo systemctl start php8.1-fpm
3、设置服务开机自启以避免重启后再次失效:
sudo systemctl enable php8.1-fpm
二、检查 Nginx 配置中的 FastCGI 代理设置
Nginx 必须正确指向 PHP-FPM 监听的地址(IP:端口 或 unix socket),否则请求无法被传递。
立即学习“PHP免费学习笔记(深入)”;
1、编辑站点配置文件,通常位于 /etc/nginx/sites-available/default 或 /etc/nginx/conf.d/site.conf
2、查找 location ~ .php$ 块,并确认 fastcgi_pass 的值是否与 PHP-FPM 实际监听方式一致:
若 PHP-FPM 使用 TCP 端口(如 127.0.0.1:9000),则应包含:
fastcgi_pass 127.0.0.1:9000;
若使用 Unix socket(更高效),则应为:
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
3、保存更改后测试 Nginx 配置语法:
sudo nginx -t
4、重新加载 Nginx 使配置生效:
sudo systemctl reload nginx
三、验证 PHP-FPM 池配置文件
PHP-FPM 的每个站点可对应一个池(pool),其定义了监听路径、用户权限和进程数量等关键参数。
1、进入 PHP-FPM 池配置目录:
cd /etc/php/8.1/fpm/pool.d/
2、编辑默认池文件 www.conf,检查 listen 指令是否与 Nginx 中 fastcgi_pass 所指定的路径完全一致。
例如,若 Nginx 使用 socket,则 listen 应为:
listen = /run/php/php8.1-fpm.sock
3、同时确认 socket 文件权限设置正确,确保 Nginx 进程用户(通常是 www-data)有读写权限:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
4、修改后重启 PHP-FPM 服务:
sudo systemctl restart php8.1-fpm
四、检查文件权限与 SElinux/AppArmor 限制
即使服务正常运行,安全模块或错误的文件权限也可能阻止 Nginx 访问 PHP-FPM 资源。
1、确认网站根目录归属正确,推荐设为 www-data 用户:
sudo chown -R www-data:www-data /var/www/html
2、修复目录和文件权限:
sudo find /var/www/html -type d -exec chmod 755 {} ;
sudo find /var/www/html -type f -exec chmod 644 {} ;
3、若系统启用 AppArmor(Ubuntu 默认启用),检查日志是否存在拒绝记录:
sudo dmesg | grep apparmor
4、如有必要,临时禁用 AppArmor 对 PHP-FPM 的策略进行测试:
sudo ln -s /etc/apparmor.d/usr.sbin.php-fpm /etc/apparmor.d/disable/usr.sbin.php-fpm
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.php-fpm
五、查看日志定位具体错误原因
通过分析 Nginx 和 PHP-FPM 的错误日志可以获取最直接的故障线索。
1、查看 Nginx 错误日志内容:
sudo tail -f /var/log/nginx/Error.log
2、观察是否有类似 “connect() failed (111: Connection refused)” 或 “No such file or Directory” 的提示。
3、查看 PHP-FPM 错误日志,通常位于:
sudo tail -f /var/log/php8.1-fpm.log
4、关注日志中是否出现 “Cannot get uid/gid”、“failed to parse configuration” 或子进程频繁崩溃的信息。