最近都在折腾 Nginx 服务器的学习和测试,前几天稍微温习了一下计算机网络方面的知识(一方面是兴趣,一方面是此次学习过程当中由于这些计算机基础遗忘,有不少细节问题让人很懵逼),也在 Linux 上试了一下 tcpdump
命令,经过抓包来验证本身以前的各类猜测(由于不懂因此瞎猜),分析数据包依旧是用的 Wiresharkgit
以前一直觉得只要使用 Http1.1 协议就能够复用链接,节省反复握手挥手的时间消耗,但抓包后才发现,"简简单单"的长链接使用,还真是涉及了 Nginx 、 JMeter 、 Tomcat 里的不少配置啊github
keepalive_timeout
和 keepalive_requests
,与后端服务器的配置 keepalive
(1.15.3以后,upstream 模块也新增了 keepalive_timeout
和 keepalive_requests
,本篇暂不涉及)keepAliveTimeout
配置知道了这些相关配置后,一方面想实战下 tcpdump
和 Wireshark 的使用,一方面也想用数据验证下 Nginx 的这三个配置,因此就有了接下来的内容web
语法: keepalive_timeout timeout [header_timeout];默认值: keepalive_timeout 75s;apache
上下文: http, server, location后端
第一个参数设置客户端的长链接在服务器端保持的最长时间(在此时间客户端未发起新请求,则长链接关闭)。 第二个参数为可选项,设置“Keep-Alive: timeout=time”响应头的值。 能够为这两个参数设置不一样的值。浏览器
“Keep-Alive: timeout=time”响应头能够被 Mozilla 和 Konqueror 浏览器识别和处理。 MSIE 浏览器在大约60秒后会关闭长链接。缓存
keepalive_timeout = 1服务器
客户端持续发起 http 请求,且不主动关闭链接,观察链接的释放时间网络
用 JMeter 测试时发现不能维持长链接,在请求结束时都由 JMeter 本身发起链接关闭,按官方 wiki 说明修改 jmeter.properties 和 user.properties 中的相关配置,测试一下没看到生效,最后仍是用 Apache 的 HttpClient 本身写了点代码才作了这个测试curl
代码中循环启动多个线程,每一个线程启动后不间断发起10次请求,且执行后没有主动关闭 client 和 response
如上所述,测试客户端发起数次请求,请求结束时没有关闭链接(这里有个小问题,链接没有复用,多是须要配置 client 链接池,我暂时没去折腾)
1秒(超时)后,由 Nginx 服务器发起关闭请求
语法: keepalive_requests number默认值: keepalive_requests 100
上下文: http, server, location
这个指令出如今版本 0.8.0
设置经过一个长链接能够处理的最大请求数。 请求数超过此值,长链接将关闭。
keepalive_requests = 5
使用 curl
命令,发送8次(多于 keepalive_requests 个数的)请求,观察请求5次后链接是否断开
最初使用 for 循环执行 curl
命令,发现命令执行完就马上释放了链接,在网上查了下,能够在一个命令里访问屡次,例如:
curl http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi http://172.16.40.224:6066/NginxTest/hi
这样的话,就会等8次请求都结束,才关闭链接
能够看出第一个 TCP 链接共发起了5次 Http 请求,紧接着由 Nginx 发起了关闭
第二个 TCP 链接发起了剩余的3次 Http 请求,紧接着由客户端发起了关闭
语法: keepalive connections默认值: —
上下文: upstream
这个指令出如今版本 1.1.4
connections 参数设置每一个 worker 进程与后端服务器保持链接的最大数量。这些保持的链接会被放入缓存。 若是链接数大于这个值时,最久未使用的链接会被关闭。
keepalive = 10
用 JMeter 启动多于 keepalive 个数的测试进程,观察测试结束后的链接关闭状况
使用 JMeter 的 GUI 客户端编辑一个测试脚本开启50个进程,循环测试120秒
能够看出截至118秒(JMeter 逐渐中止发起测试请求),都在逐个关闭 TCP 链接,截图部分大都是后端服务器响应的 FIN 包,稍微往前一点能看到都是由 Nginx 主动发起的关闭请求
从138秒开始(后端 Tomcat 服务器的长链接超时时间默认20秒),剩余的10个长链接被后端服务器发起了关闭请求
测试过程涉及到的 tcpdump
命令是
sudo tcpdump -i eth0 host 172.16.40.xxx -w dumplog.pcap -i 指定网卡 host 指定抓取和哪一个 IP 之间的数据包 -w 将抓取结果保存到 pcap 文件,用于使用 Wireshark 查看
经过上面的三个测试,理解和验证了 Nginx 分别在面向客户端和面向后端服务器时的长链接使用状况
文章首发于我的博客《验证Nginx的长链接(keepalive)配置》