502 和 504 有什么区别?怎么排查?
五个经典回答示范
先讲区别:502 Bad Gateway——nginx 收到上游无效响应:后端进程挂了、连接被拒、返回头异常;504 Gateway Timeout——上游在超时时间内没响应:后端慢、队列堆积。排查路径:nginx error_log 看具体错误(connect() failed 是 502 方向、upstream timed out 是 504 方向)→ 检查后端进程存活与端口 → 应用层看慢日志与线程池。
我讲两个真实案例:案例一 502——发布后立即全量 502,error_log 显示 connect() refused,原因是新配置后端端口改了没生效,php-fpm 监听与 nginx 配置不一致;案例二 504——间歇性 504,负载低也发生,最终定位是后端调用外部支付接口无超时设置,对方抖动拖死 worker,整个服务雪崩。两个案例说明:502 多是配置与进程层,504 多是依赖与超时链,先看 error_log 里的具体短语再动手。
资深视角:网关错误的治理在超时体系与容量体系。超时体系——全链路超时预算:客户端到 nginx 到应用到 DB,上游超时必须小于下游总预算,避免无效等待;每层配连接、读、写超时,默认值是事故温床。容量体系——worker 与连接池的排队模型:504 本质是到达率超过服务率,看容量水位与扩容策略,而不是只调大 proxy_read_timeout 掩盖。配套:熔断降级让故障不扩散,健康检查摘除坏节点。
追问『502 但后端进程在』:查监听地址(127.0.0.1 vs 0.0.0.0)、backlog 打满(大量 SYN)、后端返回头超限(大 header 被 nginx 拒绝)、keepalive 超时不对齐;『偶发 504 怎么抓』:error_log 级别调 debug 定位慢在 connect 还是 read,应用侧慢日志并行比对;『怎么快速止血』:重启后端进程池恢复 worker,同时保留一个实例现场取证。
『502 就重启后端,504 就把 nginx 超时调到 300 秒,用户等着呗,总能等到响应,实在不行多加几台 nginx。』——点评:调大超时是把用户的等待换自己的指标好看,还放大雪崩面(worker 全挂在等待上);加 nginx 不解决后端慢。网关错误几乎都指向后端问题,方向搞反白忙。
- 打开 模拟练习,选择「运维/DBA」方向,限时 3 分钟作答本题。
- 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
- 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。
这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。