咨询热线:4006-75-4006
售前:9:00-23:30 备案:9:00-18:00 技术:7*24h
Nginx 请求限流配置
欢迎来到8455线路检测中心技术小课堂,每天分享一个技术小知识。
Nginx 请求限流是生产环境最常用的防护手段之一,基于标准令牌桶算法实现的 ngx_http_limit_req_module,可精准控制单 IP 单位时间内的请求频次,有效抵御爬虫刷接口、恶意攻击导致的服务雪崩,是云运维场景下的基础防护标配,几乎所有对外暴露的 Web 服务都需配置。
限流核心配置分为全局 zone 定义与 location 层规则绑定两部分,首先在 http 块内声明限流内存区域,使用作为限流键,相比普通remote_addr 可节省约一半内存空间,10M 内存大约可承载 16 万个 IP 的限流状态存储,rate 参数定义基准速率为每秒 10 个请求:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
在对应接口的 location 块中绑定限流规则,burst 参数设置突发请求队列长度,允许瞬时超过基准速率的 20 个请求进入队列等待处理;搭配 nodelay 参数后,突发请求会立即分配令牌处理,超出总阈值的请求直接返回错误,不会产生排队延迟,更适合接口类服务:
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_req_log_level warn;
limit_req_status 429;
proxy_pass http://www.landui.com_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
生产环境通常需要配置内部 IP 白名单,避免办公网、监控节点的正常请求被误限流,可通过 geo 与 map 指令组合实现,白名单 IP 对应的限流键为空值,自动跳过限流逻辑:
geo $is_limit {
default 1;
10.0.0.0/8 0;
172.16.0.0/12 0;
192.168.1.0/24 0;
}
map $is_limit $limit_key {
0 "";
1 $binary_remote_addr;
}
将原先 limit_req_zone 中的替换为limit_key 即可生效。
配置中有三个高频踩坑点:一是 limit_req_zone 指令必须定义在 http 块层级,放在 server 块内会触发配置报错;二是 rate 参数支持 r/s(每秒请求数)与 r/m(每分钟请求数)两种单位,登录、短信等低频接口建议用 r/m 控制粒度更精准;三是未加 nodelay 时,突发请求会按基准速率排队处理,响应耗时大幅上升,接口类场景必须添加该参数。
可自定义限流响应内容,返回统一格式的 JSON 提示,替代默认的 503 错误页:
error_page 429 /limit_tip.json;
location = /limit_tip.json {
default_type application/json;
return 429 '{"code":429,"message":"请求过于频繁,请稍后再试"}';
}
验证限流效果可通过 ab 压测工具,执行`ab -n -c 10 http://www.landui.com/api/test`,查看返回结果中 429 状态码占比是否符合预期。生产环境建议针对不同接口设置差异化阈值,登录、验证码等接口严格限流防暴力破解,静态资源接口适当放宽,同时可配合 fail2ban 将频繁触发限流的 IP 加入封禁列表,进一步提升防护效果。
8455线路检测中心官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,8455线路检测中心整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。
更多技术知识,8455线路检测中心期待与你一起探索。