浅析nginx 客户端返回499的错误码的问题

 更新时间:2022年10月30日 08:32:28   作者:飞翔码农  
我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录,对nginx返回499错误码相关知识感兴趣的朋友一起看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录

网络架构和背景

我们服务架构和错误码是上面这样的,上游服务日志没有记录,无法确定kong到上游服务的连接和请求细节。

kong上的日志
rsp_cost:0.041
rsp_length:0
rsp_status:499
ups_rsp_cost:-
ups_rsp_length:0
ups_rsp_status:-
waf上的日志
rsp_cost:1.045
rsp_length:0
rsp_status:499
ups_rsp_cost:-
ups_rsp_length:0
ups_rsp_status:-

看日志,两个负载均衡的现象一毛一样,kong upstream到web服务上,不太确定是upstream 链接的问题或者是读写数据的问题,或者是kong自己的问题,根本就没有反向代理到上游服务

上游服务抓包

打算在上游服务上抓一下包,看看请求是在kong上出问题了,根本没到上游服务,还是说已经到了上游服务,上游服务出问题了。

83是kong的ip,82是上游服务的ip
可以看到,83首先发了fin包,表示要断开连接,之后82也回复了fin的ack包,之后82还在发送数据包,过了大概0.18秒,82才给83发了fin ack包,表示可以断开连接了。这时候由于83早就断开了连接,在这个中间的包,83回复了RST,我们使用的是长链接,83断开连接之后,新的连接已经复用这个TCP连接了,这时候83只能回复RST。大概过程就是这样的。

kong为什么要断开连接?
由于我们使用upstream是长链接,猜测了很多种可能

  • keepalive_requests 超过keepalive_requests个请求后就会关闭长链接
  • keepalive_time 超过keepalive_time时间后就会关闭长链接
  • keepalive_timeout 打开上游服务的超时时间,连接超过keepalive_timeout就认为上游服务已经不可用了,这个参数就直接排除了,抓包已经看到请求已经到了上游服务

最后都放弃了这个配置,觉得Nginx应该会处理完请求之后再受到keepalive_requests keepalive_time的限制关闭连接,不可能请求处理一半然后直接主动关闭连接,还有一个原因,我们的Nginx版本是1.13,也没有这些配置可以修改。

负载均衡的问题?

最后怀疑是waf上的问题,waf上请求量太大,没去waf机器上抓包,猜测waf抓包跟kong的结果是一样的,然后向前推测waf为什么要断开连接,猜测是不是客户端断开了连接,如果是客户端断开连接的话,所有的看到的日志现象就是通的。
为了验证这个猜测,我们在测试环境模拟了一下客户端主动断开连接的操作。
我们先在的上游服务上模拟了一个耗时的请求,然后再没有返回结果的时候主动断开请求。

class TestController extends BaseController
{
    public function actionTest()
    {
        sleep(3);
        return $this->response->success(array("test","geekbang","es"));
    }
}

然后我们在终端上使用curl请求接口,在三秒之内取消请求。
curl https://test.com/test/test/testctrl+C 取消请求
然后观察waf的日志,以及kong的日志,跟生产出现的499错误码表现是一样的。
基本上确定是客户端主动断开连接引起的。

修改配置 Nginx的配置

看一下proxy_ignore_client_abort说明

Syntax:	proxy_ignore_client_abort on | off;
Default:	
proxy_ignore_client_abort off;
Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.

确定当客户端在不等待响应的情况下关闭连接时,是否应该关闭与代理服务器的连接。
客户端不等待响应关闭连接时,默认会关闭与代理服务器的连接,改为on就是代理服务器不关闭,直到代理服务器处理完请求。
在kong上修改配置
proxy_ignore_client_abort on
改了一台机器,观察了一天,确定了是因为这个配置,后面把两台机器都改了之后就没有再出现499的错误码。修改了这个配置之后,尽管错误码消失了,但是无效的请求会增加上游服务的压力,本来这个请求已经无意义被客户端关闭了,然后上游服务也被关闭了。打开之后,上游服务不会被关闭,直到请求处理完毕,有利有弊,需要权衡和取舍。

到此这篇关于nginx 客户端返回499的错误码的文章就介绍到这了,更多相关nginx返回499错误码内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Nginx缓存文件与动态文件自动均衡的配置脚本

    Nginx缓存文件与动态文件自动均衡的配置脚本

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。这篇文章主要介绍了Nignx缓存文件与动态文件自动均衡的配置,需要的朋友可以参考下
    2018-09-09
  • Nginx配置多个HTTPS域名的方法

    Nginx配置多个HTTPS域名的方法

    本篇文章主要介绍了Nginx配置多个HTTPS域名的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • nginx 配置跨域失效修复的方法示例

    nginx 配置跨域失效修复的方法示例

    这篇文章主要介绍了nginx 配置跨域失效修复的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 如何配置nginx作为静态文件托管服务器

    如何配置nginx作为静态文件托管服务器

    这篇文章主要介绍了如何配置nginx作为静态文件托管服务器的相关资料,下载nginx在windows上是个压缩包,解压后,使用命令行输入nginx进行启动,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • 通过nginx实现方向代理过程图解

    通过nginx实现方向代理过程图解

    这篇文章主要介绍了通过nginx实现方向代理过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 学习nginx基础知识

    学习nginx基础知识

    这篇文章主要介绍了nginx基础知识,文中运用了大量的图片和代码进行讲解,对相关知识感兴趣的小伙伴可以参考一下这篇文章
    2021-09-09
  • nginx?负载均衡轮询方式配置详解

    nginx?负载均衡轮询方式配置详解

    负载均衡(load-balance)就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验,本文给大家介绍nginx?负载均衡轮询方式配置,感兴趣的朋友一起看看吧
    2022-03-03
  • nginx ip黑名单动态封禁的例子

    nginx ip黑名单动态封禁的例子

    今天小编就为大家分享一篇nginx ip黑名单动态封禁的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Nginx配置解决NetCore的跨域问题

    Nginx配置解决NetCore的跨域问题

    跨域资源共享(CORS)标准新增了一组?HTTP?首部字段,允许服务器声明哪些源站有权限访问哪些资源,这篇文章主要介绍了Nginx配置解决NetCore的跨域问题,需要的朋友可以参考下
    2022-07-07
  • Nginx实现前后端分离

    Nginx实现前后端分离

    本篇文章是小编整理的关于Nginx实现前后端分离的详细代码,如果你对此有需要,可以参考测试下。
    2018-02-02

最新评论

?


http://www.vxiaotou.com