«

Nginx 502 Bad Gateway常见原因和解决办法

时间:2026-10-9 07:40     作者:emer     分类: 无


前言

网站突然打不开了,浏览器显示"502 Bad Gateway"?这是Nginx最常见的报错之一。本文讲502是什么意思、常见原因、怎么排查和解决。

一、502是什么意思

502 Bad Gateway = Nginx作为代理,从后端服务器(比如PHP-FPM)拿不到正常的响应。

简单说:Nginx收到了你的请求,然后去问后端"给我数据",后端没理它或者报错了,Nginx就返回502。

二、常见原因

原因1:PHP-FPM没启动

后端PHP服务没跑,Nginx找不到人。

检查:

ps aux | grep php-fpm

没输出就是没启动。

启动:

systemctl start php-fpm

或者:

service php-fpm start

原因2:PHP-FPM端口不对

Nginx配置里写的PHP-FPM地址不对。

比如:

fastcgi_pass 127.0.0.1:9000;

但PHP-FPM实际监听的是 /tmp/php-cgi.sock。

检查PHP-FPM监听:

netstat -tlnp | grep php-fpm

或者:

ss -tlnp | grep php-fpm

原因3:PHP代码报错

PHP代码有致命错误,直接挂了。

看PHP错误日志:

tail -f /var/log/php-fpm/www-error.log

或者:

tail -f /var/log/php/error.log

原因4:PHP超时了

程序跑太慢,超过Nginx或PHP-FPM的超时时间。

改Nginx超时:

fastcgi_read_timeout 300;

改PHP-FPM超时:

request_terminate_timeout = 300

原因5:PHP-FPM进程数不够

请求太多,PHP-FPM忙不过来。

看进程数:

ps aux | grep php-fpm | wc -l

改配置:

pm.max_children = 50
pm.start_servers = 20

原因6:内存不够了

PHP进程占满内存,系统把PHP杀了。

看内存:

free -h

看dmesg:

dmesg | grep oom

三、排查步骤

第一步:看Nginx错误日志

tail -f /var/log/nginx/error.log

常见报错:

报错 含义
connect() failed (111: Connection refused) PHP-FPM没启动
Primary script unknown 文件路径不对
upstream timed out PHP超时了
recv() failed (104: Connection reset by peer) PHP-FPM挂了

第二步:看PHP-FPM状态

systemctl status php-fpm

看是不是running。

第三步:看PHP错误日志

tail -f /var/log/php-fpm/www-error.log

看PHP代码有没有报错。

第四步:看系统资源

top
free -h
df -h

看CPU、内存、磁盘够不够。

四、常见解决方法

方法1:重启PHP-FPM

systemctl restart php-fpm

方法2:改Nginx配置

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    # 超时时间
    fastcgi_read_timeout 300;
    fastcgi_send_timeout 300;
}

方法3:改PHP-FPM进程数

pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

改完重启:

systemctl restart php-fpm

方法4:开PHP错误显示

display_errors = On
error_reporting = E_ALL

五、常见坑

坑1:只重启Nginx,不重启PHP-FPM

502是后端的问题,重启Nginx没用。

正确: 重启PHP-FPM。

坑2:文件路径不对

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

错! 应该是:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

坑3:PHP-FPM版本不对

装了PHP7但Nginx还找PHP5的sock。

检查:

ls -la /var/run/php/

坑4:权限问题

PHP-FPM没权限读网站目录的文件。

解决:

chown -R www:www /www/wwwroot/

总结

记住:

  1. 502 = Nginx拿不到后端响应
  2. 先看Nginx错误日志
  3. 再看PHP-F启没启动
  4. 然后看PHP代码有没有报错
  5. 最后看系统资源够不够

最快排查:

tail -f /var/log/nginx/error.log
systemctl status php-fpm

遇到问题加QQ23979811 协助处理

标签: PHP-FPM Nginx 运维 502 Bad Gateway 报错排查