nginx代理返回代码499问题分析与处理

 更新时间:2023年06月29日 11:13:06   作者:王小那个鑫  
我们通过nginx作为互联网代理服务器,通过它实现我行内部系统向互联网系统的接口访问及调用,但是在使用过程中,不时的会出现大量返回代码为499的问题,所以本文我们对为什么nginx会返回499错误代码展开分析和研究

一、背景

​ 我们通过nginx作为互联网代理服务器,通过它实现我行内部系统向互联网系统的接口访问及调用;但是在使用过程中,不时的会出现大量返回代码为499的问题(正常访问返回为200),甚至有时候部分系统在报499的错误时,会影响到某一业务的正常使用。此时,我们也会怀疑nginx代理出现了问题,于是重启或者重新加载nginx服务。但是比较奇怪的是,如果nginx整个出现了问题,那么为什么会出现某个业务异常而不是在nginx上的所有服务异常呢?于是,我们则需要对为什么nginx会返回499错误代码展开分析和研究。

二、499代码代表了什么

​ nginx返回499错误,那么我们就到nginx的源码里面看看,是否存在499返回代码的解释呢?通过在nginx的源码进行查找,发现有一段这样的代码:

#define NGX_HTTP_LAST_4XX  430
#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)
    ngx_string(ngx_http_error_494_page), /* 494, request header too large */
    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 */
    ngx_string(ngx_http_error_500_page),
    ngx_string(ngx_http_error_501_page),
    ngx_string(ngx_http_error_502_page),
    ngx_string(ngx_http_error_503_page),
    ngx_string(ngx_http_error_504_page),
    ngx_string(ngx_http_error_505_page),
    ngx_null_string,                     /* 506 */
    ngx_string(ngx_http_error_507_page)

从这里,我们则可以看到ngx_null_string对应的就是499代码,其表示了client has closed connection,即说明了是客户端已经关闭了连接。

​ 那么为什么客户端会主动去关闭连接呢?其实最简单的解释就是因为服务端处理时间过长,然后客户端无法等到服务端处理完成,然后就会去主动关闭连接,然后代理就会为我们返回499错误。

​ 在进行资料查询后,我们可以总结出一般有几种情况,可能造成499错误:

​ 1)客户端在服务端响应前确实主动关闭了连接;

​ 2)客户端在连接服务端进行业务的过程中,网络发生了中断,出现了连接超时;

3)两次提交post过快,nginx会认为是不安全的连接,主动拒绝了客户端的连接(往往是有人故意攻击,消耗服务器资源);

4)php的进程数量不够用,需要调整php的进程数量;

三、如何处理499问题

​ 在nginx的配置中有一个参数为:proxy_ignore_client_abort

​ 该参数的含义是:确定在客户端关闭连接时,是否关闭与代理服务器的连接,而不再等待响应。

​ 该值的默认值为off,此时则代表在发生交易的过程中,如果客户端无论是发生了主动关闭连接、客户端网络中断、访问服务超时、服务器未处理的情况,那么 Nginx 都会记录 499;这样则可能会存在一个问题就是可能无法真实反应客户端服务访问的真实情况。

​ 而该值改为on的时候,则表示客户端主动断掉连接之后,Nginx 会等待后端服务器处理完(或者超时),然后记录“后端的返回信息”到日志。因此,会有几种情况:

1、如果后端返回200,就记录200 ;
2、如果后端返回5XX ,那么就记录 5XX;
3、如果超时(默认60s,可以用 proxy_read_timeout 和proxy_send_timeout设置),Nginx 会主动断开连接,记录504。

这样则可以将访问异常的真实问题反应出来。

​ 因此,我们可以通过在http域、server域、location域内加入:

```
proxy_ignore_client_abort on
```

四、风险

​ 根据上面的分析,其实我们可以发现,其实发生499的问题时候的可能性会很多,而且如果出现客户端在建立连接后主动关闭了连接的情况则会是一种正常的场景。当然,虽然我们可以通过打开proxy_ignore_client_abort的参数来解决499的问题,且可以暴露出客户端到服务端的真实原因。但是打开该设置后也会存在一定风险,即当有大量瞬间断开的请求时,后端会默默地全部处理掉,比较浪费资源,且并发压力比较大时,也有可能造成服务器出现被压垮宕机的可能。

五、结论

​ 结合上述的分析,考虑到风险,我们可以得出以下结论,如果我们的机器只存在单机环境或者无冗余环境的时候,我们尽可能的不要去设置这个参数,从而避免服务器被压垮的风险;当我们有足够的环境做冗余的时候或者在前端有负载均衡对连接进行分发负载的时候,我们则可以考虑打开该参数,从而便于运维人员分析问题异常。

到此这篇关于nginx代理返回代码499问题分析与处理的文章就介绍到这了,更多相关nginx返回代码499内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nginx url自动加斜杠及301重定向的问题

    nginx url自动加斜杠及301重定向的问题

    这篇文章主要介绍了nginx url自动加斜杠及301重定向的问题的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • nginx配置域名(ssl和非ssl形式)的实现示例

    nginx配置域名(ssl和非ssl形式)的实现示例

    本文主要介绍了nginx配置域名(ssl和非ssl形式)的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 详解Nginx服务器中配置Sysguard模块预防高负载的方案

    详解Nginx服务器中配置Sysguard模块预防高负载的方案

    这篇文章主要介绍了详解Nginx服务器中配置Sysguard模块预防高负载的方案,该模块由阿里巴巴的团队开发,能够设置负载阀值,比较强大,需要的朋友可以参考下
    2016-01-01
  • nginx中的location路径配置(实路径和虚路径)

    nginx中的location路径配置(实路径和虚路径)

    这篇文章主要介绍了nginx中的location路径配置(实路径和虚路径),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • nginx查看配置文件的操作方法

    nginx查看配置文件的操作方法

    nginx的配置放在nginx.conf文件中,一般我们可以使用以下命令查看服务器中存在的nginx.conf文件,这篇文章主要介绍了nginx查看配置文件,需要的朋友可以参考下
    2024-02-02
  • nginx配置伪静态和适配客户端的方法步骤

    nginx配置伪静态和适配客户端的方法步骤

    这篇文章主要介绍了nginx配置伪静态和适配客户端的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 基于Nginx实现限制某IP短时间访问次数

    基于Nginx实现限制某IP短时间访问次数

    这篇文章主要介绍了基于Nginx实现限制某IP短时间访问次数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 一些优化Nginx服务器的技巧简介

    一些优化Nginx服务器的技巧简介

    这篇文章主要介绍了一些优化Nginx服务器的技巧简介,包括对HTTP模块和Events模块的配置建议,需要的朋友可以参考下
    2015-06-06
  • nginx七层负载均衡配置详解

    nginx七层负载均衡配置详解

    本文主要介绍了nginx七层负载均衡配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 利用njs模块在nginx配置中引入js脚本

    利用njs模块在nginx配置中引入js脚本

    这篇文章主要给大家介绍了关于利用njs模块在nginx配置中引入js脚本的相关资料,通过这个脚本实现一些更复杂的 nginx 配置功能,需要的朋友可以参考下
    2021-12-12

最新评论