转自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. 【转】6.4.6 将驱动编译进Linux内核进行测试

    原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...

  2. windows phone中,将crash report记录下来,写入文件,方便分析

    APP出现crash(崩溃)总是不能忍的 当我们连接调试器调试的时候,发现每当APP崩溃的时候 程序都会走到App.xaml.cs中的 // Code to execute on Unhandled ...

  3. 电子科大POJ "3*3矩阵的乘法"

    3阶矩阵的乘法 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) c-source ...

  4. OpenWrt 学习网址

    http://m.blog.csdn.net/blog/woods2001/8137755

  5. sendto() 向广播地址发包返回errno 13, Permission denied错误

    http://blog.csdn.net/guanghua2_0beta/article/details/52483916 sendto() 向广播地址发包返回errno 13, Permission ...

  6. html 表格中文字的背景色

  7. Spring的AOP2

    本文是<AOP 那点事儿>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实用主义的方向在发展.沿着 Spri ...

  8. HDU 4614 Vases and Flowers (2013多校第二场线段树)

    题意摘自:http://blog.csdn.net/kdqzzxxcc/article/details/9474169 ORZZ 题意:给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每 ...

  9. sqlite数据库读写在linux下的权限问题

    近期在学linux,恰巧有个php项目要做.于是配置好环境打算在linux下做. 无奈站点执行后一片空白.经过调试发现是sqlite数据库的问题. 安装sqlite扩展 apt-get install ...

  10. VS2010+ICE3.5运行官方demo报错----std::bad_alloc

    纠结了一晚上,在release版本下运行没问题,一到debug就报错,卡在 Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWith ...