专栏首页日知录nginx 104 Connection reset by peer while reading upstream错误处理

nginx 104 Connection reset by peer while reading upstream错误处理

故障现象

1.看日志发现正常日志和错误日志比例几乎1:1 2.错误日志全部是104: Connection reset by peer) while reading upstream 3.看访问日志也没有其他http错误状态码

[root@VM_0_22_centos logs]# ls -lh
total 389M
-rw-r--r-- 1 work work 191M Oct 30 17:30 ttt.minminmsn.com_access.log
-rw-r--r-- 1 work work 199M Oct 30 17:30 ttt.minminmsn.com_error.log
[root@VM_0_22_centos logs]# tail -n 1  ttt.minminmsn.com_error.log
2020/10/30 17:30:27 [error] 14063#0: *807476828 readv() failed (104: Connection reset by peer) while reading upstream, client: 117.61.242.104, server: ttt.minminmsn.com, request: "POST /yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync HTTP/1.1", upstream: "http://192.168.8831:8081/ttt", host: "ttt.minminmsn.com"
[root@VM_0_22_centos logs]# cat ttt.minminmsn.com_access.log |awk '{print $9}'|sort |uniq -dc
1081274 200
      6 304
    125 400
  27482 404
    145 429
    106 499
      8 500

分析问题

1.连续责任人咨询业务场景发现客户端请求基本上都是POST请求,开始以为是上传大文件连接超时了,后来开发确认为了安全使用POST请求,所以并没有大文件上传 2.由于upstream重置连接了,就是说后端主动断开了连接,然后发现连接里有很多TIME-WAIT,应该是qps比较大的情况下,连接处理比较快还在断开连接中就显得比较多了 3.nginx作为反向代理既然是客户端又是服务端,当和后端服务建立连接时并没有默认开启长连接,开启长连接后性能应该会提升很多 4.默认开启长连接不需要keeplive参数,如下是nginx官网查寻的keepalive参数,看的不是很明白,不过有个链接讲的很清楚,他可以激活连接缓存,应该属于长连接性能优化类 5.keepalive参数值应该与qps有关,默认不需要设置太大,如果访问日志里面有5XX错误还得根据实际情况调整,以达到最优效果

下面是官网keeplaive参数解释 Syntax: keepalive connections; Default: — Context: upstream This directive appeared in version 1.1.4.

Activates the cache for connections to upstream servers.

The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.

It should be particularly noted that the keepalive directive does not limit the total number of connections to upstream servers that an nginx worker process can open. The connections parameter should be set to a number small enough to let upstream servers process new incoming connections as well. When using load balancing methods other than the default round-robin method, it is necessary to activate them before the keepalive directive.

处理方案

1.修改nginx配置开启长连接及结合连接缓存 2.重启nginx服务 主要配置如下

        upstream gateway{
            server 192.168.88.31:8081;
            server 192.168.88.44:8081;
            server 192.168.88.115:8081;
            server 192.168.88.80:8081;
            #以下是新增配置
            keepalive 100;
        }


        location / {
           proxy_pass http://gateway;
           proxy_set_header   Host             $host;
           proxy_set_header   X-Real-IP        $remote_addr;
           proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
           #以下是新增配置
           proxy_connect_timeout      120;   
           proxy_send_timeout         300;    
           proxy_read_timeout         300; 
           proxy_http_version 1.1;    
           proxy_set_header Connection ""; 
        }

检查效果

1.查看错误日志 错误日志清空后没有增长过

[root@VM_0_22_centos logs]# ls -lh
total 389M
-rw-r--r-- 1 work work 389M Oct 30 18:50 ttt.minminmsn.com_access.log
-rw-r--r-- 1 work work  446 Oct 30 18:10 ttt.minminmsn.com_error.log

2.查看连接数状态 长连接前TIME-WAIT比较多

[root@VM_0_22_centos logs]# ss -an |awk '{print $2}'|sort |uniq -dc |sort -rn
   5045 TIME-WAIT
    156 ESTAB
     62 UNCONN
     21 LISTE

长连接后TSTAB比较多

[root@VM_0_22_centos ~]# ss -an |awk '{print $2}'|sort |uniq -dc |sort -rn
    511 ESTAB
     62 UNCONN
     52 TIME-WAIT
     21 LISTEN

参考文档

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive https://www.cnblogs.com/sunsky303/p/10648861.html http://blog.51yip.com/apachenginx/2203.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Rancher集群部署后需要做的几件事

    1.添加LDAP认证 全局--安全--认证--编辑--启用OpenLDAP认证 设置仅允许授权的用户和组织,方便账号管理及安全使用

    zd123
  • TCP四层代理透传客户端真实IP

    最近公司准备自建邮箱,大概十年前折腾过自建邮箱的事情,感觉坑很多,这次体会了下确实很多,特别是现在管局对邮箱端口管控越来越严格的情况下,很多之前能行得通的方案需...

    zd123
  • Kubernetes核心组件运行机制

    总体来看,Kubernetes API Server的核心功能是提供Kubernetes各类资源对象(如Pod、RC、Service等)的增、删、改、查及Wat...

    zd123
  • Nginx 104 Connection reset by peer故障处理

    1.看日志发现正常日志和错误日志比例几乎1:1 2.错误日志全部是104: Connection reset by peer) while reading up...

    三杯水Plus
  • 用JMeter测试emqx服务器性能

      Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域...

    小老鼠
  • Android开发实践小结

    推荐的做法应该是在Androd项目中gradle.properties(如果没有则手动创建一个)文件中创建以下变量,这个文件是不会被版本控制系统提交的,所以不用...

    阳仔
  • 可以落地的DDD到底长什么样?

    ​  大家都知道软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前通常需要进行大量的业务知识梳理,然后才能到软件设计...

    阿豪聊干货
  • 业界 | 谷歌全新神经网络架构Transformer:基于自注意力机制,擅长自然语言理解

    选自Google Research Blog 机器之心编译 参与:路雪、黄小天、蒋思源 近日,继论文《Attention Is All You Need》之后,...

    机器之心
  • 美股遭血洗,科技股大跌

    10月10日,美国三大股指集体暴跌,标普指数连跌5日,创下了2015年以来首次“五连跌”。道指跌超过830点,创近两个月新低,纳指跌逾4%,创三个多月新低。并且...

    镁客网
  • 你所不知道的Webshell--基础篇

    企业对外提供服务的应用通常以Web形式呈现,因此Web站点经常成为攻击者的攻击目标。

    绿盟科技安全情报

扫码关注云+社区

领取腾讯云代金券