美国云服务器每秒受到数百次由同一个IP登录请求或者是接口刷取尝试,很容易让业务系统在几分钟内被拖垮。Nginx作为流量的入口,内置防护机制能够有效精准切断异常请求流量。下面为大家详细解读Nginx是如何在美国云服务器中限制IP访问频率的。
美国云服务器Nginxlimit_req模块采用漏桶算法,可以控制请求到达业务层的速率,以下配置能限制单个IP每秒最多发起10个请求,突发流量暂存5个请求。
nginx
http {
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=ip_limit burst=5 nodelay;
proxy_pass http://backend;
}
}
}
zone=ip_limit:10m:分配10MB内存存储IP状态,约可记录16万个IP。
rate=10r/s:每秒10次请求限制,实际按毫秒平滑处理(即每100ms允许1次)。
burst=5:允许瞬时超出5个请求,超出部分排队处理而非直接拒绝。
nodelay:突发请求立即处理而非延迟,避免客户端长时间等待。
恶意爬虫往往高频访问特定动态接口,而正常用户主要触发静态资源(如图片、CSS)。通过差异化限速保护核心业务:
nginx
map $uri $limit_bucket {
~^/api/ "dynamic";
default "static";
}
limit_req_zone $binary_remote_addr zone=dynamic_limit:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=static_limit:10m rate=50r/s;
server {
location /api/ {
limit_req zone=dynamic_limit burst=3;
proxy_pass http://backend;
}
location / {
limit_req zone=static_limit burst=20;
root /var/www/html;
}
}
此策略将动态接口限制为每秒5次,静态资源放宽至50次,既不影响用户体验,又保护关键业务。
CDN节点、内部监控系统等可信IP需加入白名单,避免误伤:
nginx
geo $whitelist {
default 0;
192.168.1.0/24 1; 内网IP
203.0.113.50 1; CDN节点
}
map $whitelist $limit_key {
0 $binary_remote_addr;
1 "";
}
limit_req_zone $limit_key zone=all_limit:10m rate=20r/s;
server {
location / {
limit_req zone=all_limit burst=10;
...其他配置
}
}
白名单内的IP不受限速规则约束,确保关键服务畅通无阻。对于持续攻击的IP,可使用OpenResty的Lua扩展实现动态封禁:
nginx
http {
lua_shared_dict ip_blacklist 10m;
init_by_lua_block {
local blacklist = ngx.shared.ip_blacklist
blacklist:set("192.0.2.100", 1) 初始黑名单
}
server {
access_by_lua_block {
local client_ip = ngx.var.remote_addr
local blacklist = ngx.shared.ip_blacklist
if blacklist:get(client_ip) then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
location /report {
content_by_lua_block {
local client_ip = ngx.var.remote_addr
local blacklist = ngx.shared.ip_blacklist
blacklist:set(client_ip, 1, 3600) 封禁1小时
ngx.say("IP ", client_ip, " 已被加入黑名单")
}
}
}
}
自动拦截黑名单IP,人工或外部系统可通过/report接口动态添加恶意IP。
结合WAF日志分析工具,可自动识别攻击IP并调用接口封禁。 攻击者常通过代理IP池或慢速攻击绕过基础防护,需组合策略应对:
UserAgent过滤:拦截非常见浏览器标识
nginx
if ($http_user_agent ~ "wget|curl|python") {
return 403;
}
验证码挑战:对高频IP返回验证码页面
nginx
error_page 503 @verify;
location @verify {
add_header ContentType text/html;
return 200 '<html>请完成验证码<iframe src="/captcha"></iframe></html>';
}
日志分析与动态调整使用GoAccess分析Nginx日志,识别异常请求模式,根据业务高峰时段动态调整限速阈值如促销期间临时放宽限制。
配置完成后需验证规则是否生效:
手动测试,触发限速
for i in {1..15}; do curl http://server/api/login; done
观察返回429 Too Many Requests
自动化压测(查看成功率与拒绝请求数 ):
ab n 1000 c 50 http://server/api/login
监控指标: Nginx活跃连接数(ngx_http_active_connections) 、限速模块拒绝次数(ngx_http_limit_req_status) 。
综上看Nginx精细化的流量管控,无需依赖昂贵的安全硬件,即可在代码层面筑起一道自适应防线。