在 Nginx 中实现集群级别的全局限流,本质是突破单机限制,让多个 Nginx 实例共享同一套限流状态。但需明确:Nginx 原生的 limit_req_zone 和 limit_conn_zone 仅支持本机内存共享,无法跨进程、更无法跨机器。因此,“集群级全局限流”必须借助外部组件协同完成,不能仅靠 Nginx 配置文件实现。
Nginx 的限流模块(ngx_http_limit_req_module 和 ngx_http_limit_conn_module)依赖 本地共享内存区(shared memory zone) 存储计数器,例如:
主流实践是将限流决策上移至一个中心化服务,Nginx 充当执行代理。以下是两种成熟路径:
方案一:Nginx + Redis(推荐,灵活可靠)
|
1 2 3 4 |
local limit = require "resty.limit.count" local lim, err = limit.new("redis://127.0.0.1:6379", 100, 1) -- 每秒100次 local key = ngx.var.binary_remote_addr local delay, remaining, err = lim:incoming(key, true) |
方案二:前置统一网关层(如 Kong、APISIX、Traefik)
有人尝试用 Nginx 变量拼接“伪集群标识”,例如:
另一种轻量做法是:在 DNS 或 LVS 层做 IP 哈希调度,确保同一客户端始终落到同一台 Nginx —— 此时单机限流可等效为“会话级全局”,但失去高可用弹性,不推荐生产核心链路。