nginx 499 产生的原因

什么是 nginx 的 499

nginx源碼中的定義

/*
* HTTP does not define the code for the case when a client closed
* the connection while we are processing its request so we introduce
* own code to log such situation when a client has closed the connection
* before we even try to send the HTTP header to it
*/
#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499

499 是nginx定义的一个状态码,用于表示: 服务器返回http头之前,客户端主动断开连接

產生原因

服务器upstream处理过慢,导致用户提前关闭连接

  • 1 server处理请求未结束,而client提前关闭了连接

  • 2 在一个upstream出错,执行next_upstream时也会判断连接是否可用,不可用则返回499

可能的原因:

后台程序处理请求时间过长

mysql慢查询

解決方法

(1)增加响应时间 在 nginx.confhttp 块中添加 proxy_ignore_client_abort on;

默认的情况下该参数是关闭的

Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.
在客户端主动关闭连接后, nginx 与分发服务器的连接是否保持连接

如果使用了 proxy_ignore_client_abort on

Nginx 会等待后端处理完(或者超时),然后记录「后端的返回信息」到日志。所以,如果后端返回 200,就记录 200 ;如果后端放回 5XX ,那么就记录 5XX 。 如果超时(默认60s,可以用 proxy_read_timeout 设置),Nginx 会主动断开连接,记录 504

(2) 从本质上解决客户端没能拿到请求响应的问题

Buy me a 肥仔水!