简介
- 502 响应码
- 504 响应码
- 499 响应码
常见错误返回码解释
502: 网关错误(Bad Gateway)
本质: nginx 和上游 server 的网络断开了, 即 TCP 会话不能建立。
注意区分 2 种情况
一:nginx 不等待 TCP 连接超时时间, 立即响应 502
为什么不等待就判定超时?
因为已经可以明确知道对方不能访问, 所以不需要等待超时, 会忽略 proxy_connect_timeout 的配置;
哪些场景是明确知道对方不能访问的?两种场景
-
主机还在, 但服务不在;
即主机的 IP 能通, 但服务挂了, 端口不能通。
这时访问主机上此无监听服务的端口, 操作系统会直接响应 RESET 包, 发起方就知道了对方确实不能访问。 -
防火墙拦截, 响应了 REJECT 包。
主机和服务都正常, 但主机的本地防火墙或网络上的防火墙进行了拦截, 并响应了 REJECT 包(是一个 ICMP 响应)。
此时也可以明确获知对方不可访问;
二:nginx 等待 TCP 超时时间(默认 60s)后, 才响应 502
为什么需要等待超时?
因为不确定对方时候真的不能访问, 需要考虑是否是网络延迟, 所以会明确等待 proxy_connect_timeout 时间之后才能确定对方不能被访问;
可能出现的几种场景
-
server ip 确实不存在, 例如主机宕机。
-
主机和服务都正常, 但主机的本地防火墙或网络上的防火墙进行了拦截, 并 DROP, 即未进行任何响应;
504 错误(网关超时)
本质: nginx 等待上游 server 响应内容时超时。
关键参数: proxy_read_timeout 默认 60s
也就是 nginx 将请求转发给上游服务器后,上游长时间没有给响应。
如果请求允许重试,则可以将这个时间改小一点。比如1s,如果1秒内没有响应,nginx就会转发给下一个上游节点再进行尝试。这样在客户端总的超时时间内,就有可能会请求到多个服务器中正常的那个。
499 错误
本质: 客户端在服务器完成响应前, 就已经关闭了与 nginx 的 TCP 会话;
场景
-
一般情况下客户端可能会配置 2s 或 5s 请求未响应即超时放弃会话;
此时客户端会发送 FIN 包走正常流程来关闭这个 TCP 连接; 日志中一般能看到一个整数多一点的总耗时, 如 5.03, 3.10;
-
但也是有 1s 内等正常耗时的请求也产生了 499 错误的场景。
例如 nginx 响应内容给客户端时, 客户端回了 RESET 包, 说明客户端早已经关闭了 TCP 连接。
这种情况要么是网络丢包导致客户端误认为之前的请求未建立成功, 所以提前关闭了这个 TCP 连接。
要么是客户端设计问题, 故意断开避免本地保持过多连接或 TIME_WAIT 状态过多;