记一次服务器timewait事件

之前一直没怎么关注过TCP,直到公司这次的事件,这才开始慢慢去研究,去学习TCP的相关知识,中间也尝试了很多方法,走了很多弯路,因此记下这篇文章,方便以后回顾


首先说下网络架构

wKioL1er6pXQqOp6AAGP92QX2TQ170.png-wh_50


Nginx和jetty都在同一个服务器,Nginx代理HTTP流量至多个jetty应用,基本情况就是这样


首先我们来看下,为什么会有TIMEWAIT的状态

734c7efd-3d62-3946-a234-acdddff3b507.jpg

客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间,进入CLOSED状态。

也就是说一般timewait只会出现在client中(因为主动关闭),server端是不会关闭连接的(以为一直在监听)


基于此,我查看了服务器的情况

发现nginx对外的tcp连接数状态是正常的,问题就在对于jetty的连接数异常的多,并且不释放


首先度娘解决方法,基本得到的结果基本就是一个修改内核参数(不推荐此做法)

net.ipv4.tcp_tw_reuse = 1 

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 

net.ipv4.tcp_tw_recycle = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭  

这样是可以快速的的回收socket,但是后来查询资料发现这样做有隐患

1.对于net.ipv4.tcp_tw_recycle ,Linux内核文档中实战和么描述的

tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)[译者注:来自linux man tcp的描述]

Enable fast recycling of TIME-WAIT sockets. Enabling this option is not recommended since this causes

problems when working with NAT (Network Address Translation).

启用TIME-WAIT状态sockets的快速回收,这个选项不推荐启用。在NAT(Network Address Translation)网络下,会导致大量的TCP连接建立错误。

2.有些文档中也说了对于手机端wifi访问的话,也会有问题,因为wifi端访问时间戳会乱跳,导致访问拒绝

基于以上2个隐患,所以没有使用此方法。


后来我再观察的时候,我发现nginx和jetty之间的连接大多都是短连接(因为默认nginx也是使用短连接),所以有可能是nginx作为client会快速释放,所以导致nginx的socket一直都是出于timewait状态,所以去nginx官网查看资料,配置nginx在负载均衡的时候使用长连接


具体配置为:

upstream localhost{          

……

keepalive 30;

  }

location / {

               ……           

            proxy_http_version 1.1;

            proxy_set_header Connection "";

        }

在server 的location模块里面 添加以上信息。

    注意:需要设置nginx 代理请求的 http 协议版本号为 1.1,  以及清除掉 Connection 请求header

官方文档描述:

For HTTP, the proxy_http_version directive should be set to “ 1.1 ”  and the  “Connection ”  header field should be cleared 

因为http协议1.1默认就使用长连接,所以不需要Connection的头部信息,这样打开nginx和jetty之间的长连接之后,timewait的状态大量减少。


总结:我们在遇到问题的时候,百度遇到的解决方案一定要仔细分析,千万不能随随便便就使用,因为别人的环境跟你的有可能不一样,即便当时能够解决问题,后面引发的问题,可能更加难以发现和解决。

还有我们遇到问题要多想,千万不能自以为是什么什么原因,要有事实依据,才能找到更好的解决方案

最后欢迎大家一起交流和学习。

本文出自 “Linux is belong to you” 博客,请务必保留此出处http://jwh5566.blog.51cto.com/7394620/1836792

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
因为都知道安装linux软件包rpm 很好用;但是不能解决软件包的个别依赖关系;所以安装数据包时出现依赖时、yum到可以解决这类数据包依赖关系;而且还能便于管理大量数据包更新的问题;它的特点 、可以同时配置多个资源库(Repository) ,简洁的配置文件(/etc/yum.conf) ,自动解决增加或删除rpm包时遇到的倚赖性问题,保持与RPM数据库的一致性这也是它的优势。因此解决数据包的依赖关系;也是基于服务器和客户端的一种应用。 首先呢 介绍一下YUM 的简单指令: yum info // 查询详
最近在做一个Exchange升级的项目,在部署Exchange Server 2016之前需要将现有环境的Exchange 2010 SP1更新至Exchange Server 2010 SP3RU11或更新的版本中。在更新完SP3+RU11后发现登录OWA时出现异常,在最开始初步以为是RU11的问题,但是卸载后RU11还是一样的问题,所以当时排除是花了比较长的时间的。如下是本次的现象和最后解决的办法供大家参考。 升级至SP3+RU11重启后发现有时可以登录OWA但是点击“新建“邮件时提示 ”无法完成您的
谁说Lync Server 前端不可以使用Windows网络负载平衡实现高可用的?(仅限测试环境) 本章内容有: 1.两台Lync Server安装Windows功能---网络负载平衡 2.配置网络负载平衡 3.DNS记录修改 4.测试故障切换(模拟两种故障,网络故障和服务故障) 5.开始的时候别忘了上一章中的提示,将两台前端Server都进行重启 = = 安装网络负载平衡 两台服务器都需要进行安装 = = 配置网络负载平衡 1)新建群集 2)将LyncFE01先添加到群集中 3)群集IP自己随便填写 4
建立完存储池之后,创建虚拟硬盘的时候,在此虚拟磁盘上创建存储层无法勾选,原因是windows系统识别不出来RAID卡下的硬盘,显示未知如图: 解决办法:powershell 运行在管理员模式下,用下面两条命令(视情况使用其中一条命令即可)。 set-physicaldisk -friendlyname physicaldisk3(看名称自己改) -mediatype hdd (转换磁盘类型为HDD) set-physicaldisk -friendlyname physicaldisk3(看名称自己改)-

CentOS yum源配置小技巧 - 2016-08-22 17:08:05

一、配置yum源 网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错,将yum源设置为163yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。具体设置方法如下: 1,进入yum源配置目录 #cd/etc/yum.repos.d 2,备份系统自带的yum源 #mvCentOS-Base.repoCentOS-Base.repo.bk 下载163网易的yum源: #wgethttp://mirrors.163.com/.help/CentOS6-Ba

运维监控平台之zabbix详解1 - 2016-08-22 14:08:36

本来是想一篇文章介绍完的,写着写着发现篇幅太长,所以决定还是分两篇来介绍,本次软件所用的版本信息如下(基于LNMP环境),操作系统centos6.7 nginx-1.6.3.tar.gz php-5.6.24.tar.gz mysql-5.5.49-linux2.6-x86_64.tar.gz zabbix-3.0.4.tar.gz (zabbix-3以上版本之支持php5.4以上环境) LNMP环境搭建不再这里说明了,如果不懂的看本人之前写的nginx+php,这里简单介绍下php编译 [root@ce
一、准备工作 CentOS6.4 服务器2台(1台用做IP-SAN存储服务器,1台做流媒体服务器) iSCSITatget 软件 iSCSI Initiator 二、安装iSCSI target软件(IP-SAN服务器) Iscsitarget下载地址为:http://iscsitarget.sourceforge.net[root@iscsi-targetiscsi]#tar-xzvfiscsitarget-1.4.20.1.tar.gz[root@iscsi-targetiscsi]#cdiscsit

Mongodb被动(passive)节点配置 - 2016-08-22 14:08:01

将一个mongodb的普通数据节点修改为passive节点,也就是能同步数据、投票,但是不能成为primary节点。 除了仲裁节点,其他每个节点都有个代表优先权priority的值,我们可以通过设置优先权来决定谁成为primary的权重最大。 MongoDB replica sets中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。 如果值是0,那么不能成为primay。 通过rs.conf()命令查看出节点列表: 以下为我的实验mongodb集群: PRI

运维监控平台之zabbix详解2 - 2016-08-22 14:08:01

1、Zabbix架构 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 Zabbix的运行架构如下图所示: 2、组件 zabbix由以下几个组件部分构成: 1)、Zabbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行; 2)、Database Storage:专用于存储所有配置信息,

nginx代理websocket配置 - 2016-08-22 14:08:47

nginx正常只能代理http请求,如果想实现代理websocket的需求,需在请求中加入"Upgrade"字段,使请求从http升级为websocket。 配置如下: http{map$http_upgrade$connection_upgrade{defaultupgrade;''close;}server{...location/chat/{proxy_passhttp://backend;proxy_http_version1.1;#以下配置添加代理头部:proxy_set_headerUpgra