转自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. 前台利用jcrop做头像选择预览,后台通过django利用Uploadify组件上传图最终使用PIL做图像裁切

    之前一直使用python的PIL自定义裁切图片,今天有需求需要做一个前端的选择预览页面,索性就把这个功能整理一下,分享给大家. 实现思路: 1.前端页面: 用户选择本地一张图片,然后通过鼠标缩放和移动 ...

  2. 更新ORACLE数据时遇到锁死情况的处理

    我们在操作数据库的 时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以 ...

  3. JDBC官方用法

    JDBC官方用法https://bitbucket.org/xerial/sqlite-jdbc/#markdown-header-usage 代码下载https://github.com/xeria ...

  4. SQL递归查询实现跟帖盖楼效果

    网易新闻的盖楼乐趣多,某一天也想实现诸如网易新闻跟帖盖楼的功能,无奈技术不佳(基础不牢),网上搜索了资料才发现SQL查询方法有一种叫递归查询,整理如下: 一.查询出 id = 1 的所有子结点 wit ...

  5. Struts2使用Interceptor实现权限控制的应用实例详解

    Struts2使用Interceptor实现权限控制的应用实例详解 拦截器:是Struts2框架的核心,重点之重.因此,对于我们要向彻底学好Struts2.0.读源码和使用拦截器是必不可少的.少说了. ...

  6. 基于angularJS和requireJS的前端架构

    1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...

  7. 【数位DP】【HDU2089】不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. JS中表格的全选和删除要注意的问题

    在项目开发中,由于刚刚开始做项目,我对js还不是很精通,所以在用js对表格的全选和删除中遇到了不少问题,后来通过查找资料解决了,之后总结了一下关于js表格的全选和删除出现的一些问题,希望能帮助到大家. ...

  9. sql 成绩表 case then

    select * from  dbo.tb_Scroe select Name,(select count(*) from tb_Scroe where Name = t.Name and Scroe ...

  10. Hibernate 查询:HQL查询(Hibernate Query Languge)

    HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念. 使用HQL查询所有学生: public static void main(String[] args) { Sess ...