之前写了一篇关于 文章 如何系统架构防爬虫的常用技术方案 ,
提到Nginx限流配置,最近自己用上了这个,临时记录在这。 需要的同学自取。
当单IP请求速率异常飙升时,可能面临:
消耗服务器资源据统计,60%的服务瘫痪源于未管控的突发流量而非真实用户压力
nginx配置
http {
# 定义限流区:10MB内存,每秒100请求/IP
limit_req_zone $binary_remote_addr zone=req_ip:10m rate=100r/s
}
burst定义桶容量,允许瞬时突破基础速率nodelay立即处理突发请求,避免延迟nginx配置
http {
# 二进制IP存储节省50%内存[4](@ref)
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=200r/s;
server {
location /api/ {
# 启用限流+突发50请求
limit_req zone=ip_limit burst=50 nodelay;
proxy_pass http://backend;
# 超限返回429状态码(默认503)
limit_req_status 429;
}
}
}
关键参数解析:
burst=50:允许单IP瞬时250请求(200+50)场景 | 配置方案 | 作用 |
|---|---|---|
高频API防护 | burst=20 nodelay | 防刷同时允许合理突发 |
登录安全 | rate=5r/s burst=0 | 彻底禁止高频尝试 |
静态资源 | rate=500r/s burst=100 | 避免阻塞页面加载 |
下载限速 | 配合limit_rate 100k | 防止带宽耗尽 |
nginx配置
http {
lua_shared_dict block_ip m; # 共享内存存储黑名单
server {
location / {
access_by_lua_block {
local blacklist = ngx.shared.block_ip
if blacklist:get(ngx.var.remote_addr) then
return ngx.exit()
end
}
}
# 封禁接口(需鉴权!)
location /admin/block {
content_by_lua_block {
ngx.shared.block_ip:set(ngx.var.arg_ip, true, )
}
}
}
}
实时拦截高频攻击源,封禁时长可动态调整
nginx -t && systemctl reload nginx # 验证配置并热重载
所有限流策略的核心不是拦截攻击,而是确保真实用户的请求永不失败。需要设置合理的阈值,拦截掉异常请求,也允许真实用户正常访问。
小tip: 同一个区域网访问网站,可能是同一个外网ip,系统设计的时候需要考虑到这点, 不管是放入白名单还是设置合理阈值。