nginx全局访问频率控制需在http块中用limit_req_zone基于$binary_remote_addr定义共享内存区域,再在server或location中用limit_req引用该区域并配置burst与nodelay参数。

在 Nginx 中实现全局访问频率控制,核心是使用 limit_req 指令配合 limit_req_zone 定义共享内存区域,让限流规则作用于所有匹配请求,而非单个 server 或 location。
定义全局限流区域
在 http 块中定义一个基于客户端 IP 的限流区域,确保它对整个 Nginx 实例生效:
- 使用
$binary_remote_addr作为键(比$remote_addr更节省内存) - 设置共享内存大小(如
10m),足够存储大量 IP 的计数状态 - 指定速率(如
10r/s表示每秒最多 10 个请求)
示例配置:
在 server 或 location 中启用限流
将定义好的区域应用到需要控制的上下文中。若希望真正“全局”,建议放在 http 块的默认处理逻辑里,或在每个 server 的 location / 中统一启用:
- 使用
limit_req zone=global_limit burst=20 nodelay;允许短时突发(burst),并立即响应(nodelay) - 若不希望排队等待,避免只写
burst而不加nodelay,否则超限请求会延迟处理,可能引发超时 - 可添加
limit_req_status 429;统一返回 429 状态码,便于前端识别限流
区分内外网或接口粒度的灵活控制
全局不等于“一刀切”。可通过组合变量实现更精细的全局策略:
- 按域名限流:
limit_req_zone $host zone=host_limit:10m rate=50r/s; - 按 URL 路径限流:
limit_req_zone $host$request_uri zone=path_limit:10m rate=5r/s; - 对 API 接口单独限流,同时保留静态资源不限流:在对应
location ~ ^/api/中调用全局区域
监控与调试限流效果
限流是否生效需验证,Nginx 提供了基础观测手段:
- 开启
error_log的 info 级别,限流触发时会记录limiting requests日志 - 使用
stub_status模块(需编译启用)查看当前连接和请求统计 - 配合 Prometheus + nginx-vts-exporter 可采集
limit_requests_rejected等指标,实现可视化告警











