nginx tcp代理模式不支持http层限速指令,只能基于连接粒度进行资源约束:通过limit_conn按ip限并发连接、proxy_timeout控连接生命周期、map结合x-bandwidth做带宽感知路由,并依赖tc等系统工具实现字节级限速。

Nginx 在 TCP 代理模式(即 stream 块)下**不支持 HTTP 层的限速指令**(如 limit_rate、limit_req),也无法识别请求头、UA 或 Save-Data 等应用层特征。因此,TCP 代理的流量整形不能基于“用户类型”或“内容语义”,而必须聚焦于**连接粒度的资源约束与传输节流**,核心目标是保护后端服务免受连接洪泛、慢连接拖垮或带宽挤占。
按客户端 IP 限制并发连接数
TCP 层最直接有效的控制手段是限制单个来源的连接数量,防止恶意或异常客户端耗尽 worker_connections:
- 在
stream块顶部定义连接限制区域:limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; - 在具体
server块中启用限制:limit_conn conn_per_ip 5;(每个 IP 最多 5 个 TCP 连接) - 搭配
limit_conn_log_level warn记录被拒绝连接,便于排查扫描或爬虫行为
通过 proxy_timeout 控制连接生命周期
TCP 代理无法限速字节流,但可通过超时参数间接调控连接占用效率,避免慢连接长期滞留:
-
proxy_timeout 30s;:设置 upstream 建连及响应等待总时长 -
proxy_responses 1;:限制每个连接最多转发 1 次响应(适用于单次交互协议,如 Redis 查询) -
proxy_buffer_size 4k;:减小缓冲区可降低内存占用,间接抑制大包突发冲击
结合上游负载均衡做带宽感知路由
虽不能在 stream 层测速,但可通过外部信号引导路由决策:
- 前端网关(如 CDN 或 API 网关)在
X-Forwarded-For后附加带宽标识(如X-Bandwidth: low),Nginxstream可用map提取并路由至不同 upstream: map $http_x_bandwidth $upstream_group { default backend_high; low backend_low; }- 再配置两个 upstream:一个指向高带宽后端池,另一个指向轻量级降级实例(如只读缓存节点)
依赖系统级工具补充字节级限速
若确需对 TCP 流量本身限速(如限制某端口出口带宽),Nginx 无原生能力,需交由操作系统完成:
- 使用
tc(Traffic Control)配合iptables标记连接,对特定目的端口做 HTB 限速 - 例如:对所有发往后端
192.168.1.100:3306的流量限速 2MB/s:tc qdisc add dev eth0 root handle 1: htb default 30tc class add dev eth0 parent 1: classid 1:1 htb rate 2mbittc filter add dev eth0 protocol ip parent 1: u32 match ip dport 3306 0xffff flowid 1:1 - 该方式独立于 Nginx,但需运维协同维护,且不区分客户端











