小皮面板出现 Nginx 502,问题不在 Nginx 本身,而在它连不上后端:绝大多数情况是 PHP-FPM(FastCGI 进程管理器,负责执行 PHP 脚本)没启动、fastcgi_pass 指向的地址或端口与 PHP-FPM 实际监听的地址不一致,或者进程池被并发请求占满。按「先看 error.log 关键字 → 查 PHP-FPM 进程与监听 → 核对 fastcgi_pass → 查进程池和内存」这四步排查,10 分钟内可以定位 90% 的 502。
第一步应该看哪个日志,日志里的哪句话能直接定位 502?
结论:Nginx 的 error_log 是排查 502 最快入手的地方,它会写明上游地址和失败原因。
Linux 版小皮面板的日志在 /www/server/nginx/logs/error.log,Windows 版(phpStudy V8)在安装目录下的 Extensions\Nginx1.xx\logs\error.log,面板「网站 → 日志」里也能直接看。执行 tail -f /www/server/nginx/logs/error.log,再刷新一次报错页面,重点抓三种关键字符串:
connect() failed (111: Connection refused) while connecting to upstream:后端根本没有监听,原因是 PHP-FPM 没启动,或者端口和 socket 路径不对。
upstream prematurely closed connection:连接建立后 PHP 进程中途退出,原因是进程崩溃、内存不足(OOM),或者执行超时。
Permission denied 或 (13: Permission denied):使用 unix socket 时权限不正确。
拿到这句日志后,再往下查,不要盲目修改配置。
怎么确认 PHP-FPM 到底在不在运行?
结论:先用进程和监听端口两个证据确认后端存活,再谈其他配置。
Linux 版执行 ps aux | grep php-fpm,有 master 和 worker 进程就说明进程存在;再看监听,ss -lntp | grep 9000 查 TCP,或 ls -l /tmp/php-cgi-74.sock 查 socket(74 是 PHP 版本号,实际按你的版本替换)。没有进程就在面板「软件商店 → PHP」里启动,或执行 /etc/init.d/php-fpm-74 start。
Windows 版打开任务管理器,看 php-cgi.exe 进程数量;进程为 0 说明 PHP 服务停了,在面板首页点 PHP 版本旁的「启动」。同时用 netstat -ano | findstr :9000 确认端口有监听。
fastcgi_pass 和 PHP-FPM 的 listen 对不上怎么办?
结论:这是切换 PHP 版本后最常见的 502 原因,Nginx 还指着旧版本的 socket。
小皮面板切换 PHP 版本时,站点配置里往往残留旧路径,例如 site.conf 中写 fastcgi_pass unix:/tmp/php-cgi-72.sock;,而实际运行的是 PHP 7.4,socket 是 php-cgi-74.sock。修改方法:打开站点配置文件,把 fastcgi_pass 改成与 PHP-FPM 的 listen 完全一致(在 /www/server/php/74/etc/php-fpm.conf 里查看),或改用面板生成的 include enable-php-74.conf;。改完必须 nginx -t 校验通过后再 nginx -s reload。
PHP-FPM 进程池爆满导致的 502 怎么调?
结论:日志里出现 server reached pm.max_children setting (5), consider raising it 就是进程池被占满,请求排队到超时后被 Nginx 判为 502。
打开 php-fpm.conf 的 pool 段,按内存倒推 pm.max_children:单个 PHP 进程常驻内存按 30–50MB 估算,2GB 内存的机器设 30–40 较稳,4GB 可设 60–80。同时把 pm.max_requests 设为 500,让 worker 定期回收,避免内存泄漏累积。Windows 版没有 pm 参数,对应的是面板「PHP 设置 → php-cgi 进程数」,默认值偏低,网站并发上来后同样会 502,调到 20–30 再观察。
上传文件或长任务报 502 是超时问题吗?
结论:是的,FastCGI 超时和请求体上限是另一类高发 502。
在 Nginx 站点配置中把 fastcgi_read_timeout 60s 调到 300s,client_max_body_size 从默认 1m 调到 50m;PHP 侧同步把 max_execution_time 设为 300、upload_max_filesize 设为 50M、post_max_size 设为 55M,三者的值必须满足 post_max_size ≥ upload_max_filesize。改完重启 PHP-FPM 与 Nginx,否则 php.ini 不生效。
一次完整的自检清单
按顺序执行:tail -100 error.log 抓关键行 → ps aux | grep php-fpm 确认进程 → ss -lntp 确认监听地址 → 对比站点 fastcgi_pass 与 php-fpm.conf 的 listen → 查 /www/server/php/74/var/log/php-fpm.log 有无 OOM 或 pm.max_children 警告 → nginx -t && nginx -s reload。若日志显示 Nginx 反代到 Node、Java 等上游,同样先确认上游服务端口存活,再查超时设置,排查逻辑一致。
总结:502 代表网关找不到能用的后端,不再表示网站坏掉。先看 error_log 报的是 Connection refused、prematurely closed 还是 Permission denied,分别对应「服务没起」「进程崩了或池满」「socket 权限」,再针对性修改 fastcgi_pass、pm.max_children 和超时参数,每次改完用 nginx -t 校验后 reload,避免引入新问题。