一、nginx出现499错误码的原因以及proxy_ignore_client_abort配置
1. nginx出现499错误码的原因
最近发现服务器上出现很多499的错误,出现499错误的原因是客户端关闭了连接,在我这篇文章:服务端在执行时中途关闭浏览器退出之后php还会继续执行吗?个人实践实验得到结果( https://linge.blog.csdn.net/article/details/140354726 )里,测试中断时,服务器nginx的日志就是499记录。nginx报49*错误
400-499 用于指出客户端的错误。 (自己电脑这边的问题) 自己电脑这边的问题)
495 :https certificate error
496 :https no certificate
497 :http to https
498 :canceled
499 :client has closed connection
2. proxy_ignore_client_abort配置
即499错误是客户端主动断开了连接。 如何关闭报499这个错误码呢?可以通过配置:proxy_ignore_client_abort来处理。
proxy_ignore_client_abort:是否开启proxy忽略客户端中断。即如果此项设置为on开启,则服务器会忽略客户端中断,一直等着代理服务执行返回。并且如果执行没有发生错误,记录的日志是200日志。如果超时则会记录504。如果设置为off,则客户端中断后服务器端nginx立即记录499日志,但要注意,此时代理端的PHP程序会依然继续执行。可查看上面写的那篇文章。
nginx的proxy_ignore_client_abort默认是关闭的,即请求过程中如果客户端端主动关闭请求或者客户端网络断掉,那么Nginx会记录499。所以如果不想看到499报错,可以修改配置:
proxy_ignore_client_abort on ;
这样来说,499错误并不是一个问题,如果出现了大量的499的话,需要考虑为什么发生了这么多的客户端中断的问题。
另外需要注意的一项是:proxy_ignore_client_abort配置只会对代理的配置,如果请求的是当前nginx服务器,直接执行PHP程序返回。则设置proxy_ignore_client_abort为on也不会起作用,仍会是记录499日志。proxy_ignore_client_abort的配置是配置在代理处理时用。如下:
location =/b.php {
proxy_ignore_client_abort on;
proxy_pass http://service_backends;
}
3. 此篇文章的评论内容转载过来如下:
Level : 1. User:us20160615060636-556 Time:2017-04-20 21:26:45
最近我们也是发现很多499,就是这个原因
Level : 2. User:us20181110145022-372 Time:2018-11-10 14:50:55
这还有弹幕呢!
Level : 3. User:us20181119175503-546 Time:2018-11-19 17:55:33
牛批, 弹幕 ~
Level : 4. User:us20181220114114-366 Time:2018-12-20 12:09:01
牛B牛B~~~~~~~~~~~~~
Level : 5. User:us20190126110936-271 Time:2019-01-26 11:14:40
什么叫做proxy_ignore_client_abort的配置是配置在代理处理时用
Level : 6. User:us20190929165857-633 Time:2019-09-29 16:59:38
hehe蛋蛋疼
Level : 7. User:us20191029122149-278 Time:2019-10-29 13:20:33
niubi
Level : 8. User:us20200511171711-115 Time:2020-05-11 17:18:03
弹幕试一波
二、nginx 中日志文件格式配置中的内容变量大全及变量意义
在nginx中是可以自由配置日志(只有访问日志可自定义)的格式,之前有篇不是很全的文章:自定义配置nginx的日志格式、Nginx日志按天切割的最佳shell脚本、及nginx配置日志buffer缓冲刷入间隔秒数flush-CSDN博客配置的示例如下:
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$host $hostname $status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" ';
上面定义了两种格式的日志:access和main,记录日志的时候只需要在最后指定日志记录使用哪种格式,Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的。上面的定义格式只能针对访问日志。对于错误日志,格式只能是固定的,错误日志记录了客户端访问Nginx出错时的详细情况,通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。错误日志由指令error_log来指定,具体格式如下:
error_log logpath(log存放路径) level(错误日志的等级)
错误日志的等级有这几种: debug | info | notice | warn | error | crit ,从左至右,日志详细程度逐级递减,即debug最详细,crit最少。
一般不会关闭关闭错误日志,如何要关闭的话使用: error_log /dev/null; 注意使用:error_log off;并不是关闭错误日志,而只是将错误日志记录到一个文件名为off的文件中。
保存一份更全的日志中的变量大全及意义:
$remote_addr #与$http_x_forwarded_for 用以记录客户端的ip地址; $remote_user #用来记录客户端用户名称; $time_local #用来记录访问时间与时区; $request #用来记录请求的url与http协议; $status #用来记录请求状态;成功是200, $body_bytes_sent #发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。 $http_referer #用来记录从那个页面链接访问过来的; $http_user_agent #记录客户端浏览器的相关信息; $request #请求内容 $status #请求状态吗 $http_user_agent #客户端机型 $http_cookie #客户端的cookie $hostname #本主机服务器主机名 $upstream_addr #转发到哪里 $upstream_response_time #转发响应时间 $request_time #整个请求的总时间。 $server_name #虚拟主机名称 http_x_forwarded_for #客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。 $ssl_cipher #交换数据中的算法,比如RC4-SHA
注:在nginx中通过可以通过upstream_[PHP中自定义的server变量名],取得我们在PHP中给$_SERVER添加的各种值,这样我们可以实现在我们在PHP程序中输出的一些重要的参数放到日志中。这样就能快速统计所有的请求的一些数据相关数据。
标签:http,错误码,nginx,proxy,abort,499,日志,客户端 From: https://blog.csdn.net/weixin_47792780/article/details/140428353