nginx worker进程不主动限流,限速由显式配置的limit_req、limit_conn、limit_rate等模块独立执行;每个worker在连接粒度上无共享地完成带宽控制,无需跨进程协同,真正起作用的是配置指令而非worker自身逻辑。

Nginx 的 worker process 本身不直接参与带宽限速的决策或计算,它只是执行限速逻辑的载体。真正起作用的是 Nginx 的模块机制和配置指令,而限速行为在每个 worker 进程内独立、无共享地完成——这是理解“worker 如何限速”的关键。
限速不依赖 worker 间协同
Nginx 的带宽控制(如 limit_rate)是连接粒度的,且无需跨 worker 共享状态:
- 每个 TCP 连接由一个 worker 进程独占处理(基于 epoll/kqueue 事件驱动)
-
limit_rate和limit_rate_after是在连接写响应阶段,由ngx_http_write_filter_module模块实时控制发送节奏 - 它通过控制每次
send()调用的数据量 + 睡眠/延后调度(非阻塞式,靠事件循环重试),实现字节级流控 - 所有计算(如已发字节数判断、速率换算)都在当前 worker 的内存中完成,不查共享内存、不加锁、不通信
✅ 所以:你不需要为 worker 数量调整限速配置,也不用担心多个 worker 导致“总带宽翻倍”——每个连接单独受限,与哪个 worker 处理无关。
限速生效的位置:仅在响应写出阶段
限速只影响 从 Nginx 发往客户端的响应体(response body)传输速度,例如:
- 静态文件下载(ZIP、MP4、PDF)
-
X-Accel-Redirect或proxy_pass后端返回的大响应 - 不影响请求头、状态行、小响应(如 HTML 页面首屏若未超
limit_rate_after,则全速发出)
典型配置示例(作用于所有连接):
http {
limit_rate_after 1m; # 前 1MB 不限速
limit_rate 512k; # 超出后限为 512 KB/s
}
这个配置在 http 块中定义,会被每个 worker 在处理各自连接时按规则应用。
为什么不能靠 worker 数量做“整机带宽限速”?
因为:
-
limit_rate 512k表示「每个连接最多发 512 KB/s」,不是「整个 Nginx 每秒最多发 512 KB」 - 若 10 个用户各建 2 个连接,理论峰值出口带宽可达
10 × 2 × 512k = 10.24 MB/s - 真正的整机出口限速需在系统层(如
tc流量控制)、负载均衡层或云平台 QoS 实现
⚠️ 注意:这不是缺陷,而是设计取舍——Nginx 定位是高性能 HTTP 服务/代理,不是网络网关。
进阶:想让 worker 协同限总带宽?不行,但可绕行
Nginx 原生不支持「全站总出口带宽上限」,但可通过以下方式逼近效果:
-
✅ 用
limit_conn控制并发连接总数limit_conn_zone $server_name zone=server_limit:10m; limit_conn server_limit 100; # 全站最多 100 并发连接
减少活跃连接数,间接压低总带宽占用。
✅ 结合
limit_req降低请求密度
防止大量小请求触发频繁响应写出,减少连接建立/释放开销和缓冲区压力。✅ 前端加反向代理或 CDN 层做全局限速
如用 Envoy、Traefik 或商业 CDN 提供的 total egress rate limit 功能。
不复杂但容易忽略











