记一次服务器timewait事件
之前一直没怎么关注过TCP,直到公司这次的事件,这才开始慢慢去研究,去学习TCP的相关知识,中间也尝试了很多方法,走了很多弯路,因此记下这篇文章,方便以后回顾
首先说下网络架构
Nginx和jetty都在同一个服务器,Nginx代理HTTP流量至多个jetty应用,基本情况就是这样
首先我们来看下,为什么会有TIMEWAIT的状态
客户端主动关闭连接时,会发送最后一个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的状态大量减少。
总结:我们在遇到问题的时候,百度遇到的解决方案一定要仔细分析,千万不能随随便便就使用,因为别人的环境跟你的有可能不一样,即便当时能够解决问题,后面引发的问题,可能更加难以发现和解决。
还有我们遇到问题要多想,千万不能自以为是什么什么原因,要有事实依据,才能找到更好的解决方案
最后欢迎大家一起交流和学习。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Linux下用于查看系统当前登录用户信息的4种方法
Linux下用于查看系统当前登录用户信息的4种方法 作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法。 1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp文件。w命令输出的信息包括:?用户名称 ?用户的机器名称或tty号 ?远程主机地址 ?用户登录系统的时间 ?空闲时间(作用不大) ?附加到tty(终端)的进程所用的时间(JCPU时间) ?当前进程所用时间(PCPU时间) ?用户当前正在使用的命令 w命令还可以使用以下选项?-h忽略头文件信息 ?-u显示结果的加载时间 ?-s不显示JCPU, PCPU, 登录时间$ w23:04:27 up 29 days, 7:51, 3 users, load average: 0.04, 0.06, 0.02USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATramesh pts...
- 下一篇
活动目录父子域用户迁移之:TFS&SharePoint问题汇总(一)
前段时间做了个项目,是关于父子域合并的,其实无非就是使用ADMT把域用户,计算机等从子域迁移到父域上,看似迁移用户很简单。But……生产环境啊,Exchange,TFS,Sharepoint,还有其余乱七八糟的东西,都使用了域账号,牵一发动全身的节奏,迁移账号出点儿问题相关用户就可以坐在那打酱油了,迁移前在他们生产环境中新建测试账号迁移,但是这种测试账号相对理想的环境,测试过程中很多问题不容易发现,很多问题是迁移了客户生产用户账号时出现了问题,但是于对于TFS一窍不通,sharepoint大多不懂的我来说,对迁移遇到的问题排错,那叫一个惨绝人寰啊!下面慢慢的把迁移账号及计算机后会遇到的问题及问题解决方法做个简单汇总吧。 先说说客户环境,由于不便透露客户名称,域控就以ABC来代替吧。客户生产环境为一个父域两个子域,这里父域为A,两个子域B和C(都是N年前的历史问题搞了三个域控出来,现在又要合并只保留A)。TFS在三个域控中都有存在。 对于TFS来说,这东西貌似主要就做代码管理的,客户生产环境中,TFS从2008到2010还有2013,各种版本层出不穷的,这里把TFS和SharePoint...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作