Nginx负载均衡之长连接负载均衡

        当客户端通过浏览器访问 HTTP 服务器时,HTTP 请求会通过 TCP 协议与 HTTP 服务器建立一条访问通道,当本次访问数据传输完毕后,该 TCP 连接会立即被断开,由于这个连接存在的时间很短,所以 HTTP 连接也被称为短连接。
        在 HTTP/1.1 版本中默认开启 Connection:keep-alive,实现了 HTTP 协议的长连接,可以在一个 TCP 连接中传输多个 HTTP 请求和响应,减少了建立和关闭 TCP 连接的消耗和延迟,提高了传输效率。网络应用中,每个网络请求都会打开一个 TCP 连接,基于上层的软件会根据需要决定这个连接的保持或关闭。例如,FTP 协议的底层也是 TCP,是长连接。
        默认配置下,HTTP 协议的负载均衡与上游服务器组中被代理的连接都是 HTTP/1.0 版本的短连接。

        Nginx 的连接管理机制如下图所示:

        相关说明如下:

        Nginx 启动初始化时,每个 Nginx 工作进程(Worker Process)会生成一个由配置指令 worker_connections 指定大小的可用连接池(free_connection pool)。工作进程每建立一个连接,都会从可用连接池中分配(ngx_get_connection)到一个连接资源,而关闭连接时再通知(ngx_free_connection)可用连接池回收此连接资源。
        客户端向 Nginx 发起 HTTP 连接时,Nginx 的工作进程获得该请求的处理权并接受请求,同时从可用连接池中获得连接资源与客户端建立客户端连接资源。
        Nginx 的工作进程从可用连接池获取连接资源,并与通过负载均衡策略选中的被代理服务器建立代理连接。
        默认配置下,Nginx 的工作进程与被代理服务器建立的连接都是短连接,所以获取请求响应后就会关闭连接并通知可用连接池回收此代理连接资源。
        Nginx 的工作进程将请求响应返回给客户端,若该请求为长连接,则保持连接,否则关闭连接并通知可用连接池回收此客户端连接资源。
        Nginx 能建立的最大连接数是 worker_connections×worker_processes。而对于反向代理的连接,最大连接数是 worker_connections×worker_processes/2,但是其会占用与客户端及与被代理服务器建立的两个连接。
        在高并发的场景下,Nginx 频繁与被代理服务器建立和关闭连接会消耗大量资源。Nginx 的 upstream_keepalive 模块提供与被代理服务器间建立长连接的管理支持,该模块建立了一个长连接缓存,用于管理和存储与被代理服务器建立的连接。

        Nginx 长连接管理机制如下图所示:

        相关说明如下:
        当 upstream_keepalive 模块初始化时,将建立按照 upstream 指令域中的 keepalive 指令设置大小的长连接缓存(Keepalive Connect Cache)池。
        当 Nginx 的工作进程与被代理服务器新建的连接完成数据传输时,其将该连接缓存在长连接缓存池中。
        当工作进程与被代理服务器有新的连接请求时,会先在长连接缓存池中查找符合需求的连接,如果存在则使用该连接,否则创建新连接。
        对于超过长连接缓存池数量的连接,将使用最近最少使用(LRU)算法进行关闭或缓存。
        长连接缓存池中每个连接最大未被激活的超时时间由 upstream 指令域中 keepalive_timeout 指令设置,超过该指令值时间未被激活的连接将被关闭。
        长连接缓存池中每个连接可复用传输的请求数由 upstream 指令域中 keepalive_requests 指令设置,超过该指令值复用请求数的连接将被关闭。
        Nginx 与被代理服务器间建立的长连接是通过启用 HTTP/1.1 版本协议实现的。由于 HTTP 代理模块默认会将发往被代理服务器的请求头属性字段 Connection 的值设置为 Close,因此需要通过配置指令清除请求头属性字段 Connection 的内容。

        配置样例如下:

upstream http_backend {server 192.168.2.154:8080;server 192.168.2.109:8080;keepalive 32;                           # 长连接缓存池大小为32keepalive_requests 2000;                # 每条长连接最大复用请求数为2000
}server {location /http/ {proxy_pass http://http_backend;proxy_http_version 1.1;             # 启用HTTP/1.1版本与被代理服务器建立连接proxy_set_header Connection "";     # 清空发送被代理服务器请求头属性字段Connection# 的内容}
}

        对于 FastCGI 协议服务器,需要设置 fastcgi_keep_conn 指令启用长连接支持。

upstream fastcgi_backend {server 192.168.2.154:9000;server 192.168.2.109:9000;keepalive 8;                            # 长连接缓存池大小为8
}server {...location /fastcgi/ {fastcgi_pass fastcgi_backend;fastcgi_keep_conn on;               # 启用长连接支持...}
}

         SCGI 和 uWSGI 协议没有长连接的概念;Memcached 协议(由 ngx_http_memcached_module 模块提供)的长连接配置,只需在 upstream 指令域中设置 keepalive 指令即可。

upstream memcached_backend {server 127.0.0.1:11211;server 10.0.0.2:11211;keepalive 32;                           # 长连接缓存池大小为32
}server {...location /memcached/ {set $memcached_key $uri;            # 设置$memcached_key为$urimemcached_pass memcached_backend;}
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua实现自定义函数面向对象编程

本文目录 1、引言2、原理3、实例4、层析验证 文章对应视频教程: 暂无,可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中,面向对象编程(OOP)已经成为一种广泛使用的编程范式…

俄罗斯Yandex推广投放如何开户?Yandex广告开户和代运营推广流程详解_俄罗斯_受众_搜索引擎

在俄罗斯进行Yandex广告推广是一种有效的在线营销方式,特别是针对俄罗斯市场。Yandex是俄罗斯最受欢迎的搜索引擎,类似于Google在全球范围内的地位。以下是通过Yandex广告推广的一般步骤,以及如何通过上海上弦进行广告开户和代运营。 1. Yan…

怎么图片转excel表格?推荐三个方法

怎么图片转excel表格?在信息化高速发展的今天,图片转Excel表格的需求日益凸显,尤其是在职场办公中,这一需求更是显得尤为迫切。为了满足广大用户的需求,市面上涌现出了众多图片转Excel的软件。今天,就为大家…

Git 基础操作(一)

Git 基础操作 配置Git 安装完Git后,首先要做的事情是设置你的 用户名 和 e-mail 地址。这样在你向仓库提交代码的时候,就知道是谁提交的,以及提交人的联系方式。 配置用户名和邮箱 使用git config [--global] user.name "你的名字&qu…

Windows如何找回永久删除的文件?完整教程看完即会!

可以找回永久删除的文件? 你是否也在Windows 10中永久删除过文件?什么是永久删除?通常有5种方法可以永久删除文件: 正常删除文件,然后在回收站中再次删除。使用命令提示符:“del”删除文件。使用“ShiftD…

RS485和CAN电路中的TVS管选择

在RS485和CAN电路设计中,经常要考虑“静电和浪涌保护”,怎么选择TVS管,很少有人讲解。 1、先了解TVS管 TVS管有单向管和双向管,通常后缀为CA的是双向TVS管,只有字母A的是单向TVS管。见下图: 2、TVS选择依…

【LLM之RAG】Adaptive-RAG论文阅读笔记

研究背景 文章介绍了大型语言模型(LLMs)在处理各种复杂查询时的挑战,特别是在不同复杂性的查询处理上可能导致不必要的计算开销或处理不足的问题。为了解决这一问题,文章提出了一种自适应的查询处理框架,动态选择最合…

4天掌握一门新技能是一种什么样的体验?

你能想象这门技术覆盖面有多广吗? 从地产中介到教育培训,从生产制造业到政府企事业、从消费生活到智慧文旅....这门技术都可以为这些行业提供服务。这就是今天要介绍的——VR全景 投入成本有多高? 放在以前,可能还不会推荐&#x…

大规模装箱问题:蜣螂优化算法DBO求解二维装箱问题(MATLAB代码)

一、问题描述 装载率:所有选择的箱子的总面积与夹板面积之比 假设一共有300个箱子,如何设计算法,使得选择部分箱子放入80*80的甲板上,让甲板的装载率越大,要求箱子间不得重叠。 二、蜣螂优化算法求解二维装箱问题 蜣螂优化算法…

Docker中部署Jenkins+Pipline流水线基础语法入门

场景 DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射): DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)-CSDN博客 DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解…

next.js v14 升级全步骤|迁移 pages Router 到 App Router

【概括】本文升级整体按照官网文档指引进行,在迁移 pages Router 前先看了官网的实操视频。 【注意】文章内对 .babel.ts、next.config.js 进行了多次更改,最终配置可见 报错3: Server Error ReferenceError: React is not defined 一、升级 Next.js 版…

Pytorch 卷积神经网络-手写数字识别

卷积神经网络是深度学习中的一个里程碑式的技术,有了这个技术,才会让计算机有能力理解图片和视频信息,才会有计算机视觉的众多应用。 本文讨论卷积神经网络模型(CNN)的Hello World。前面讨论的是一个二分类问题&#x…

网络安全 - DNS劫持原理 + 实验

DNS 劫持 什么是 DNS 为什么需要 DNS D N S \color{cyan}{DNS} DNS(Domain Name System)即域名系统。我们常说的 DNS 是域名解析协议。 DNS 协议提供域名到 IP 地址之间的解析服务。计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。用…

Hbase搭建教程

Hbase搭建教程 期待您的关注 ☀小白的Hbase学习笔记 目录 Hbase搭建教程 1.上传hbase的jar包并解压 2.重新登录 3.启动zookeeper 4.配置环境变量 5.关闭ZK的默认配置 6.修改hbase-site.xml文件 7.修改regionservers文件 8.将配置好的文件分发给其它节点 9.配置环境变量…

单通道触摸感应开关RH6016

1.简介 SOT23-6 RH6016 封装和丝印 RH6016 是一款内置稳压模块的单通道电容式触摸感应控制开关IC,可以替代传统的机械式开关。 RH6016可在有介质(如玻璃、亚克力、塑料、陶瓷等)隔离保护的情况下实现触摸功能,安全性高。 RH6016内置高精度稳压、上电复…

Requests —— 请求头设置!

前戏 在我们进行自动化测试的时候,很多网站都会都请求头做个校验,比如验证 User-Agent,看是不是浏览器发送的请求,如果我们不加请求头,使用脚本访问,默认User-Agent是python,这样服务器如果进行…

DeepSORT(目标跟踪算法)卡尔曼滤波中的贝叶斯定理

DeepSORT(目标跟踪算法)卡尔曼滤波中的贝叶斯定理 flyfish 从例子中介绍名词 假设我们有一个袋子,里面有5个红球和3个蓝球。我们从袋子里随机抽取一个球。 概率 (Probability) 我们想计算从袋子里抽到红球的概率 P ( R ) P(R) P(R)。 …

misc刷题记录(1)陇剑杯

[陇剑杯 2021]签到 题目内容:此时正在进行的可能是__________协议的网络攻击。(如有字母请全部使用小写,填写样例:http、dns、ftp)。得到的flag请使用NSSCTF{}格式提交。 打开统计,找到协议分级&#xff…

大模型应用之路:从提示词到通用人工智能(AGI)

前言 大模型在人工智能领域的应用正迅速扩展,从最初的提示词(Prompt)工程到追求通用人工智能(AGI)的宏伟目标,这一旅程充满了挑战与创新。本文将探索大模型在实际应用中的进展,以及它们如何为实…

php实现一个简单的MySQL分页

一、案例演示&#xff1a; 二、php 代码 <?php $servername "localhost"; // MySQL服务器名称或IP地址 $username "root"; // MySQL用户名 $password "123456"; // MySQL密码 $dbname "test"; // 要连接…