502错误主因是php-fpm未响应,源于服务未启动、worker占满、path_info解析失败、超时或缓冲区不足、日志阻塞及进程模型不当;需依次检查状态、连接数、nginx配置、超时参数、上传限制、日志级别与fpm进程模式。

ThinkPHP部署后报502,不是代码写错了,而是Nginx把请求转给了PHP-FPM,但PHP-FPM没回有效响应——它卡在了PATH_INFO解析、进程不足或通信超时这三关里。
先看PHP-FPM有没有真活着
执行systemctl status php-fpm,如果显示inactive (dead),服务根本没起来;如果状态是active但访问仍502,再跑netstat -anpo | grep php-fpm | wc -l,结果接近pm.max_children(比如设了50却看到48),说明worker全被占满,新请求直接排队丢弃。
重启命令:systemctl restart php-fpm。若重启失败,去/var/log/php-fpm/www-error.log查unable to fork或rlimit类报错——大概率是系统进程数限制太死,要改/etc/security/limits.conf里的nproc值。
PATH_INFO传不进去,TP就收不到路由
ThinkPHP靠PATH_INFO拆URL(如/index/user/list → index.php + /user/list),但Nginx默认不传这个变量。常见错误配置:location ~ \.php(.*)?$里用$1捕获PATH_INFO,结果匹配失败导致$1为空,PHP-FPM拿到空路径直接退出,Nginx只好甩出502。
- 推荐改用try_files方式(宝塔、LNMP一键包都适用):
删掉旧的PHP正则块,在server里加这两段:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
}
这样路由参数走?s=user/list进$_SERVER['QUERY_STRING'],TP自己解析,彻底绕开Nginx路径歧义。
超时和缓冲区小,大点的请求直接被掐断
导出Excel、查大数据表、上传文件这些操作稍慢,Nginx等不及就主动断连,返回502。
- Nginx侧:在server或location里加fastcgi_read_timeout 300、fastcgi_buffer_size 32k、fastcgi_buffers 8 32k
- PHP-FPM侧:在www.conf里设request_terminate_timeout = 300、request_slowlog_timeout = 10
- 别漏掉上传场景:Nginx加client_max_body_size 100M,PHP里upload_max_filesize和post_max_size也要同步调大
日志和并发设置拖垮整条链路
高并发下,ThinkPHP默认同步写日志会堵住请求。哪怕只是记一条warning,磁盘IO一慢,整个响应就被卡住,Nginx等超时就扔502。
- 生产环境关掉debug日志:'level' => ['error', 'notice']
- 日志驱动换为Socket(发到rsyslog)或接入Swoole异步队列
- PHP-FPM进程模型别用dynamic,改static或ondemand;pm.max_children按内存算(每个worker约20–30MB),16GB机器建议≤256
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











