这几天在排查线上一个CC攻击问题时,发现nginx打印输出的访问请求日志中,状态码都是499,并且请求总时间基本在都在1ms内,响应字节数也是0。
499错误是什么?让我们看看NGINX的源码中的定义:
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 */
从注释说明来看,499的产生是由于请求过程中,源站先关闭,然后产生了499,于是自己写代码仰正一番。
直接上python脚本:
第一次,请求一个本地文件,但是nginx 响应太快,没等完全关闭,响应已经回来。nginx状态码是200。
第二次,由于我用的是openresty框架,在请求的access_by_lua阶段,调用了ngx.sleep(10),sleep10秒,再次大量发送请求,这时候出现了预期中的499。
另外,如果Nginx作为反向代理,如果在代理节点向后段业务获取服务的过程中,不受到client端的主动断开影响,nginx提供了一个指令:
proxy_ignore_client_abort on;
打开就好!