如何在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
相关产品推荐
相关产品推荐

