图片 3

错误解决办法,499错误的原因及解决方法

给业务部门做一个代理使用google docs
。总是莫名奇妙的反馈打不开,发现nginx日志下报了很多499 。

再grep下“NGX_HTTP_CLIENT_CLOSED_REQUEST”,发现目前这个状态值只在ngx_upstream中赋值

说要配置proxy_ignore_client_abort on;

————————————–分割线

Nginx负载均衡配置实战 
http://www.linuxidc.com/Linux/2014-12/110036.htm

CentOS
6.2实战部署Nginx+MySQL+PHP
http://www.linuxidc.com/Linux/2013-09/90020.htm

使用Nginx搭建WEB服务器
http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程
http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3下Nginx性能调优
http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3下配置Nginx加载ngx_pagespeed模块
http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4安装配置Nginx+Pcre+php-fpm
http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx安装配置使用详细笔记
http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx日志过滤 使用ngx_log_if不记录特定日志
http://www.linuxidc.com/Linux/2014-07/104686.htm

CentOS
7.2下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1 
http://www.linuxidc.com/Linux/2016-09/134804.htm

10.600.254.35  10.600.254.35   2017-10-13T19:38:49+08:00   jyall-admin.jyall.com^^78882C98800A47E8A7D1EA9CD1A2C190|1507894686022   GET 200 /jyall/v1/minos/order/export?selectedFields=merchantId%2CmerchantName%2CpartnerOrderCode%2CtrackingId%2CserviceName%2CeffectivenessName%2CreceiverName%2CreceiverPrimaryPhone%2CreceiverCityName%2CreceiverAddress%2CreceiverLocation%2CorderWeight%2CtransportName%2CtransportAddress%2CcarrierLocation%2CtransportTel%2CcomplaintStatus%2CcomplaintDescription%2CdeliveryCost%2CtimeExtraCost%2CdistanceExtraCost%2CweatherExtraCost%2CweightExtraCost%2CtotalDeliveryCost%2CdiscountCost%2CtotalFee%2CorderAddTime%2CrequireReceiveTime%2CapolloOrderCreateTime%2CdispatchTime%2CtakeMealTime%2CtoStoreTime%2CstartDeliveryTime%2CarrivalDateTime%2CdeliveriedTime%2CagentId%2CagentName%2CstationId%2CcarrierTeamName%2CcarrierDriverName%2CcarrierDriverPhone%2CorderStatusName%2CdeliveryDistance%2CorderTimeout%2CabnormalDesc%2CtrackingRemark%2CmajorBusiness&startCreatedAt=1507824000000&endCreatedAt=1507910340000  HTTP    HTTP/1.1    43.735  43.735  2229    32768   211088  10.200.62.152:8080  -application/vnd.ms-excel;charset=utf-8 application/vnd.ms-excel;charset=utf-8  jyall-admin.jyall.com   apirouter   user    al  al-channel-statble-1    APIRouter   1.0 bj-jyall-web-1  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36   -

————————————–分割线

Nginx
的详细介绍
:请点这里
Nginx
的下载地址
:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134707.htm

图片 1

维基百科定义:

二、

   
但搜索相关问题一直找不到解决方法,最后终于在google上搜索到一英文论坛上有关于此错误的解决方法:
proxy_ignore_client_abort on;
Don’t know if this is safe.
    就是说要配置参数 proxy_ignore_client_abort on;
    表示代理服务端不要主要主动关闭客户端连接。

        }

Don’t know if this is safe.

   
以此配置重启nginx,问题果然得到解决。只是安全方面稍有欠缺,但比总是出现找不到服务器好多了。

     ……

图片 2

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 */

CentOS 7 编译安装Nginx1.10.2 脚本启动失败解决思路
http://www.linuxidc.com/Linux/2017-01/139794.htm

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 */

日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499、发送字节数是0。

/*

proxy_ignore_client_abort on;

    还有一种原因是 我后来测试发现 确实是客户端关闭了连接,或者说连接超时
,无论你设置多少超时时间多没用 原来是php进程不够用了 改善一下php进程数
问题解决 默认测试环境才开5个子进程。

1  499出现的原因

但搜索相关问题一直找不到解决方法,最后终于在google上搜索到一英文论坛上有关于此错误的解决方法。

    Nginx 499错误的原因及解决方法
    打开Nginx的access.log发现在最后一次的提交是出现了HTTP1.1 499 0
-这样的错误,在百度搜索nginx 499错误,结果都是说客户端主动断开了连接。
   
但经过我的测试这显然不是客户端的问题,因为使用端口+IP直接访问后端服务器不存在此问题,后来测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx认为是不安全的连接,主动拒绝了客户端的连接.

2      mysql慢查询

也可参看其他案例:

    可以看到,499对应的是 “client has closed
connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。

通过查看监控:

 

499错误是什么?让我们看看NGINX的源码中的定义:

An Nginx HTTP server extension. This codeis introduced to log the case
when the connection is closed by client whileHTTP server is processing
its request, making server unable to send the HTTP header back

图片 3

*/

可以看到,499对应的是 “client has closed
connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。

问题的核心就是要排查为什么服务端处理时间过长

 

那么客户端主动断掉连接之后,Nginx
会等待后端处理完(或者超时),然后记录「后端的返回信息」到日志。所以,如果后端返回
200,就记录 200 ;如果后端放回 5XX ,那么就记录 5XX 。

 

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

(2)加上这个参数后去掉限制后,nginx不再返回499,而是200了

106.120.173.17 – – [18/May/2015:10:30:58 +0800] “POST/v3/violations
HTTP/1.1” 499 0 “-” “Mozilla/5.0 (Windows NT6.1; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/34.0.1847.131Safari/537.36”

proxy_ignore_client_abort
on; #让Nginx代理服务端不要主动关闭客户端的连接。

        if (!u->cacheable) {
//upstream的cacheable为false,这个值跟http_cache模块的设置有关。指示内容是否缓存。

 

* before we even tryto send the HTTP header to it

业务有一个下载Excel表格的需求,可以忍受很长的下载时间。由于开发对后端server的gc等还没有优化,业务又着急使用。因为apigateway有30s的超时时间限制。Nginx假如后端服务器端处理的时间过长,客户端“不耐烦”,Nginx就会在日志返回如下的499。

grep一下nginx源码,定义在ngx_request_t.h :

10.600.254.35  10.600.254.35   2017-10-13T19:33:30+08:00   www.jyall.me^^11D9642583DF4E719736503E82DC4A3D|1507894380805    GET 499 /jyall/v1/minos/order/export?selectedFields=merchantId%2CmerchantName%2CpartnerOrderCode%2CtrackingId%2CserviceName%2CeffectivenessName%2CreceiverName%2CreceiverPrimaryPhone%2CreceiverCityName%2CreceiverAddress%2CreceiverLocation%2CorderWeight%2CtransportName%2CtransportAddress%2CcarrierLocation%2CtransportTel%2CcomplaintStatus%2CcomplaintDescription%2CdeliveryCost%2CtimeExtraCost%2CdistanceExtraCost%2CweatherExtraCost%2CweightExtraCost%2CtotalDeliveryCost%2CdiscountCost%2CtotalFee%2CorderAddTime%2CrequireReceiveTime%2CapolloOrderCreateTime%2CdispatchTime%2CtakeMealTime%2CtoStoreTime%2CstartDeliveryTime%2CarrivalDateTime%2CdeliveriedTime%2CagentId%2CagentName%2CstationId%2CcarrierTeamName%2CcarrierDriverName%2CcarrierDriverPhone%2CorderStatusName%2CdeliveryDistance%2CorderTimeout%2CabnormalDesc%2CtrackingRemark%2CmajorBusiness&startCreatedAt=1507824000000&endCreatedAt=1507910340000

* HTTP does notdefine the code for the case when a client closed

一、

140.207.202.187 – – [18/May/2015:10:30:58 +0800] “POST/v3/violations
HTTP/1.1” 499 0 “-” “-“

(1)Nginx不加这个参数前的日志为

问题描述:

配置重启nginx,问题果然得到解决。只是安全方面稍有欠缺,但比总是出现找不到服务器好多了。

CentOS 6.4安装配置Nginx+Pcre+php-fpm
http://www.linuxidc.com/Linux/2013-08/88984.htm

  

220.181.165.136 – – [18/May/2015:10:31:02 +0800] “POST
/v1/jobsHTTP/1.1” 499 0 “” “bdHttpRequest/1.0.0”

 

Nginx安装配置使用详细笔记
http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 499错误的原因及解决方法
打开Nginx的access.log发现在最后一次的提交是出现了HTTP1.1 499 0
-这样的错误,在百度搜索nginx 499错误,结果都是说客户端主动断开了连接。
但经过我的测试这显然不是客户端的问题,因为使用端口+IP直接访问后端服务器不存在此问题,后来测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx认为是不安全的连接,主动拒绝了客户端的连接.

发表评论

电子邮件地址不会被公开。 必填项已用*标注