Nginx stream模块不支持proxy_upload_rate指令,该参数非官方内置,仅http模块支持limit_rate等限速机制;stream仅支持limit_conn连接数限制,字节级速率控制需借助tc、HAProxy或Envoy等外部方案。

Nginx 的 stream 模块不支持 proxy_upload_rate 这类指令。
这个参数并不存在于 Nginx 官方文档中,也不是 stream 或 http 上下文的有效指令。你可能混淆了以下几类概念:
-
proxy_upload_rate不是 Nginx 内置指令,既不在http块(用于 HTTP 代理)中,也不在stream块(用于 TCP/UDP 代理)中; - Nginx 官方限速机制中:
-
http上下文支持limit_req(请求速率)、limit_rate(响应下行带宽限制); -
stream上下文仅支持连接数限制(limit_conn),不支持基于字节/秒的传输速率限制(即无法限上传或下载速度); -
limit_rate仅作用于http模块的 response body 发送阶段,对 TCP 代理层无效; - 所有
proxy_*_rate类似命名(如proxy_download_rate)均为非官方、第三方模块或误解产物,标准 Nginx 不提供。
-
✅ 正确理解 TCP 代理限速的可行路径
1. Nginx stream 模块只能做连接数控制
- 用
limit_conn_zone+limit_conn控制并发连接数(例如单 IP 最多 50 个 TCP 连接); - 不能控制每个连接的上传/下载速度(如 2MB/s);
- 超限时直接 RST 断连,无缓冲、无排队。
2. 若需真正限制 TCP 上行速率(如 upload rate),需借助外部工具
常见可靠方案包括:
-
tc(Traffic Control)命令:Linux 内核级流量整形
适用于限制 Nginx worker 进程或网卡出口带宽(含上行):# 限制 eth0 出口(上行)总带宽为 10Mbit/s tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
可结合
iptables+tc实现按源 IP、端口等精细限速。 使用专用代理软件
如haproxy(支持rate-limit sessions和tcp-request content规则)、squid(TCP 层支持delay_pools)、或Envoy(完整 L4/L7 流量控制)。应用层配合限速逻辑
若代理后端是自研服务,可在业务代码中控制 socketsend()频率或缓冲区刷新节奏,实现软性 upload rate 控制。
3. 替代思路:用 HTTP 代理 + limit_rate(仅适用于 HTTP 流量)
如果实际走的是 HTTP 协议(即使封装在 TCP 里),可改用 http 模块反向代理,并启用:
location / {
proxy_pass http://backend;
limit_rate 1m; # 限制每个响应的下行速率(注意:这是 response,非 upload)
# ⚠️ 注意:Nginx 无原生 upload 限速;上传体大小可用 client_max_body_size + client_body_timeout 控制,但不等于速率限制
}
❌ 常见误区澄清
-
proxy_upload_rate 1m;→ 语法错误,Nginx 启动会报unknown directive; - 在
stream { server { ... } }中写limit_rate→ 无效,该指令不被 stream 上下文接受; - 以为
proxy_buffering off或proxy_buffer_size能限速 → 它们影响缓冲行为,不控制传输速率; - 依赖
tcp_nodelay/tcp_nopush→ 这些优化延迟和包合并,与带宽限制无关。
✅ 推荐组合方案(生产环境实用)
| 目标 | 推荐方式 |
|---|---|
| 防止单 IP 建立过多 TCP 连接 |
stream + limit_conn_zone $binary_remote_addr zone=ipconn:10m; + limit_conn ipconn 20;
|
| 限制整体上行带宽(如防止打满出口) |
tc 配合 qdisc tbf 或 htb,绑定到物理网卡 |
| 区分不同客户端 IP 的上传速率 |
tc + iptables 标记 + tc class 分流 |
| 需要精细策略(按用户、时段、协议类型限速) | 切换至 Envoy 或 HAProxy,它们原生支持 rate_limit filter 和 stick-table
|
如你当前使用的是 Nginx stream 做 TCP 透传(如 MySQL、Redis、TLS 穿透),又必须控速,最轻量落地的方式就是用 tc 做系统级出口限速——它透明、低开销、生效快,且无需修改任何应用或代理配置。











