CDN 499 问题排查

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文主要针对客户 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 不够分配。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
边缘计算 缓存 监控
【CDN 排查方案-1】认识 CDN 网络调优
面向不同业务类型的网站,很多人都选择了 CDN 加速来优化自己的网站,目的在于加速网民的体验效果,赢取流量。 在网站调优的过程中,如果正确理解基于 CDN 的网络调优以及正确的配合 CDN 服务方来快速提供调优信息做了详细的讲解, 希望对大家有用,希望对从事 CDN 的人和对网络调优感兴趣的人能有作用。
【CDN 排查方案-1】认识 CDN 网络调优
|
1月前
|
缓存 网络安全 数据安全/隐私保护
使用阿里云国际CDN加速后网站无法访问的排查步骤
使用阿里云国际CDN加速后网站无法访问的排查步骤
|
安全 应用服务中间件 nginx
CDN页面优化不生效排查遇到的坑
如果源站响应给CDN的数据是Gzip压缩以后的数据会导致CDN的页面优化不生效。本文详细讲述了问题的原因以及排查过程,并讲述了Nginx关于Gzip的压缩配置,同时介绍了CDN作为代理服务,引入了Via header以后对Nginx服务器的影响。
6250 1
CDN页面优化不生效排查遇到的坑
|
弹性计算 监控 Kubernetes
【案例分享】CDN+WAF流量突增排查案例
阿里云CDN结合WAF使用,WAF作为CDN的源站,是较为常见的使用方式,可以充分发挥CDN的分发加速以及WAF的安全防护能力,一般架构为CDN-->WAF-->SLB-->ECS;但复杂的架构往往也会增大问题排查的复杂程度,本文和大家分享一起由于WAF配置问题引发CDN流量异常增长的案例。
1895 0
【案例分享】CDN+WAF流量突增排查案例
|
Web App开发 域名解析 缓存
接入CDN/WAF后出现循环重定向问题的排查记录
一例客户网站接入CDN/WAF后,出现301循环重定向的问题处理
接入CDN/WAF后出现循环重定向问题的排查记录
|
编解码 JSON 弹性计算
CDN - API 类型问题排查
浅谈 在调用阿里云 CDN openAPI,经常会出现各种各样的问题排查起来没有好的思路不好分析,今天说下基本的排查思路。 分析 不管调什么 CDN openAPI,无论是控制台还是 SDK 或者用户的脚本,出现问题都可以按照如下思路排查。
CDN - API 类型问题排查
|
缓存 tengine 前端开发
CDN - 跨域失败排查
某个客户在阿里云 CDN 配置了加速域名 al.p2.com ,客户自己的主站域名 www.a.com 加载 al.p2.com 下的资源出现跨域的报错; 了解跨域 跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。
CDN - 跨域失败排查
|
Web App开发 缓存 测试技术
接入CDN/WAF后出现循环重定向问题的排查记录
一例客户网站接入CDN/WAF后,出现301循环重定向的问题处理
6205 0
|
测试技术 CDN
未解之谜--HTTPS协议POST数据到CDN节点异常的排查
特定机器POST数据到CDN节点无数据返回
4281 0
|
JavaScript 网络协议 Shell
【OSS 排查方案-2】CDN+OSS 基础排查工具
工具说明: CDN+OSS 的服务架构。 目的:当用户遇到 CDN + OSS 投诉问题后,可以先用此工具测试一下基本的测试指标,初步判断问题故障点,同时可以将脚本结果粘贴给阿里云客服更快定位信息。 使用方法:sh check_cdn_oss.sh 域名 请求URL OSS公网域名 Usge: check_cdn_oss.sh www.zhangyb.mobi http://www.zhangyb.mobi/index.html youkou.oss-cn-beijing.aliyuncs.com 如有需求,可提改进意见,工具会继续完善,谢谢。