验证Nginx的长链接(keepalive)配置

写在前面

最近都在折腾 Nginx 服务器的学习和测试,前几天稍微温习了一下计算机网络方面的知识(一方面是兴趣,一方面是此次学习过程当中由于这些计算机基础遗忘,有不少细节问题让人很懵逼),也在 Linux 上试了一下 tcpdump 命令,经过抓包来验证本身以前的各类猜测(由于不懂因此瞎猜),分析数据包依旧是用的 Wiresharkgit

以前一直觉得只要使用 Http1.1 协议就能够复用链接,节省反复握手挥手的时间消耗,但抓包后才发现,"简简单单"的长链接使用,还真是涉及了 Nginx 、 JMeter 、 Tomcat 里的不少配置啊github

  • JMeter 虽然在 Http 请求的配置中默认勾选了使用 KeepAlive,可是实际使用中并无生效
  • Nginx 涉及到与客户端的配置 keepalive_timeoutkeepalive_requests,与后端服务器的配置 keepalive(1.15.3以后,upstream 模块也新增了 keepalive_timeoutkeepalive_requests,本篇暂不涉及)
  • Tomcat 默认也有一个 keepAliveTimeout 配置

知道了这些相关配置后,一方面想实战下 tcpdump 和 Wireshark 的使用,一方面也想用数据验证下 Nginx 的这三个配置,因此就有了接下来的内容web


环境说明

  • Nginx 1.14.0
  • Linux 2.6.32
  • JMeter 5.0
  • Wireshark 2.6.4
  • JMeter 所在主机 IP 172.16.40.199
  • Tomcat 所在主机 IP 172.16.40.201
  • Nginx 所在主机 IP 172.16.40.224

0. 和客户端的长链接超时时间

指令说明

语法: 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

测试结果

验证keepalive_timeout.png

结果说明

如上所述,测试客户端发起数次请求,请求结束时没有关闭链接(这里有个小问题,链接没有复用,多是须要配置 client 链接池,我暂时没去折腾)

1秒(超时)后,由 Nginx 服务器发起关闭请求


1. 和客户端的长链接请求次数

指令说明

语法: 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次请求都结束,才关闭链接

测试结果

验证keepalive_requests.png

结果说明

能够看出第一个 TCP 链接共发起了5次 Http 请求,紧接着由 Nginx 发起了关闭

第二个 TCP 链接发起了剩余的3次 Http 请求,紧接着由客户端发起了关闭


2. 和后端服务器的长链接个数

指令说明

语法: keepalive connections

默认值: —

上下文: upstream

这个指令出如今版本 1.1.4

connections 参数设置每一个 worker 进程与后端服务器保持链接的最大数量。这些保持的链接会被放入缓存。 若是链接数大于这个值时,最久未使用的链接会被关闭。

测试计划

keepalive = 10

用 JMeter 启动多于 keepalive 个数的测试进程,观察测试结束后的链接关闭状况

测试过程

使用 JMeter 的 GUI 客户端编辑一个测试脚本开启50个进程,循环测试120秒

测试结果

验证keepalive.png

结果说明

能够看出截至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)配置》

相关文章
相关标签/搜索