排查 HTTP 499 错误响应。
当客户端在服务器能够响应之前终止连接时,通常会出现 HTTP 499 响应代码。
499 响应代码的示例包括:客户端在服务器完成处理之前超时并关闭连接的情况,例如在大文件上传或长时间运行的请求期间。它们也可能因 TCP 三次握手问题而发生,即客户端因其超时设置而过早终止连接。
499 Client Closed Request 状态码是 nginx 特有的,表示客户端在服务器仍在处理请求时关闭了连接,导致服务器无法发送响应状态码。此状态码会出现在 Cloudflare Logs 以及 Enterprise 客户的状态码分析中。
为提供更多背景:在任何更高层协议(例如 HTTP)开始通信之前,必须在 Cloudflare 与网站源站服务器之间建立 TCP 连接。TCP 使用三次握手建立连接:
- SYN:Cloudflare 向源站服务器发送 SYN 数据包。
- SYN+ACK:源站服务器以 SYN+ACK 数据包响应。
- ACK:Cloudflare 向源站服务器发回 ACK 数据包。
此时连接已建立,Cloudflare 和源站服务器可以通信。但是,如果源站服务器未在 19 秒内向 Cloudflare 发回 SYN+ACK,Cloudflare 会再重试一次,并设置另一个 15 秒超时。
根据客户端超时设置,可能出现以下情况:
- 较短的客户端超时(少于 38 秒):如果客户端超时较短,它会在 Cloudflare 完成处理之前放弃连接,并记录
499响应代码。 - 成功连接(超过 38 秒):如果客户端超时较长且 TCP 连接成功建立,HTTP 事务将正常进行,Cloudflare 返回标准状态码(
HTTP 200)。 - 握手失败:如果客户端超时较长,但 Cloudflare 无法与源站服务器建立 TCP 握手,Cloudflare 将返回
HTTP 522状态码。
使用 Origin Analytics 检查源站响应时间过慢是否导致客户端过早关闭连接。如果 P95 源站响应时间较高,请在 Top endpoints 表中识别较慢的端点并进行优化,以减少 499 错误。