NGINX 四层上游模块`ngx_stream_upstream_module` 实战指南

一、模块定位与引入

  • 模块名称ngx_stream_upstream_module

  • 首次引入:NGINX 1.9.0(2015-08-04)

  • 编译选项:启用 --with-stream(含此模块)

  • 作用

    1. 定义后端服务器组(upstream 块)
    2. 配置各服务器参数(权重、失败判断、DNS 动态解析等)
    3. 通过多种算法分配客户端连接
    4. 支持商业版的动态可配置与健康检查

二、核心指令与参数

1. 定义上游组

upstream <name> {[负载均衡算法指令]server <address> [参数];[更多 server ...][zone <zone_name> <size>;][state /path/to/state.file;]
}
  • upstream name { … }:声明一个后端组,供 proxy_pass 引用。
  • zone name size(1.9.0 商业版可动态):在共享内存中保存配置与运行状态,用于多 worker 共享与热更新。
  • state file(1.9.7 商业版可用):外部持久化服务器列表与参数,Nginx 重载或升级可保留状态。

2. 定义后端服务器

server <domain|IP:port>|unix:/path [参数];

常用参数:

参数含义
weight=n权重,默认 1,轮询时按比例分配
max_conns=n最大并发连接数(1.11.5)
max_fails=nfail_timeout 时间内允许的失败次数,超过则标记为不可用
fail_timeout=time标记失败及恢复时间,默认 10s
backup备份服务器,只有主服务器都不可用时才会被调用
down永久禁用该服务器
resolve开启动态 DNS 解析,需配合 resolver
service=name基于 DNS SRV 记录解析(1.9.13)
商业版slow_start、健康检查 (health_check)、动态修改、API 控制

3. 负载均衡算法

upstream 块中,可任选一种或多种算法指令;若不指定,默认为加权轮询。

  • hash <key> [consistent](1.11.2)
    基于 <key> 的哈希值分配,consistent 开启一致性哈希,减少因节点变动导致的重映射。

  • least_conn
    将连接分配给活动连接数最少的服务器,多个最少则按权重轮询。

  • least_time <connect|first_byte|last_byte> [inflight](商业版)
    按平均响应时间(建立连接/首字节/全量)和活动连接数综合考量。

  • random [two [method]](1.15.1)
    随机挑选服务器,two 参数从两台中再按 least_conn 等方法选出最佳。

4. DNS 解析支持

resolver 10.0.0.1 [valid=30s] [ipv4=off|ipv6=off] [status_zone=zone];
resolver_timeout 5s;
  • resolve:配合 server ... resolve,自动在后台定期刷新域名 IP 列表。
  • service=name:支持 SRV 记录,自动按优先级与权重构建主/备服务器。
  • resolver_timeout(1.27.3):解析超时时间。

三、最小可运行示例

stream {resolver 127.0.0.1 valid=10s;upstream backend {zone backend_zone 64k;hash $remote_addr consistent;server backend1.example.com:12345 weight=5 resolve;server backend2.example.com:12345 resolve;server unix:/tmp/backend3;server backup1.example.com:12345 backup;}server {listen 12346;# 轮询之外:也可在此加 health_check;proxy_pass backend;}
}
  • 说明

    1. 使用一致性哈希,让相同客户端 IP 总落到同一台后端;
    2. resolve 动态更新 DNS,结合 zone 共享配置;
    3. backup 只在所有主服务器均失效时才启用。

四、嵌入式变量

ngx_stream_upstream_module1.11.4 起提供监控与日志埋点变量:

变量含义
$upstream_addr实际连接的后端地址列表,多个用逗号分隔
$upstream_bytes_received从后端接收的字节数,多个连接用逗号分隔
$upstream_bytes_sent向后端发送的字节数
$upstream_connect_time建立连接耗时(秒,毫秒精度)
$upstream_first_byte_time等待首字节耗时
$upstream_session_time整个会话持续时间

可在 access_logmapif 等指令中灵活引用,监控后端性能与故障。

五、实战优化与注意事项

  1. 共享 zone 大小zone name 64k 一般可容纳数百条服务器配置。
  2. DNS TTL 与 validresolver valid 覆盖 DNS TTL,推荐设置为 5–30 秒。
  3. 一致性哈希:节点增删需配合 consistent,否则大规模重映射影响缓存或会话。
  4. 备份与故障切换backup 参数只在主节点全挂时生效;可配合 max_failsfail_timeout 精细调整。
  5. 商业版特性:如需在线健康检查、慢启动、API 动态修改,请评估 NGINX Plus 或商业订阅。

六、总结

ngx_stream_upstream_module 是构建高可用、高性能 TCP/UDP 代理的核心模块。通过灵活的服务器组定义、多样的负载均衡算法、动态 DNS 支持与丰富的监控变量,它能够满足从简单轮询到金融级一致性哈希、从静态配置到动态热更新的全方位需求。升级至 NGINX ≥1.9.0,结合商业版特性,更能在不间断部署与流量管控上发挥巨大价值。

立即部署:根据业务特点选择合适的负载均衡策略与参数,让您的四层流量稳定、高效、可观测!

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

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

相关文章

WinUI3入门2:DataGrid动态更新 添加删除和修改字段

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

基于Python学习《Head First设计模式》第十三章 现实世界中的模式

定义设计模式 设计模式要素 模式名称、分类意图&#xff1a;描述模式是什么动机&#xff1a;描述什么时候使用这个模式&#xff0c;具体场景适用性&#xff1a;描述什么地方使用这个模式&#xff0c;用在什么场合结构&#xff1a;类图参与者&#xff1a;类和对象的责任和角色…

线性代数(1)线性方程组的多种解法

求解线性方程组是线性代数的核心问题之一&#xff0c;根据方程组的类型&#xff08;如齐次/非齐次、方阵/非方阵、稀疏/稠密等&#xff09;&#xff0c;可以采用不同的解法。以下是常见的线性方程组解法分类及简要说明&#xff1a; 一、直接解法&#xff08;精确解&#xff09…

肝脏/肝脏肿瘤图像分割数据集(猫脸码客第261期)

探秘肝脏/肝脏肿瘤图像分割&#xff1a;医学影像技术的新突破 一、引言 肝脏/肝脏肿瘤图像分割在医学领域占据着愈发重要的地位&#xff0c;为肝脏疾病的精准诊断与有效治疗提供了关键技术支撑。随着医学成像技术的飞速进步&#xff0c;如磁共振成像&#xff08;MRI&#xff…

【LLM05---位置编码】

文章目录 位置编码引出Transformer中位置编码方法:Sinusoidal functions两个重要性质位置编码 最近在学习位置编码,想找一个讲的比较透彻的文章或视频,找了半天,满意的一个也没有,所以自己记录一下。 注意,本篇笔记只作为自己的学习记录用,更好的讲解的内容请看链接:位…

pikachu——ssrf

概念补充&#xff1a; 内网&#xff1a;局部范围内的私有网络&#xff0c;比如局域网就是一个小范围的内网&#xff0c;有私有IP&#xff0c;并且内网受防火墙的保护&#xff0c;外网无法直接访问 外网&#xff1a;全球范围的公共网络&#xff0c;公有ip ip地址&#xff1a;…

java 设计模式_行为型_13备忘录模式

13.备忘录模式 模式定义 备忘录模式&#xff08;Memento Pattern&#xff09;模式的定义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后当需要时能将该对象恢复到原先保存的状态。该模式又…

创建postgres数据库失败

异常&#xff1a; postgres# CREATE DATABASE deepflow_agent2; ERROR: source database "template1" is being accessed by other users DETAIL: There are 2 other sessions using the database 如何断联这两个session 要解决 PostgreSQL 中因 template1 数据库…

卧安机器人闯上市:深耕AI具身技术,“大疆教父”李泽湘再落子

撰稿|行星 来源|贝多财经 又一家机器人企业&#xff0c;现身港股资本市场。贝多财经了解到&#xff0c;卧安机器人&#xff08;深圳&#xff09;股份有限公司&#xff08;下称“卧安机器人”&#xff09;于6月8日向港交所提交了上市申请&#xff0c;国泰君安国际、华泰国际为…

基于GNU Radio Companion搭建的AM信号实验

目录 实验目的和要求 1、AM收发系统仿真和实际接收 调制过程 2、Lab 2.1实验过程AM信号的产生 AM信号的表达式 调制深度的概念 3、Lab2.2 AM信号的解调 4、Lab2.3 实际用RTLSDR接收一个ISM(912MHz)频率的AM信号,信号的AM调制为音频为48KHz的音乐信号 实验目的和要求 …

【go】(仅思路)使用go实现一款简单的关系型数据库gosql

文章目录 背景给navicate回复版本号建立连接数据库list新建数据库删除数据库删除表查询表数据总结roadmapnavicate连接适配 背景 使用go很容易编译出一个二进制文件&#xff0c;已经有人用纯go实现了sqlite3的驱动&#xff08;go get github.com/glebarez/sqlite&#xff09;&…

echarts开发 | 数据可视化 -- 第二篇 echart进阶配置项学习

文章目录 一、数据标记(markLine、markPoint)1.1 markLine&#xff08;标记线&#xff09;1.2 markPoint&#xff08;标记点&#xff09; 一、数据标记(markLine、markPoint) 支持两类标记方式 markLine 和 markPoint 分别用于标示趋势线和特定数据点&#xff0c;以加强数据表…

Kafka数据写入流程源码深度剖析(Broker篇)

在Kafka数据写入流程中&#xff0c;Broker端负责接收客户端发送的消息&#xff0c;并将其持久化存储&#xff0c;是整个流程的关键环节。本文将深入Kafka Broker的源码&#xff0c;详细解析消息接收、处理和存储的具体实现。 一、网络请求接收与解析 Broker通过Processor线程…

名称 深度学习(监督学习) Iteration 一次 mini-batch 前向+反向传播更新 Epoch 所有数据集训练一遍。这两个概念不一样吗?

你的问题非常专业&#xff0c;确实容易混淆&#xff0c;下面我用科研术语 通俗比喻来清晰地区分&#xff1a; ✅ 简明对照表&#xff1a;Iteration vs. Epoch&#xff08;在监督学习中&#xff09; 名称专业术语解释通俗理解是否属于监督学习&#xff08;深度学习&#xff09…

Blender 模型下载

1.CGModel网站 https://www.cgmodel.com/ 免费模型数量多&#xff0c;国风类题材的模型多&#xff0c;中文搜索方便 2.Blender官网 3.3d溜溜网 https://3d.3d66.com/ 4.free3d.com free3d.com

Spring涉及的设计模式以及实际使用场景(含代码)

Spring涉及的设计模式以及实际使用场景(含代码) 1.工厂模式&#xff08;Factory Pattern&#xff09; 作用: 隐藏对象创建的细节&#xff0c;通过工厂类统一管理对象的实例化。 场景&#xff1a;Spring的BeanFactory和ApplicationContext是工厂模式的典型实现。 // 通过App…

ROM 只读存储器 随机存取

ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;的存取方式为&#xff1a; ✅ 随机存取方式&#xff08;Random Access&#xff09; 尽管“ROM”强调的是“只读”&#xff0c;它的数据访问方式与 RAM 类似&#xff0c;都是随机存取。 &#x1f50d; 解释如…

opensuse解决微信无法登录的问题

思路启发 https://forum.suse.org.cn/t/topic/17183/2 实际解决 https://forum.suse.org.cn/t/topic/17204/5 解决方法 先安装 sudo zypper install execstackcd /opt/wechatsudo bash -c execstack -c ./*.so

Adixen ASM380 氦气检漏仪 阿尔卡特Mobile high performance helium leak detector

Adixen ASM380 氦气检漏仪 阿尔卡特Mobile high performance helium leak detector

堆的自动管理

由于程序员必须编写出到分配和释放存储器的明确的调用&#xff0c;所以用m a l l o c和f r e e完成指针的动态分配和重新分配是管理堆的手工( m a n u a l )方法。相反地&#xff0c;运行时栈则是由调用序列自动地( a u t o m a t i c a l l y )管理。在一种需要完全动态的运行…