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

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.lryc.cn/news/484790.html

相关文章:

  • 深度学习-卷积神经网络CNN
  • 241114.学习日志——[CSDIY] [Cpp]零基础速成 [03]
  • 大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
  • 数据库SQL——什么是实体-联系模型(E-R模型)?
  • 在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
  • React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
  • 【CICD】GitLab Runner 和执行器(Executor
  • 实用教程:如何无损修改MP4视频时长
  • mysqldump命令搭配source命令完成数据库迁移备份
  • 生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)
  • 十三、注解配置SpringMVC
  • 为什么海外服务器IP会被封
  • 图像处理技术椒盐噪声
  • [笔记]L6599的极限工作条件考量
  • 机器学习基础04
  • Ubuntu 20.04 配置开发环境(持续更新)
  • Rocky9/Ubuntu使用pip安装python的库mysqlclient失败解决方式
  • 探索 HTML 和 CSS 实现的 3D旋转相册
  • OpenJudge_ 简单英文题_04:0/1 Knapsack
  • 深入探索离散 Hopfield 神经网络
  • [智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
  • 前端vue 列表中回显并下拉选择修改标签
  • hbase未来的发展趋势
  • Rust 语言学习笔记(二)
  • 【postman】怎么通过curl看请求报什么错
  • Python 编程入门指南(一)
  • macOS 设置固定IP
  • redis实现消息队列的几种方式
  • debian 系统更新升级
  • STM32学习笔记-----UART的概念