转自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可以方便我们分析,追踪一个流看看,如下图,红色部分为请求,蓝色为应答,下同

 
图2:from nginx to tomcat TCP stream(keepalive未生效)

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

 
 图3:断开后重连过程的TCP报文

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

 
 图4:from client to nginx TCP stream(keepalive生效)

最终找到是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;

}

重新测试并验证,结果如下图所示

 
 图5:from nginx to tomcat TCP stream(keepalive生效)

此时继续用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了吗的更多相关文章

  1. centos7上keepalived的安装和配置

    1.环境规划1)master:node1,centos7.5,eth0:192.168.1.11,eht1:10.10.1.11,keepalive2)backup:node1,centos7.5,e ...

  2. 上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传)

    上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传) 最近在阿里云上面租了一个轻量级服务器玩玩,学习学习怎么在服务器部署网站.然后嘞,在想要将本地文件上传到服务器的时候,自己研究 ...

  3. vue keep-alive 遇见 vue-router

    keep-alive 遇见 vue-router ·keep-alive 是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 ·routre-view也是一个组件,如果直接被包在kee ...

  4. 搭建vpn环境:centos7+openvpn

    vpn的含义:virtual private network vpn的作用/使用场景:最常见的一个作用,你通过公网来访问某个局域网里的主机/服务,其实就是搭建一个隧道,用公网传递你的数据包,等数据包到 ...

  5. 非技术1-学期总结&ending 2016

    好久好久没写博客了,感觉动力都不足了--12月只发了一篇博客,好惭愧-- 今天是2016年最后一天,怎么能不写点东西呢!! 学期总结 大学中最关键一年的第一个学期,共4个月.前20天在学网络方面的,当 ...

  6. 遭遇Web print

    一直都知道Web打印还不太成熟,以前IE横行时,普遍都是采用打印相关的ActiveX控件,有些国产厂家做得不错,只是那时还没有付费能力,没有太多关注.而纯粹基于Web标准的打印,浏览器对CSS pri ...

  7. VR技术的探索阶段

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 早在1929年,在长期使用教练机训练器(机翼变短,不能产生离开地面所需的足够提升力)进行飞行训练之后,E ...

  8. 浅谈HTTP事务的一个过程

    一个腾讯在职的朋友问道,当我们在浏览器的地址栏输入 www.baidu.com ,然后回车,这一瞬间页面发生了什么?下面以谷歌浏览器一一解释. 一.域名解析 首先Chrome浏览器会解析www.bai ...

  9. C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 “枪与玫瑰” 我送走了“蝶恋花”,犹有一种身在梦中的感觉,昨晚的宿醉让我只觉得头晕乎乎的很不舒服,想想自己连澡都还没洗呢,便去洗了个冷水澡. 煮了杯浓浓的咖啡喝了下去,我 ...

随机推荐

  1. 关于link, visited, hover, active

    LoVe/HAte 如果只是希望点击的时候显示背景色,那么只需要设置 :active,无需设置:hover #navbar:active, #backbtn:active { background-c ...

  2. 嵌入式系统USB CDROM虚拟光驱驱动程序开发

    带U盘功能的的USB接口设备已经越来越常见了.如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM,那该多方便.假设:你已经有了USB mass storage驱动.你的任务是在此基础上 ...

  3. ArcGIS API for Silverlight中专题地图的实现浅析

    原文http://www.gisall.com/html/32/7232-2418.html 专题地图是突出表现特定主题或者属性的地图.常见专题地图类型有唯一值渲染,分类渲染,柱状图,饼状图,点密度图 ...

  4. shell字符串

    字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 单引号 str='this ...

  5. 项目中Spring注入报错小结

    之前在做单元测试时采用注解方式进行service对象的注入,但运行测试用例时对象要注入的service对象总是空的,检查下spring配置文件,我要配置的bean类xml文件已经包含到spring要加 ...

  6. CentOS7安全设置 yum-cron系统自动更新,firewalld防火墙简单使用

    PermitRootLogin nosystemctl restart sshd.service; yum -y install firewalld; systemctl start firewall ...

  7. sh_脚本语法

    介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编写脚 ...

  8. 谱聚类--SpectralClustering

    谱聚类通常会先对两两样本间求相似度. 然后依据相似度矩阵求出拉普拉斯矩阵,然后将每一个样本映射到拉普拉斯矩阵特诊向量中,最后使用k-means聚类. scikit-learn开源包中已经有现成的接口能 ...

  9. 使用disqus搭建comment时一件非常二的事

    近期在github 上面搭建自己的博客,搭建comment部分的时候出现了一个问题:配置都配置好了,可是comment就是不成功.昨天为这个问题折腾了了半晚上没找出原因,今天晚上我突然发现一个地方设置 ...

  10. linux光盘、U盘的挂载与卸载

    mount [-t vfstype] [-o options] device dir1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类型.关于一些常用的文件:i ...