502和504的区别先讲清楚:502是Nginx把请求发给后端(比如PHP-FPM、Node服务),后端没响应或者直接挂了;504是后端过了超时时间还没返回结果。两个报错原因不一样,但排查思路差不多。
我遇到502一般按下面的顺序查,不用10分钟就能定位。
第一步:先看后端服务是不是挂了
这是最常见的原因,尤其是PHP网站,90%的502都是PHP-FPM进程挂了或者跑满了。
先看PHP-FPM状态:
systemctl status php-fpm-82 # 改成你自己的PHP版本,比如74、81、82
如果显示inactive或者failed,直接重启就行:
systemctl restart php-fpm-82
如果经常挂,别光重启,去看PHP-FPM的错误日志,一般是pm.max_children设太小了,请求多了进程不够用,调大一点就行。
如果是Node或者Java服务,同样用systemctl status看服务状态,看是不是内存溢出崩了。
第二步:看是不是服务器资源跑满了
服务没挂的话,敲个top命令看CPU和内存占用:
- 如果CPU占满100%,要么是被CC攻击了,要么是某个SQL查询写崩了,要么是定时任务在跑大计算。
- 如果内存占满了,看free -h,是不是MySQL或者PHP把内存吃满了触发了OOM,系统自动杀了进程。
- 再看磁盘是不是满了:df -h,磁盘满了服务写不进去日志缓存,也会报502,这种情况清理下日志或者没用的文件就好。
我之前遇到过一次,就是日志文件把磁盘占满了,Nginx写不了缓存,所有请求全报502,清完日志立刻好。
第三步:看Nginx和后端的配置是不是不匹配
比如Nginx里配的fastcgi_pass端口和PHP-FPM监听的端口不一样,也会直接502。
检查PHP-FPM的www.conf里的listen参数,是/run/php-fpm.sock还是127.0.0.1:9000,和Nginx站点配置里的fastcgi_pass必须完全一致。
还有超时时间的问题,504报错基本都是超时:如果是做导出、生成报表这种耗时操作,Nginx默认的60秒超时不够,调大proxy_read_timeout和fastcgi_read_timeout就行,但别调太大,容易把服务拖垮。
少见的几个原因
如果上面都没问题,还报502,再查这几个地方:
- 防火墙是不是把Nginx和后端通信的端口封了,比如本机的9000端口被firewalld拦了;
- CDN回源是不是出问题了,直接改hosts访问源站,源站没问题就是CDN节点的问题;
- 网站程序是不是死锁了,比如MySQL锁表,所有请求都卡在等数据库返回,超时就报504。
遇到502别慌,按顺序一步步查,别上来就重装系统重启服务器,大部分都是小问题。





