那些不是标准的私有状态码

工具相关 ·

排查线上问题时,偶尔会遇到一个陌生的三位数:日志里写着 499,浏览器上显示 520,IIS 的错误页给出一个带小数点的 404.3。去 RFC 里搜索,一个都找不到。这些码确实不在标准里,但它们真实存在,而且各自指向很具体的问题。

标准码的边界在哪里

HTTP 状态码由 RFC 定义,标准码的数量是有限的。1xx 到 5xx 每一类里,规范明确定义的编号并不多,大量数字其实是空闲的。这就给厂商留下了扩展空间——代理软件、CDN、Web 服务器都会在自己的产品里定义一批私有码,用于表达标准码无法覆盖的状态。

因此遇到不认识的码时,第一个判断动作不是去背状态码表,而是先确认:这个码是谁返回的。看响应头里的 Server 字段,或者看请求经过了哪些中间层,通常能立刻缩小范围。

Nginx 的 499

499 是 Nginx 的私有码,含义是客户端在服务端返回响应之前主动断开了连接。

它出现的典型场景是:后端接口处理太慢,客户端设置了 5 秒超时,5 秒一到就断开;Nginx 这边还在等后端,等到发现连接已经没了,就把这次请求记为 499。

499 的价值在于它是一个信号。少量 499 属于正常现象,用户关页面、网络抖动都会产生;但如果在某一时段集中出现大量 499,基本可以判定是后端响应过慢,客户端等不及先走了。

这里要和 504 区分开。504 是代理等不到上游响应而放弃,499 是客户端等不到代理响应而放弃。前者说明代理的耐心到了尽头,后者说明客户端的耐心到了尽头。两者的共同点都是「后端慢」,但观察角度不同,所以优化方向一致:先解决慢,而不是调 Nginx 的超时参数。

Cloudflare 的 520 到 530

这一系列是 CDN 的私有码,共同含义是回源失败。521 到 523 表示连接没建立起来,分别对应源站拒绝连接、TCP 握手超时、源站地址不可达;524 表示连上了但源站响应超过了等待上限;525 和 526 是 TLS 握手失败与源站证书无效;530 表示 DNS 解析失败。

它们的排查思路是统一的:问题在源站侧,去查服务进程、防火墙、源站证书和域名解析,而不是去怀疑 CDN。

IIS 的子状态码更值得注意

IIS 除了会返回标准码,还习惯在标准码后面附加一个子状态码,写成小数形式,比如 404.3、401.3、500.19。

这种写法的好处是把笼统的类别细化成具体原因。同样是 404,404.0 表示文件真的不存在,404.3 表示请求的扩展名没有配置对应的 MIME 类型,也就是说文件在但服务器不打算把它当作可访问的静态资源返回。同样是 401,401.1 是凭据错误,401.3 是 NTFS 权限不足。

排查 IIS 站点时,看到带小数点的状态码不要当成显示错误,它往往比一个孤零零的 404 更有信息量。

遇到陌生码时的处理顺序

第一步看首位数字,确定大类。无论是 499 还是 520,首位是 4 就说明问题偏调用方或链路,首位是 5 就说明问题偏服务端。这一步能保证大方向不跑偏。

第二步确认是谁返回的。看 Server 响应头、看请求链路里经过的代理和 CDN,或者直接在被怀疑的那一层上抓一次响应。私有码的含义完全取决于产品,同一个数字在不同产品里可能有不同解释。

第三步查该产品的文档。私有码的权威解释只在自己的官方文档里,状态码对照表可以作为线索,但最终结论要回到产品文档确认。

第四步才是判断处理动作。如果这个码表示的是链路问题,就去查链路;如果表示的是慢,就去优化慢的来源。

处理清单

  • 陌生码先看首位数字定大类,再确认由哪一层返回
  • 499 表示客户端提前断开,大量出现说明后端太慢,与 504 同源不同视角
  • 520 到 530 表示 CDN 回源失败,排查目标始终是源站
  • IIS 的小数状态码是子状态码,信息量大于标准码,别当成异常显示
  • 私有码的权威解释只在对应产品的官方文档里,对照表只作线索
  • 记住一个原则:私有码通常不改变处理方向,只把方向定位得更精确
阅读 14