nginx 499 产生的原因

nginx 499 产生的原因

大家好,又见面了,我是全栈君。

点击上方“码农编程进阶笔记”,选择“置顶或者星标

优质文章第一时间送达!

nginx 499 产生的原因

什么是 nginx 的 499

499 是 nginx 扩展的 4xx 错误,目的只是用于记录,并没有实际的响应。
看一下 nginx 源码 ngx_http_request.h 对 499 的定义:

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

由上述表述可知,nginx 499 代表客户端请求还未返回时,客户端主动断开连接。

什么情况下 nginx 记录 499

通过网上查询相关资料学习与了解,自己总结大致原因就是请求在指定的时间内没能拿到响应而关闭了连接。问题症结点为两处:1、指定的时间;2、程序处理的性能。

时间问题

最开始时,表述过 nginx 499 是客户端主动断开了连接。这里的客户端概念,我的理解是对请求连接过程中的下游服务而言的,例如浏览器与 nginx 之间的连接,浏览器为客户端;nginx 与其分发的服务而言,nginx 是客户端;php 处理程序中发起的 curl 请求而言,php-fpm 可视为客户端。
上述的指定时间内的这个时间,一般是定义的处理超时时间,可能的原因就是这个时间设短了。
以发起 curl 请求为例,数据传输的最大允许时间用 -m 参数来指定。
例如:

curl -m 20 "http://somewebsite.com"  

数据传输的最大允许时间超时的话,curl 断开了请求,而 web 服务器如 nginx 还在处理的话,则 nginx 会记录 499;

再如 nginx 作为反向代理时,nginx 将请求分发至对应的处理服务器时,有两对超时参数的设置:

proxy_send_timeoutproxy_read_timeout

fastcgi_send_timeoutfastcgi_read_timeout

 两对参数分别对应的是ngx_http_proxy_module和ngx_http_fastcgi_module 模块的参数。两对参数默认的超时时间都是 60 s。在 nginx 出现 499 的情况下,可以结合请求断开前的耗时和这两对设定的时间进行对比,看一下是不是在 proxy_pass 或者 fastcgi_pass 处理时,设置的超时时间短了。

再如 php 操作超时。打开 php.ini 查看 max_execution_time 和 max_input_time 两个参数。两者分别是 php 程序执行的最长时间和表单提交的最长时间。

如果后端服务中访问了负载均衡的,例如 AWS 上的 Elastic Load Balances 等。出现 nginx 上设置的超时很大,nginx 同样记录了 499 状态,那么有可能就是负载均衡在默认时间(一般是 60 s)后删除了连接。这种情况下,可根据 nginx 的配置,相应的修改负载均衡的配置。

性能问题

性能问题就比较宽泛了,不太便于排除,可能会有的情况:
1、CPU 和内存的使用情况
linux 上,可以用 top 命令查看 CPU 和内存的使用情况。

top - 16:59:03 up 334 days, 23:10,  1 user,  load average: 0.06, 0.08, 0.07
Tasks: 114 total,   2 running, 112 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.3 sy,  0.0 ni, 98.5 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2916192 total,   516184 free,  1540972 used,   859036 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   999988 avail Mem


  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                     
11475 work      20   0  157680   2188   1520 R   0.7  0.1   0:00.34 top                                                                         
12206 elastic+  20   0 3685272 980.1m    272 S   0.7 34.4   1027:58 java                                                                        
24451 mysql     20   0 1745372 275176   2892 S   0.3  9.4 761:20.55 mysqld                                                                      
    1 root      20   0  232328  46328   1324 S   0.0  1.6  33:03.32 systemd                                                                     
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.80 kthreadd                                                                    
    3 root      20   0       0      0      0 S   0.0  0.0   0:37.02 ksoftirqd/0                                                                 
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                
    7 root      rt   0       0      0      0 S   0.0  0.0   0:20.47 migration/0                                                                 
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                                      
    9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0                                                                     
   10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1                                                                     
   11 root      20   0       0      0      0 R   0.0  0.0 126:24.86 rcu_sched

第三行,cpu状态信息,具体属性说明如下:

0.5% us — 用户空间占用CPU的百分比;
0.3% sy — 内核空间占用CPU的百分比;
0.0% ni — 改变过优先级的进程占用CPU的百分比;
98.5% id — 空闲CPU百分比;
0.7% wa — IO等待占用CPU的百分比;
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比;
0.0% si — 软中断(Software Interrupts)占用CPU的百分比。

第四行,内存状态,具体信息如下:

2916192k total — 物理内存总量(2.9GB);
1540972k used — 使用中的内存总量(1.5GB);
516184k free — 空闲内存总量(0.5GB);
859036k buffers — 缓存的内存量 (859M)。

2、php-fpm 等 fastcgi 处理程序进程数不够用
需要理解的参数有:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。
pm 表示进程数的控制方式,分别为 static (静态)和 dynamic (动态)。

pm = dynamic 如何控制子进程,选项有static和dynamic
pm.max_children:静态方式下开启的php-fpm进程数量
pm.max_requests:php-fpm子进程能处理的最大请求数
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量

3、mysql 等数据查询过程缓慢
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数。具体可参考Mysql 慢查询日志总结。

4、程序处理逻辑性能不好
这一项需要查询程序的逻辑处理是否有过多的重复的或者冗余的过程了。:smile:

他人给的解决方案

网上能查询到的解决方案基本就是在 nginx.conf 的 http 块中添加 proxy_ignore_client_abort on;
默认的情况下该参数是关闭的。nginx 官网给的参数说明如下:

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。
上述方法,个人认为仅仅是解决了 nginx 记录 499 的问题,并没有从本质上解决客户端没能拿到请求响应的问题,具体还是得从超时时间的设定和程序处理性能的提升上从根本解决问题。


总结参考自
[1]:Linux top 命令  
[2]:php-fpm 进程数优化

如果你对这篇文章感兴趣,帮忙一下或者点击文章右下角在。感谢啦!关注公众号,回复「进群」即可进入无广告技术交流群

nginx 499 产生的原因

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112024.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月11日 下午3:00
下一篇 2022年2月11日 下午4:00


相关推荐

  • Python 正则表达式详解(建议收藏!)[通俗易懂]

    Python 正则表达式详解(建议收藏!)[通俗易懂]目录匹配字符串单字符匹配.匹配任意一个字符\d匹配单个数字\D匹配非数字的\s匹配特殊字符,如空白,空格,tab等\S匹配非空白\w匹配单词、字符,如大小写字母,数字,_下划线\W匹配非单词字符[]匹配[]中列举的字符正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅python里面可以用,其他的语言也一样适用。python中re模块提供了正则表达…

    2022年10月3日
    5
  • 最全中文停用词表(可直接复制)

    最全中文停用词表(可直接复制)最全的停用此表整理词表名词表文件中文停用词表cn_stopwords.txt哈工大停用词表hit_stopwords.txt百度停用词表baidu_stopwords.txt机器智能实验室停用词库scu_stopwords.txt以上停用词表链接:https://github.com/goto456/stopwords以下是我常用的1893个停用词,可直接复制!”#$%&'()*+,—……….

    2022年6月17日
    46
  • Maven配置Tomcat_maven和tomcat的区别

    Maven配置Tomcat_maven和tomcat的区别maven配置tomcat版本 <!–配置Tomcat插件–> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version&

    2022年10月21日
    4
  • android系统中toast是什么_android studio toast不显示

    android系统中toast是什么_android studio toast不显示Toast控件介绍Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,它显示在应用程序界面的最上层,显示一段时间后自动消失不会打断当前操作,也不获得焦点。使用Toast提示信息的实例代码:Toast.makeText(Context,Text,Time),show();这段代码首先调用了Toast的makeText方法用来设置提示信息,Context:表示应用程序环境的信息,就是当前组件的上下文环境,如果在Activity中使用的话,那么该参数可设置为”Activi

    2025年11月9日
    5
  • linux重启nginx服务_centos7重启服务器命令

    linux重启nginx服务_centos7重启服务器命令连接服务器输入以下命令,如果要重启其他服务把nginx替换即可。servicenginxrestart出现以下页面即为成功

    2022年8月13日
    7
  • node+express操作cookie「建议收藏」

    node+express操作cookie「建议收藏」Cookie:有时也用其复数形式Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。用node操作cookie我们需要cookie-parser模块npmicookie-parser-s接下来在我们的文件中引入此模块//引入express模块constexpress=require(‘express’)//实例化expressconstapp=

    2022年7月11日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号