你真的用上keepalive了吗
转自http://qa.blog.163.com/blog/static/19014700220134771052763/
Keep-Alive即俗称的长连接,使客户端到服务端建立的连接持续有效,当对服务器发起后续请求时,Keep-Alive功能可以复用先前使用过的连接,减少了重新建立连接所需的开销。通常使用HTTP协议采用的是请求应答模式,客户端到服务端的一次请求完成了,它们之间的连接也随之关闭。在某些应用场景下,比如后端RESTful服务,就需要保持住连接,这时就可以启用HTTP Keep-Alive。
下图就是一个比较常见的服务架构。后端服务器提供RESTful服务,需要和前端服务器保持有限的长连接。由于中间架设了代理服务器,即需要前端服务器和代理之间,代理和后端服务器之间都保持连接。另外,最终用户也可以通过浏览器方便地访问后端服务,不过这两者之间就不需要保持连接了。
图1:典型实例
下面主要介绍一个实例,其中代理服务器以nginx为例,后端服务器以tomcat为例。在这种情况下,对tomcat来说nginx是它的一个client,因此我们需要配置nginx的upstream模块
|
upstream backend { server tomcat_ip:8080; } |
但是很奇怪,我们用ss -s在服务器上观察到了很多closed或者time_wait状态的TCP连接,似乎长连接并没有生效。
在tomcat的监听端口上用tcpdump抓包确认一下
|
sudo tcpdump tcp -i eth1 -t -s 0 -c 10000 and port 8080 -w tomcat.cap |
把tomcat.cap导入到wireshark可以方便我们分析,追踪一个流看看,如下图,红色部分为请求,蓝色为应答,下同

从请求和应答都存在HTTP头Connection: Keep-Alive上判断,我们的客户端已经使用了正确的协议。但在这个TCP连接上确实只处理了一次请求,如果Keep-Alive生效,TCP连接上应该存在多次请求应答。下图断开连接后重连的过程也间接说明了这点。

类似的,通过在nginx的监听端口上抓包排除了客户端的问题,如下图,在这个TCP连接上处理了多次请求。因此,应该从nginx上去找原因。

最终找到是Nginx的upstream模块未配置keepalive的原因,摘录官方文档的说明如下。该参数开启与上游服务器之间的连接池,其数值为每个nginx worker可以保持的最大连接数,默认不设置,即nginx作为客户端时keepalive未生效。
|
Activates cache of connections to upstream servers The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are retained in the cache per one worker process. When this number is exceeded, the least recently used connections are closed |
设置该参数后
|
upstream backend { server tomcat_ip:8080; keepalive 256; } |
重新测试并验证,结果如下图所示

此时继续用ss –s观察服务器的连接状态,仍然会出现连接关闭的情况。这又是什么原因呢?求助google大神,发现还是配置问题。
|
位置 |
参数名 |
默认值 |
|
|
Tomcat |
Server.xml |
Connector标签下的maxKeepAliveRequests |
100 |
|
Nginx |
Server模块 |
keepalive_requests |
100 |
表1:keepalive requests配置
两者都是其作为server时生效的配置,即作为server当在一个keepalive的连接上请求次数超过该配置值,server会断开连接,即使它是keepalive的。当然server端判断一个keepalive连接是否需要关闭的依据还有超时时间,这里不详细说明了。
好了,就是这样,看来简单的一个Keep-Alive概念,在实际应用中要用对也是十分不易的。
你真的用上keepalive了吗的更多相关文章
- centos7上keepalived的安装和配置
1.环境规划1)master:node1,centos7.5,eth0:192.168.1.11,eht1:10.10.1.11,keepalive2)backup:node1,centos7.5,e ...
- 上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传)
上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传) 最近在阿里云上面租了一个轻量级服务器玩玩,学习学习怎么在服务器部署网站.然后嘞,在想要将本地文件上传到服务器的时候,自己研究 ...
- vue keep-alive 遇见 vue-router
keep-alive 遇见 vue-router ·keep-alive 是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 ·routre-view也是一个组件,如果直接被包在kee ...
- 搭建vpn环境:centos7+openvpn
vpn的含义:virtual private network vpn的作用/使用场景:最常见的一个作用,你通过公网来访问某个局域网里的主机/服务,其实就是搭建一个隧道,用公网传递你的数据包,等数据包到 ...
- 非技术1-学期总结&ending 2016
好久好久没写博客了,感觉动力都不足了--12月只发了一篇博客,好惭愧-- 今天是2016年最后一天,怎么能不写点东西呢!! 学期总结 大学中最关键一年的第一个学期,共4个月.前20天在学网络方面的,当 ...
- 遭遇Web print
一直都知道Web打印还不太成熟,以前IE横行时,普遍都是采用打印相关的ActiveX控件,有些国产厂家做得不错,只是那时还没有付费能力,没有太多关注.而纯粹基于Web标准的打印,浏览器对CSS pri ...
- VR技术的探索阶段
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 早在1929年,在长期使用教练机训练器(机翼变短,不能产生离开地面所需的足够提升力)进行飞行训练之后,E ...
- 浅谈HTTP事务的一个过程
一个腾讯在职的朋友问道,当我们在浏览器的地址栏输入 www.baidu.com ,然后回车,这一瞬间页面发生了什么?下面以谷歌浏览器一一解释. 一.域名解析 首先Chrome浏览器会解析www.bai ...
- C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
最熟悉的陌生人 作者:张慧桥 “枪与玫瑰” 我送走了“蝶恋花”,犹有一种身在梦中的感觉,昨晚的宿醉让我只觉得头晕乎乎的很不舒服,想想自己连澡都还没洗呢,便去洗了个冷水澡. 煮了杯浓浓的咖啡喝了下去,我 ...
随机推荐
- arcgis api for silverlight使用google map等多个在线地图
原文 http://blog.csdn.net/leesmn/article/details/6820245 无可否认,google map实在是很漂亮.可惜对于使用arcgis api for si ...
- Linux系统编程(6)——文件系统
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数 ...
- 【转】如何定制android源码的编译选项 & 后期安装? ---- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd0100z3o9.html Android编译过程比较长,配置起来也很麻烦.现仅就工作遇到的问题做个总结.所用硬 ...
- java中classPath和Xpath问题
java中classPath和Xpath问题 今天遇到一个问题想获取classpath对应的目录,开始还以为java源代码可以像spring配置文件.xml中一样通过classpath:来获取对应的路 ...
- 如何理解 css3 的 perspective 属性
一.写在前面的话 最近想多了解一下CSS3的transform 3D效果,transform:英文直译就是转换,它可以实现旋转.缩放.位移等效果,听起来有没有觉得很酷的样子,狠狠的点这里来看看旋转和位 ...
- LINUX下 Udev详解
如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...
- Android学习总结——Service组件
从Service的启动方式上,可以将Service分为Started Service和Bound Service.在使用Service时,要想系统能够找到此自定义Service,无论哪种类型,都需要在 ...
- CentOS6.5下使用NetHogs监控进程网络使用情况
Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于能够显示每一个进程的带宽占用情况,这样能够更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. ...
- 【输入输出挂】【Uva11462】Age Sort
例题17 年龄排序(Age Sort, UVa 11462)照从小到大的顺序输出. [输入格式] 输入包含多组测试数据.每组数据的第一行为整数n(0<n≤2 000 000),即居民总数:下一 ...
- MySQL整数类型说明 int(11) vs int(20)
整数类型后面跟的是显示的宽度.M指示最大显示宽度.最大有效显示宽度是255.显示宽度与存储大小或类型包含的值的范围无关. 实践出真知: mysql> create table test2 ( a ...