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.常见坑与调优
症状 | 原因 | 解决办法 |
---|---|---|
大并发下偶发 503 | zone 容量耗尽 | 增大 :size 或优化 key 维度 |
IPv6 客户端被限得更多 | 相同主机多地址 | 把 key 换成 $remote_addr (文本)并写自定义哈希 |
限流后 CPU 飙升 | 拒绝即 close() 导致重连风暴 | 配合 geo /防火墙先行黑洞异常客户端 |
Dry-run 日志太多 | 默认 error 级别 | 降至 info 或单独写 debug 采样 |
7.总结
- 简单可靠:仅两条指令即可实现四层连接数限流,无需外部依赖。
- 弹性演练:Dry-run 帮助在生产灰度检验阈值,保障业务平稳切换。
- 可组合:与 keyval、js_module、防火墙规则共同构建分层流量防护网。
- 商业增强:Nginx Plus 提供 API 观测与动态清理,让运维自动化进一步提效。
掌握 ngx_stream_limit_conn_module
,让你的 Nginx Stream 网关在面向高并发 TCP/UDP 服务时,既 能扛 也 够稳!