当前位置: 首页 > article >正文

Nginx中使用keepalive实现保持上游长连接实现提高吞吐量示例与测试

场景

HTTP1 .1之后协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,

减少了建立和关闭连接的消耗和延迟。

如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被转换成短连接发送给服务器端。

为了支持长连接,我们需要在nginx服务器上做一些配置。

在 upstream 上下文中使用 keepalive 指令,保持上游服务器连接开放以供复用:

此处可参考官方文档:

Module ngx_http_upstream_module

注:

博客:
霸道流氓气质-CSDN博客

实现

1、构件测试环境,首先启动一个tomcat服务,然后用nginx代理为上游服务器,测试不加与加keepalive情况下的吞吐量

使用Docker部署最新版Tomcat

拉取镜像

docker pull tomcat

启动容器

docker run -itd  --name my-tomcat2 -p 800:8080 tomcat

注意最新版的tomcat使用docker启动后访问端口会提示404,这是有因为容器内webapps目录为空,改成了webapps.dist目录

进入容器并修改目录

docker exec -it my-tomcat-container /bin/bash

删除webapps目录,并将webapps.dist目录重命名为webapps:

rm -rf webapps && mv webapps.dist webapps

重启容器此时访问tomcat正常。

2、使用nginx配置代理到上游服务器tomcat

修改nginx的配置文件

​
 upstream test {
  server 192.168.8.129:800;
 }

 server {
        listen       800;
        server_name  127.0.0.1;

  
  location / {
   proxy_pass http://test;
  }
  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

​

这里的800为上面docker启动的tomcat的路径的端口

启动nginx,验证代理前后的地址均访问正常

3、使用JMeter进行压测

使用教程参考如下:

Jmeter进行http接口压力测试:

Jmeter进行http接口压力测试_接口压测两万量-CSDN博客

测试时线程组分配50线程数,循环次数100

查看聚合报告可知结果为

然后在nginx的配置文件中添加keepalive的配置

​
 upstream test {
  server 192.168.8.129:800;
  keepalive 32;
 }

 server {
        listen       800;
        server_name  127.0.0.1;

  
  location / {
   proxy_pass http://test;
   proxy_http_version 1.1;
   proxy_set_header Connection "";

  }
  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

​

按照官方文档说明,需要增加三个地方

upstream中有一个参数比较重要,就是keepalive,代表连接池里面最大的空闲连接数量。

keepalive这个参数设置一定要小心,尤其是对于QPS要求比较高或者网络环境不稳定的场景,

一般根据QPS值和平均响应时间能大致推算出需要的长连接数量。

然后将keepalive设置为长连接数量的10%到30%。

HTTP协议中对长连接的支持是从1.1版本之后才有的,因此最好通过proxy_http_version指令设置为1.1。

HTTP1.0不支持keepalive特性,当没有使用HTTP1.1的时候,后端服务会返回101错误,然后断开连接。

而"Connection" header可以选择被清理,这样即便是Client和Nginx之间是短连接,Nginx和upstream之间也是可以开启长连接的。

此时再使用jmeter进行测试


http://www.kler.cn/a/393416.html

相关文章:

  • 使用Docker快速部署FastAPI Web应用
  • 【MySQL】约束
  • 使用elementUI实现表格行拖拽改变顺序,无需引入外部库
  • 使用 start-local 脚本在本地运行 Elasticsearch
  • C++单例模式实现
  • Java设计模式面试题及参考答案
  • 如何为 SeaTunnel 配置 MySQL 用户并授予权限
  • 实景三维赋能智慧公安建设
  • sol机器人pump机器人如何实现盈利的?什么是Pump 扫链机器人?
  • 爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
  • ODOO学习笔记(8):模块化架构的优势
  • Java与HTML:构建静态网页
  • 提取神经网络数学表达式
  • 机器学习 ---模型评估、选择与验证(1)
  • 大数据治理:从概念到实践的旅程
  • 8. 基于 Redis 实现限流
  • 鸿蒙next版开发:ArkTS组件通用属性(组件标识)
  • vue计算属性 初步使用案例
  • 当下中小微企业该不该跟风「大模型热潮」?
  • 信创防泄露是什么?如何实现信创防泄露?
  • PVE纵览-Proxmox VE SDN入门指南:构建灵活的虚拟网络
  • 网站架构知识之Ansible进阶(day022)
  • 【网络工程】计算机硬件概述
  • 实习冲刺练习 第二十一天
  • Android Framework AMS(16)进程管理
  • Qt第三课 ----------布局