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

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.xdnf.cn/news/12603.html

相关文章:

  • SpringBoot十二、SpringBoot系列web篇之过滤器Filte详解
  • 2.3 VS2019 简单使用
  • LLM 笔记:Speculative Decoding 投机采样
  • HTML 面试题错题总结与解析
  • vue3 icon 图标 使用方法
  • VScode打开后一直显示正在重新激活终端 问题的解决方法
  • Modbus RTU与Modbus TCP详解指南
  • 安卓基础(编译.Class)
  • MCP详解及协议的使用(python版本和Node版本)
  • 【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
  • cv2.stereoRectify中R1, R2, P1, P2, Q中每一个分量的物理意义
  • grep、wc 与管道符快速上手指南
  • Linux八股【3】-----系统框架概述
  • SpringBoot项目接口集中测试方法及实现
  • 2.4 vcpkg 使用
  • Vue中渲染函数的使用
  • Promise深入理解
  • 【靶场】yzmcms5.3.0 SSRF漏洞
  • 分享一道力扣
  • 又是一年高考季
  • mariadb5.5.56在centos7.6环境安装
  • python怎么读shape文件?
  • GPU集群故障分析:大型AI训练中的硬件问题与影响
  • 408第一季 - 数据结构 - 字符串和KMP算法
  • 快速了解:单北斗终端的定义、作用与好处!
  • Qt(part 2)1、Qwindow(菜单栏,工具栏,状态栏),铆接部件,核心部件 ,2、添加资源文件 3、对话框
  • 随访系统安装的记录
  • 【Hot 100】84. 柱状图中最大的矩形
  • 数据库管理与高可用-MySQL高可用
  • 编程基础:执行流