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

Nginx Stream 层连接数限流实战ngx_stream_limit_conn_module

1.为什么需要连接数限流?

  • 数据库/Redis/MQ 连接耗资源:恶意脚本或误配可能瞬间占满连接池,拖垮后端。
  • 防御慢速攻击:层叠式限速(连接数+带宽)可阻挡「Slow Loris」之类的 TCP 低速洪水。
  • 公平接入:多租户环境里,防止单一租户独占所有连接。]

2.核心指令速览

指令作用关键点
limit_conn_zone定义共享内存 zone 保存「<键, 连接计数>」必须位于 stream {} 顶层
limit_conn指定 zone 和最大连接数支持多次声明,取最严格
limit_conn_dry_run on演练模式:只计数不拒绝用于灰度调整
limit_conn_log_level warn调整拒绝连接时日志级别默认为 error
$limit_conn_status日志变量,取值 PASSED/REJECTED/REJECTED_DRY_RUN便于监控与告警

3.最小可运行示例:单 IP 只允 2 条 MySQL 链路

stream {# 1) 为客户端二进制 IP 分配 10 MB 共享区limit_conn_zone $binary_remote_addr zone=per_ip:10m;server {listen 3306;proxy_pass mysql_backend;# 2) 每个 IP 最多 2 连接limit_conn per_ip 2;# 3) 日志里输出限流状态access_log /var/log/nginx/mysql.log'$remote_addr $limit_conn_status';}
}
  • 10 MB zone ≈ 32 × 32 k ≈ 32 k IPv4 状态,足够中型集群使用。
  • ipv6only=on$binary_remote_addr 自动 16 字节;一条状态占 64 B。

4.进阶玩法

4.1 基于租户 Token 限流

js_import token.js;# 解析 TCP 握手包,自定义 $tenant_id 变量
js_preread token.parse;
limit_conn_zone $tenant_id zone=tenant:20m;server {...limit_conn tenant 50;   # 每租户 50 并发
}
  • token.parse 在前置报文里提取租户字段并写入 s.variables.tenant_id
  • 空值不会计入 zone,可为「非租户链路」单独配置默认限额。

4.2 Dry-run 灰度

server {...limit_conn_zone $binary_remote_addr zone=ip:5m;limit_conn ip 4;limit_conn_dry_run on;          # 先观察limit_conn_log_level notice;    # 日志级别调低
}
  • 查看一段时间的 REJECTED_DRY_RUN 统计,确认阈值合理后再关闭 dry-run 正式启用。

4.3 与 limit_req/proxy_timeout 叠加

  • 连接数 控 «并发」,
  • 限速/超时 控 «速率+时长»,
    组合可实现针对 “慢速但大量连接” 的复合防护。

5.监控与可视化(Plus 版)

Nginx Plus R21+ 支持通过 API 读取/清空 zone 数据:

# 查询 zone 使用率
curl http://127.0.0.1:8080/api/8/stream/limit_conns
# 清空计数
curl -X DELETE http://127.0.0.1:8080/api/8/stream/limit_conns/per_ip

连同 $limit_conn_status 配置在 Prometheus/Loki,可即时获知被拒绝比例。

6.常见坑与调优

症状原因解决办法
大并发下偶发 503zone 容量耗尽增大 :size 或优化 key 维度
IPv6 客户端被限得更多相同主机多地址把 key 换成 $remote_addr(文本)并写自定义哈希
限流后 CPU 飙升拒绝即 close() 导致重连风暴配合 geo/防火墙先行黑洞异常客户端
Dry-run 日志太多默认 error 级别降至 info 或单独写 debug 采样

7.总结

  • 简单可靠:仅两条指令即可实现四层连接数限流,无需外部依赖。
  • 弹性演练:Dry-run 帮助在生产灰度检验阈值,保障业务平稳切换。
  • 可组合:与 keyvaljs_module、防火墙规则共同构建分层流量防护网。
  • 商业增强:Nginx Plus 提供 API 观测与动态清理,让运维自动化进一步提效。

掌握 ngx_stream_limit_conn_module,让你的 Nginx Stream 网关在面向高并发 TCP/UDP 服务时,既 能扛够稳

http://www.lryc.cn/news/2404681.html

相关文章:

  • Spring Boot 定时任务的使用
  • Flutter:下拉框选择
  • SpringAI(GA):Nacos2下的分布式MCP
  • AC68U刷梅林384/386版本后不能 降级回380,升降级解决办法
  • [AI绘画]sd学习记录(二)文生图参数进阶
  • CRM管理系统中的客户分类与标签管理技巧:提升转化率的核心策略
  • 怎么解决cesium加载模型太黑,程序崩溃,不显示,位置不对模型太大,Cesium加载gltf/glb模型后变暗
  • 【AI系列】BM25 与向量检索
  • windows10搭建nfs服务器
  • simulink这边重新第二次仿真时,直接UE5崩溃,然后simulink没有响应
  • react 常见的闭包陷阱深入解析
  • 【CATIA的二次开发22】关于抽象对象Document概念详细总结
  • 模拟法解题的思路与算法分享
  • mysql密码正确SpringBoot和Datagrip却连接不上
  • 高保真组件库:数字输入框
  • 人工智能赋能高中学科教学的应用与前景研究
  • 【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
  • 紫光同创FPGA系列实现Aurora 8b/10b协议
  • DAY 44 预训练模型
  • [Harmony]颜色初始化
  • 指针与函数参数传递详解 —— 值传递与地址传递的区别及应用
  • 【NLP中向量化方式】序号化,亚编码,词袋法等
  • C++学习-入门到精通【16】自定义模板的介绍
  • 关于脏读,幻读,可重复读的学习
  • 源码级拆解:如何搭建高并发「数字药店+医保购药」一体化平台?
  • 旅行商问题(TSP)的 C++ 动态规划解法教学攻略
  • unix/linux,sudo,其内部结构机制
  • Hadoop 3.x 伪分布式 8088端口无法访问问题处理
  • Redis线程安全深度解析:单线程模型的并发智慧
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十期-Over Permission 模块)