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 服務時,既 能扛 也 夠穩!