如何排查访问 CDN 加速域名出现大量499状态码的问题?

边缘云CDN与加速技术服务知识库
问题描述

我们发现用户将域名切到火山 CDN 后,出现大量的 499 状态码,我该如何排查该问题?

问题分析

499 状态码简介

先了解下 499 ,本身并不是标准 http 协议规定产生,而是 nginx 代码中针对网络情况做的一个特殊定义。先看下 nginx 代码中的定义(源码文件 ngx_request_t.h)

/*
* HTTP does notdefine the code for the case when a client closed
* the connectionwhile we are processing its request so we introduce
* own code to logsuch situation when a client has closed the connection
* before we even tryto send the HTTP header to it
*/
#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499

ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
ngx_string(ngx_http_error_497_page), /* 497, http to https */
ngx_string(ngx_http_error_404_page), /* 498, canceled */
ngx_null_string,                     /* 499, client has closed connection */

这是 nginx 定义的一个状态码,用于表示这样的错误:

  1. 服务器返回 HTTP 头之前,客户端就提前关闭了 HTTP 连接。

  2. 中间代理 Proxy 到后端的应用处理很慢或者没有响应,导致‘客户端等不及’而主动关闭了连接。

解决方案

场景一:服务器返回 HTTP 头之前,客户端就提前关闭了 HTTP 连接。

该场景主要有以下几个原因: 1. 客户端应用层的机制主动断开,无法处理当前的请求。 需要结合客户端的应用层日志进行分析,最好在客户的代码中记录 socket 的过程,结合应用的埋点日志。 2. 网络层处理超时 TCP 协议栈主动发起了断开。 需要客户端能否复现并抓到现场,可以使用 tcpdump 或者 Wireshark 固定本地的端口和其他唯一条件去抓包(常用 tcpdump -i device -s0 host domain/domain/ip -w except.pcap)。或者可以用 tcpping 、mtr 初步分析网络是否有明显异常。

场景二:处理和响应耗时长,客户端“等不及”而主动断开连接。

该场景主要有以下几个原因: 1. 请求未命中 CDN 缓存。 因此 CDN 节点在回源到客户源站的耗费时间长,客户端等不及而断开连接。 2. 请求命中 CDN 缓存。但文件较大且未开启 Range,客户端等待时间长而主动断开连接。 Range 请求允许用户请求文件的一个分片,而非整个文件。常用于大型文件的下载,可以实现断点续传的功能,且可以提高缓存命中率,减少回源流量消耗和源站压力,并且提升资源响应速度。

优化建议

  1. 配置适当的 CDN 缓存规则,提高缓存的命中率。
  2. 在加速 1M 大小以上的文件时,如果源站支持 Range 请求,建议开启回源 Range

开启 Range 回源前需确认源站是否支持 Range 请求,即 HTTP 请求头中包含 Range 字段,并且源站能够响应正确的 206 文件分片。如果源站不支持 Range 请求,开启 Range 回源将导致资源无法缓存。

如果您有其他问题,欢迎您联系火山引擎技术支持服务

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论