nginx stream模块不支持原生tcp速率限制,但可通过limit_conn控制并发连接数、proxy_limit_rate(需proxy_buffering)间接限速,或结合geo/map实现差异化策略;复杂需求建议用tc、后端限速或haproxy。

Nginx 的 stream 模块本身不支持像 http 模块中 limit_req 那样的原生 TCP 流量速率控制(如每秒连接数、每秒字节数限制),但可通过组合使用 limit_conn 和 limit_rate(需搭配 proxy 指令)等机制,在特定场景下实现近似效果。严格意义上的“TCP 流量速率控制”(例如限速到 1MB/s)在纯 stream 层较难直接达成,通常需借助内核层面(如 tc)或上游服务配合。
使用 limit_conn 控制并发连接数
这是 stream 模块最成熟、最常用的限流方式,适用于防止连接洪泛攻击或资源耗尽。
- 在
stream块中定义连接限制区域:limit_conn_zone $binary_remote_addr zone=addr:10m; - 在
server块中应用限制:limit_conn addr 10;(同一 IP 最多 10 个并发连接) - 支持按变量分组(如
$server_addr、自定义 map 变量),适合按客户端、服务端或协议维度控制
通过 proxy_buffering + limit_rate 间接限速(仅适用于代理场景)
当 stream 模块用作 TCP 代理(proxy_pass)时,可启用缓冲并限制响应流量发送速率——注意:该限速作用于 Nginx 向客户端发送数据的速度,而非原始 TCP 流的双向吞吐。
- 开启缓冲:
proxy_buffering on; - 设置单连接发送速率:
proxy_limit_rate 512k;(单位为 bytes/s,需 Nginx ≥ 1.19.0) - 该指令仅对已缓冲的数据生效;若禁用缓冲(
off)或后端直通,则无效 - 不适用于 TLS 直通(passthrough)或无代理的纯转发模式
结合 geo / map 实现差异化限流策略
可通过地理标签或自定义映射,对不同来源实施不同连接或速率策略。
- 用
geo划分 IP 段:geo $limited { default 0; 192.168.0.0/16 1; } - 用
map关联限流区域:map $limited $conn_zone { 1 "zone=trusted:10m"; 0 "zone=default:10m"; } - 再在 server 中引用:
limit_conn $conn_zone 50;
补充建议:复杂限速需求应考虑外部工具
若需精确控制 TCP 字节级速率(如 per-connection 带宽整形)、突发控制(token bucket)、或双向限速,Nginx stream 能力有限。
- Linux
tc(traffic control)命令可对网卡做精细 QoS 策略,与 Nginx 协同使用更可靠 - 在 upstream 侧(如后端服务)实现限速逻辑,由应用层控制更灵活
- 考虑专用代理如 HAProxy(支持
rate-limit、stick-table等丰富 TCP 限流功能)











