CDN 499 问题排查

简介: 本文主要针对客户 CDN 加速域名出现 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定义的一个状态码,用于表示这样的错误:服务器返回http头之前,客户端就提前关闭了http连接。
  • 但还有一种可能就行 proxy 到后端的应用处理很慢或者没有响应。,“客户端等不及” 所以主动关闭了链接

主动断开

先说第一种场景,客户端提前断开。和以下几个原因有关

1、客户端应用层的机制主动断开,无法处理当前的请求。需要结合客户端的应用层日志进行分析,最好在客户的代码中记录 socket 的过程,结合应用的埋点日志。

2、网络层处理超时 TCP 协议栈主动发起了断开,需要客户端能否复现并抓到现场,可以使用 tcpdump 或者 Wireshark 固定本地的端口和其他唯一条件去抓包(常用 tcpdump -i device -s0 host $domain/$ip -w except.pcap)。或者可以用 tcpping 、mtr 初步分析网络是否有明显异常。

转发&处理超时

继续上传的 nginx 代码查找,“NGX_HTTP_CLIENT_CLOSED_REQUEST”,发现目前这个状态值只在 ngx_upstream 中赋值, upstream在以下几种情况下会返回 499

upstream 在收到读写事件处理之前时,会检查连接是否可用:

ngx_http_upstream_check_broken_connection,
   if (c->error) { 
       ...
       if (!u->cacheable) { 
           ngx_http_upstream_finalize_request(r, u, NGX_HTTP_CLIENT_CLOSED_REQUEST);
       }
}

1、server处理请求未结束,而client提前关闭了连接,此时也会返回499。这种情况也可能是 CDN 节点在回源到客户源站时间太长,客户端等不及断开。
客户端可以下载 CDN 日志过滤下异常的 URL 和时间点分析
if ( responsetime too long )
{
if(http_cache -> MISS)
//说明没有命中缓存,和回到客户源站导致的响应时间过长有关系。

if(http_cache -> HIT)
//说明命中节点缓存,需要升级售后继续进行分析。
}

2、在一个 upstream 出错,执行 next_upstream 时也会判断连接是否可用,不可用则返回499。但这种情况基本占比很少,问题的核心就是要排查为什么服务端处理时间过长。

建议

1、发现 CDN MISS 回源后响应时间很长而导致 499 ,原站可以看下错误日志,或者代码的埋点日志分析,为什么处理时间会很长。

2、检查原站是否存在慢 SQL 查询,或者一些读写数据库导致响应的时间过长。

3、如果原站是 nginx 或者基于 nginx 二次开发的 http server ,可以开启 proxy_ignore_client_abort on;( 让代理服务端不要主动关闭客户端的连接)。客户端主动断开连接后,nginx 会等待后端处理完然后返回 2xx ,如果后端处理超时,则返回 5xx 。

4、如果原站是 nginx 或者基于 nginx 二次开发的 http server,可以将 read_timeout write_timeout 调整大一些,要结合主机的负载能力调整,不能设置太长,容易造成 FD 耗尽,或者 socket 不够分配。

目录
相关文章
|
编解码 JSON 弹性计算
CDN - API 类型问题排查
浅谈 在调用阿里云 CDN openAPI,经常会出现各种各样的问题排查起来没有好的思路不好分析,今天说下基本的排查思路。 分析 不管调什么 CDN openAPI,无论是控制台还是 SDK 或者用户的脚本,出现问题都可以按照如下思路排查。
CDN - API 类型问题排查
|
2月前
|
域名解析 网络协议 安全
阿里云CDN
本文介绍阿里云CDN产品中涉及的基本概念,便于您更准确地理解和使用CDN产品。
62 5
|
15天前
|
缓存 网络协议 Serverless
阿里云CDN简介和使用流程
本文档介绍了如何在阿里云上配置和使用CDN服务。首先,需要注册并实名认证阿里云账号,然后购买CDN服务。接着,添加要加速的域名,通过CDN控制台和阿里云云解析DNS进行配置,并验证CNAME设置是否生效。之后,配置源站信息,可以选择OSS域名、IP、源站域名或函数计算域名作为源站。最后,设置缓存规则,如缓存过期时间、状态码过期时间、自定义HTTP响应头等,以优化资源访问效率。
阿里云CDN简介和使用流程
|
22天前
|
弹性计算 Ubuntu 网络协议
阿里云CDN功能Quick Start
本文通过在国外Region ECS创建ECS,通过ECS部署应用,然后使用CDN加速部署应用,全链路测试体验阿里云CDN通过IP加速服务的功能。
|
8月前
|
弹性计算 缓存 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
136 0
|
1月前
|
安全 网络安全 CDN
阿里云CDN HTTPS 证书配置流程
阿里云CDN HTTPS 证书配置流程
177 1
|
8月前
|
弹性计算 缓存 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(二)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(二)
135 0
|
8月前
|
缓存 弹性计算 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(一)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)
167 0
|
9月前
|
缓存 前端开发 安全
阿里云CDN简介和优惠购买流程
阿里云CDN,首先需要了解什么是CDN。CDN全称是Content Delivery Network,即内容分发网络。CDN可以通过地理位置分发策略,使用户就近访问到离他们最近的服务器,从而提高访问速度,同时也能减轻源站流量压力,确保整个网站的稳定性。 阿里云CDN是阿里云推出的全球服务,涵盖全球范围内1250+节点。阿里云CDN采用的是BGP多线路中转技术,保证全局加速,让网络传输更加稳定。阿里云CDN可以帮助用户提高网站的访问速度,从而提升用户体验。同时,阿里云CDN还有许多其他的优势。
|
10月前
|
存储 缓存 边缘计算
阿里云CDN简介和使用流程
阿里云内容分发网络CDN(Content Delivery Network)是建立并覆盖在承载网之上,由遍布全球的边缘节点服务器群组成的分布式网络。阿里云CDN能分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问速度。(1)全网带宽输出能力达150 Tbps。(2)把静态内容缓存到边缘节点提高访问下载效率。
2086 0