502 Bad Gateway 表示 Nginx 无法连接 PHP-FPM,常见原因包括 php-fpm 未运行、listen 地址与 fastcgi_pass 不匹配、socket 权限不足或配置错误;需逐项检查进程状态、监听配置、日志报错及扩展冲突。

502 Bad Gateway 不是 PHP 脚本执行超时(那是 504),而是 Nginx 根本没连上 PHP-FPM 进程——连接被拒绝、进程崩溃、端口不通或响应头过大都可能触发。phpenv 环境下更需注意 PATH 和 socket 路径是否匹配。
确认 php-fpm 是否在运行且监听正确地址
phpenv 切换 PHP 版本后,php-fpm 服务未必自动启动,也未必监听你 Nginx 配置中写的地址。
- 运行
ps aux | grep php-fpm,看对应版本的 master 进程是否存在;不存在就手动启动:~/.phpenv/versions/8.1.27/sbin/php-fpm -c ~/.phpenv/versions/8.1.27/etc/php.ini -y ~/.phpenv/versions/8.1.27/etc/php-fpm.conf - 检查
php-fpm.conf中listen值:如果是127.0.0.1:9000,Nginx 的fastcgi_pass必须写成127.0.0.1:9000;如果是unix:/tmp/php-fpm.sock,路径必须完全一致(注意权限和存在性) - 用
ss -tuln | grep :9000或ls -l /tmp/php-fpm.sock验证监听状态
检查 fastcgi_pass 地址与 php-fpm listen 是否严格匹配
Nginx 报 502 最常见原因就是这个 mismatch——尤其 phpenv 下多个 PHP 版本共存时,容易配错版本对应的 socket 或端口。
- 打开站点 Nginx 配置(宝塔用户在【网站】→【设置】→【配置文件】),找到
location ~ \.php块内的fastcgi_pass行 - 对比它和当前 phpenv 激活版本的
php-fpm.conf中listen值:字符级完全一致(含空格、斜杠方向、IP 写法) - 若用 Unix socket,确保 Nginx worker 进程用户(通常是
www)对 socket 文件有读写权限:chown www:www /tmp/php-fpm.sock && chmod 660 /tmp/php-fpm.sock
排查 php-fpm 启动失败的静默错误
phpenv 下 php-fpm 启动失败往往不报错,只退出,导致 Nginx 连不上。必须看日志才能定位。
立即学习“PHP免费学习笔记(深入)”;
- 先查
php-fpm错误日志:配置里error_log指向哪,就去看那个文件(常见于~/.phpenv/versions/x.x.x/var/log/php-fpm.log) - 典型报错:
unable to bind listening socket for address '/tmp/php-fpm.sock': Address already in use(端口/socket 被占)、failed to load configuration file(ini 路径错)、Unknown pool section(fpm.d/*.conf 格式错误) - 临时加调试:启动时加
-F -d log_level=debug,例如:php-fpm -F -c php.ini -y php-fpm.conf -d log_level=debug
禁用可能导致 502 的扩展或配置项
某些扩展(如 xdebug、opcache.restrict_api)在 phpenv 多版本切换时残留配置,会导致 php-fpm master 进程启动即崩。
- 进
~/.phpenv/versions/x.x.x/etc/php.ini,注释掉zend_extension=xdebug.so行再试 - 检查
opcache.enable是否为On,但opcache.restrict_api指向了不存在路径(会直接拒启 fpm) - 删掉
~/.phpenv/versions/x.x.x/etc/php-fpm.d/*.conf中非默认池配置,用最简[www]池测试
502 的根因永远在「连接建立前」,不是脚本跑太久——所以别急着调 max_execution_time 或 fastcgi_read_timeout。先让 Nginx 和 php-fpm 能握手成功,再谈超时优化。



















