网站频繁报502/504?我常用的排查步骤和解决方法


502和504的区别先讲清楚:502是Nginx把请求发给后端(比如PHP FPM、Node服务),后端没响应或者直接挂了;504是后端过了超时时间还没返回结果。两个报错原因不一样,但排查思路差不多。 我遇到502一般按下面的顺序查,不用10分钟就能定位。 第一步:先看后端服务是不是挂了 这是最常见的原因,尤其是PHP网站,90%的502都是PHP FPM进


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,再查这几个地方:

  1. 防火墙是不是把Nginx和后端通信的端口封了,比如本机的9000端口被firewalld拦了;
  2. CDN回源是不是出问题了,直接改hosts访问源站,源站没问题就是CDN节点的问题;
  3. 网站程序是不是死锁了,比如MySQL锁表,所有请求都卡在等数据库返回,超时就报504。
    遇到502别慌,按顺序一步步查,别上来就重装系统重启服务器,大部分都是小问题。

网站被CC攻击?快速识别和缓解方法

网站打开慢先别骂带宽:Nginx访问日志帮你找到真凶

评 论
请登录后再评论