502错误本质是nginx无法连接php-fpm,需依次确认php-fpm进程真实运行(含master与worker)、监听方式(tcp或socket)与fastcgi_pass严格匹配、script_filename路径正确、超时参数两端对齐、socket权限及用户组一致,并紧盯nginx错误日志定位根本原因。

nginx 和 php-fpm 配合不是“装上就能跑”,关键在通信链路打通、路径对得准、资源扛得住。502 和 504 错误背后,往往只是一个小配置偏差或一个没起的进程。
确认 php-fpm 进程真实运行中
服务名正常 ≠ 进程在跑。systemctl status php8.1-fpm 可能显示 active,但实际 worker 没起来。
- 用 ps aux | grep php-fpm 看是否有 master 和至少一个 www pool 的 worker 进程
- 检查监听方式:netstat -lnp | grep :9000(TCP)或 ls -l /run/php/php8.1-fpm.sock(Unix socket)
- 若用多版本 PHP,确保 nginx 配置里 fastcgi_pass 指向的 socket 文件名或端口与 php-fpm 实际 listen 一致
fastcgi_pass 与 SCRIPT_FILENAME 必须严丝合缝
nginx 把请求发给谁、PHP 执行哪个文件——这两处写错,一个报 502,一个报 “No input file specified”。
- 如果 php-fpm listen = /run/php/php8.1-fpm.sock,nginx 就必须写:fastcgi_pass unix:/run/php/php8.1-fpm.sock
- 如果 php-fpm listen = 127.0.0.1:9000,nginx 就得写:fastcgi_pass 127.0.0.1:9000
- SCRIPT_FILENAME 推荐显式拼接:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;若 location 用了 alias,则不能依赖 $document_root,应写死路径,如 /var/www/example.com$fastcgi_script_name
超时和并发配置要两端对齐
504 不是连不上,是等太久;502 常因 worker 全忙或直接崩了。别只调 nginx,php-fpm 的池子也得配合理。
- nginx 中设 fastcgi_read_timeout 300,php-fpm pool 里就得同步设 request_terminate_timeout = 300
- web 服务推荐用 pm = dynamic,按 CPU 核数设 pm.start_servers(如 4 核 → 8),再配好 pm.min_spare_servers 和 pm.max_spare_servers
- 算 pm.max_children:实测单进程 RSS × 1.3 × max_children ≤ 可用内存 × 0.8;比如单进程占 35MB,4GB 内存服务器建议设 90 左右
权限与日志是排障第一现场
很多问题表面是 502,实际是 socket 文件不可读、PHP 脚本无执行权、或 nginx 用户根本进不了网站目录。
- 确认 php-fpm pool 的 user 和 group(如 www-data)与 nginx worker 进程用户一致
- 检查 socket 文件权限:ls -l /run/php/php8.1-fpm.sock,应允许 nginx 用户读写
- 紧盯 /var/log/nginx/error.log,它比 access.log 更早暴露连接失败、路径错误、超时等细节
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











