广告位联系
返回顶部
分享到

怎么在Nginx中配置集群级别的全局限流策略

nginx 来源:互联网 作者:佚名 发布时间:2026-06-19 19:09:41 人浏览
摘要

在 Nginx 中实现集群级别的全局限流,本质是突破单机限制,让多个 Nginx 实例共享同一套限流状态。但需明确:Nginx 原生的limit_req_zone和limit_conn_zone仅支持本机内存共享,无法跨进程、更无法跨

在 Nginx 中实现集群级别的全局限流,本质是突破单机限制,让多个 Nginx 实例共享同一套限流状态。但需明确:Nginx 原生的 limit_req_zone 和 limit_conn_zone 仅支持本机内存共享,无法跨进程、更无法跨机器。因此,“集群级全局限流”必须借助外部组件协同完成,不能仅靠 Nginx 配置文件实现。

为什么原生 Nginx 不支持集群限流

Nginx 的限流模块(ngx_http_limit_req_module 和 ngx_http_limit_conn_module)依赖 本地共享内存区(shared memory zone) 存储计数器,例如:

  • limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s;
  • 该 zone=api:10m 仅存在于当前 Nginx worker 进程所在服务器的内存中
  • 其他 Nginx 实例完全无法读写该区域,彼此状态隔离

可行的集群限流方案(需外部组件)

主流实践是将限流决策上移至一个中心化服务,Nginx 充当执行代理。以下是两种成熟路径:

方案一:Nginx + Redis(推荐,灵活可靠)

  • 使用 nginx-plus(商业版)或开源模块 lua-resty-limit-traffic + lua-resty-redis
  • 核心逻辑:每个请求到达时,Nginx 执行 Lua 脚本,向 Redis 发起原子操作(如 INCR + EXPIRE),判断是否超限
  • 示例关键逻辑(Lua):

    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)

  • 优势:支持精确速率、自定义 key(如用户ID、API 路径)、动态调整策略

方案二:前置统一网关层(如 Kong、APISIX、Traefik)

  • 这些网关内置分布式限流插件,底层通常基于 Redis 或 etcd 实现状态同步
  • Nginx 退为纯负载均衡器,所有流量先经网关做集群级限流,再转发至后端 Nginx 集群
  • 例如 APISIX 的 limit-count 插件可配置 key 为 remote_addr,并指定 Redis 地址
  • 优势:开箱即用、策略可视化、与鉴权/日志等能力天然集成

常见误区与替代思路

有人尝试用 Nginx 变量拼接“伪集群标识”,例如:

  • limit_req_zone $server_name:$binary_remote_addr zone=cluster:10m rate=50r/s;
  • 这仍是每台机器独立计数,只是 key 更细粒度,并非真正集群共享
  • 若想近似“全局效果”,只能大幅降低单机阈值(如设为总目标的 1/N),但会牺牲突发容忍度且不精准

另一种轻量做法是:在 DNS 或 LVS 层做 IP 哈希调度,确保同一客户端始终落到同一台 Nginx —— 此时单机限流可等效为“会话级全局”,但失去高可用弹性,不推荐生产核心链路。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 如何配置内存文件系统tmpfs作为 Nginx 临时目录彻
    要让 Nginx 临时目录彻底脱离磁盘 I/O,关键不是挂个内存盘,而是把所有会触发同步写、小文件刷盘、跨设备 rename 的临时路径,全部精准替
  • 怎么在Nginx中配置集群级别的全局限流策略
    在 Nginx 中实现集群级别的全局限流,本质是突破单机限制,让多个 Nginx 实例共享同一套限流状态。但需明确:Nginx 原生的limit_req_zone和lim
  • nginx:stable镜像的使用及说明
    nginx:stable镜像的使用 以前使用的nginx:stable-alpine 但是https加载很慢,所以尝试换成nginx:stable,结果不仅https 快了,页面加载和接口调用都快了
  • Nginx使用upstream后端接口报 400
    upstream模块介绍 Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块,所支持的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和
  • 查看nginx是否已经启动的实现方式
    在 Ubuntu 或其他 Linux 系统上,要查看 Nginx 是否已经启动,您可以使用以下几种方法之一: 方法一:使用systemctl命令 Nginx 通常作为 systemd 服
  • 在Ubuntu上安装Nginx的实现过程
    在Ubuntu系统中从源码安装Nginx可以让您自定义Nginx的编译选项和模块,以满足特定需求。 以下是详细的步骤指南: 前提条件 更新系统包列表
  • Windows上启动停止Nginx服务器
    在 Windows 上开发 Django、Vue 或其他 Web 项目时,Nginx 往往是我们最常用的反向代理服务器。然而,不同于 Linux 系统上顺手的 systemctl 命令,
  • 使用nginx实现ssh跳板机方式
    基础环境 跳板机,IP:192.168.3.174 控制机01,IP:192.168.2.78 控制机02,IP:192.168.2.79 控制机01、控制机02只允许跳板机访问。 nginx安装 这里使用
  • Nginx缓存清理实现方式
    Nginx 作为一个高效的 Web 服务器和反向代理服务器,在提供快速的页面响应和优化 Web 性能方面起着至关重要的作用。 Nginx 的缓存机制通过存
  • 清空nginx缓存并强制刷新实现过程
    清空nginx缓存并强制刷新 当对nginx的文件进行修改或更新时,可能会出现旧文件被缓存而无法立即生效的问题,此时需要清空nginx的文件缓存
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计