You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nginx中对特定URL进行不限客户端IP的请求限流?

Nginx全局URL限流(不区分客户端IP)实现方案

要实现对特定URL的全局请求限流(不区分客户端IP),可以利用Nginx的ngx_http_limit_req_module模块,通过固定key的共享内存区统一计数所有请求,具体配置如下:

1. 确认模块存在

首先确保你的Nginx已编译ngx_http_limit_req_module模块,执行以下命令检查:

nginx -V 2>&1 | grep -- '--with-http_limit_req_module'

如果输出包含该参数,说明模块可用;若未输出,需重新编译Nginx并添加该编译选项。

2. 配置全局限流规则

在Nginx的http块中定义全局限流的共享内存区,然后在目标URL对应的location块中应用限流规则:

http {
    # 定义全局限流共享内存区:
    # - key使用固定标识(这里用$server_name,多站点时可区分不同域名的全局限流;也可直接用字符串如"global_api")
    # - zone=global_api:10m 表示内存区名为global_api,分配10MB内存(足够存储计数状态)
    # - rate=1000r/s 表示每秒允许1000次请求
    limit_req_zone $server_name zone=global_api:10m rate=1000r/s;

    server {
        listen 80;
        server_name your_domain.com;

        location /api/handler.php {
            # 应用全局限流规则:
            # - zone=global_api 指定使用上述定义的内存区
            # - burst=0 表示超过速率的请求直接拒绝(若需允许突发请求,可设为合理值如200)
            # - nodelay 表示不等待排队,立即返回错误(避免请求堆积)
            limit_req zone=global_api burst=0 nodelay;

            # 以下为你的原有业务配置(示例为PHP-FPM场景)
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

3. 关键参数说明

  • limit_req_zone:核心是固定key,确保所有请求都计入同一个计数器,而非按客户端IP区分。
  • burst:允许的突发请求数。设为0则严格限制每秒1000次;若设为200,则允许短时间内有200次超出速率的请求被处理(后续超出的仍会被拒绝)。
  • nodelay:配合burst使用,突发请求无需等待,直接处理,避免请求排队超时。

4. 验证限流效果

可以用压测工具验证,比如ab:

ab -n 2000 -c 100 http://your_domain.com/api/handler.php

压测后查看结果,超过1000次/秒的请求会返回503 Service Unavailable,符合预期则说明配置生效。

自定义错误响应(可选)

若需要替换默认的503页面,可添加如下配置:

error_page 503 /custom_503.html;

location = /custom_503.html {
    root /path/to/your/static/files;
    internal;
}

内容的提问来源于stack exchange,提问作者uzurik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:43:11