最近,发现项目组各个系统,很多接口都出现了499的状态码。但是所占的比例不大。大概2%左右的
好奇499代表的是什么,通过查询,发现是** client has closed connection**
499并不是标准的http_code,而是nginx自定义的一种code. 通过查询nginx源码,该code定义在ngx_http_request.h这个文件中
image
为什么会反馈这个code?
原因客户端主动断开,导致Nginx转发后端返回的数据,发现客户端已经断开。具体的判断逻辑,欢迎
查看Nginx源码。
测试方法:请求命令如下
curl --connect-timeout 0 -m 0.5 "你的接口地址";
image
ngxin 返回的结果:
image
产生的原因:
1.客户端的主动断开连接:
移动端ios 和 安卓主动断开,超过了其设置的超时时间。
2.浏览器自带的超时。
chrome的超时时间是5s 源码如下
image
测试验证:
当请求时间为6s+的时候,的确返回了499.
这里qq浏览器是最变态的0.9s以上都会抛499
firfox的超时时间也是超过4s以上
image
解决方案:
1\. 建议检查接口是否有慢查询。处理接口慢查询
2\. 提高接口的响应速率,减少包体不必要的传输内容。
3\. web资源静态化,尽量减少接口的响应时间
4\. nginx 代理设置
设置 proxy_ignore_client_abort on; 表示代理服务端不要主要主动关闭客户端连接。
但是该方案会存在安全问题。
以上是本人针对499的一些浅析。如有错误欢迎指正,拍砖。
感谢~