南京云主机Nginx如何配置请求限流?
- 来源:纵横数据
- 作者:中横科技
- 时间:2026/9/9 17:27:04
- 类别:新闻资讯
网站上线后,最怕的就是突然来一波异常流量把后端服务打崩。无论是恶意爬虫高频刷接口、接口被脚本党薅羊毛,还是促销活动流量突增,如果没有一层有效的限流防护,后端数据库和应用程序很容易被瞬间压垮。Nginx作为南京云主机上最常用的反向代理服务器,本身就内置了强大的限流能力,不需要额外安装任何第三方模块,配置得当就能挡住绝大多数异常流量。下面从原理到实战,完整梳理Nginx请求限流的配置方法。
一、Nginx限流的两大核心武器
Nginx提供了两个官方限流模块,分别应对不同的防护场景。
第一个是ngx_http_limit_req_module,负责限制请求速率,也就是控制单个IP在单位时间内的请求次数。它基于漏桶算法实现,适合应对高频刷接口、恶意爬虫等场景。比如一个正常用户浏览网页,每秒最多产生两三个请求,如果有人每秒发几百个请求过来,那大概率不是正常用户。
第二个是ngx_http_limit_conn_module,负责限制并发连接数,也就是控制单个IP同时能建立多少条TCP连接。它适合防止单IP大量长连接占满服务器连接池,在文件下载、长连接等场景中效果显著。
两者搭配使用,既能限制请求频率,又能限制并发数量,形成完整的流量防护屏障。
二、配置请求速率限制
打开Nginx主配置文件,在http块中定义限流区域:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
这行配置的含义是:以客户端IP的二进制格式作为限流依据,创建一个名为req_limit的共享内存区域,大小为10MB(大约能存储16万个IP的状态记录),限制每个IP每秒最多发出10个请求。这里使用$binary_remote_addr而不是$remote_addr,是因为二进制格式更节省内存,IPv4只占4字节,IPv6占16字节。
然后在需要限流的location块中应用这个规则:
location /api/ {
limit_req zone=req_limit burst=20
nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
burst=20表示允许突发20个请求进入缓冲区排队,而不是超出rate就立即拒绝。nodelay表示这些突发请求不排队等待,直接处理,只有超出burst数量的请求才会被拒绝。如果不加nodelay,突发请求会按照rate的速率排队延迟处理,用户会明显感受到响应变慢。limit_req_status 429将默认的503状态码改为429 Too Many Requests,这是HTTP协议中专门用于限流的标准状态码,对前端和搜索引擎更友好。
三、配置并发连接数限制
在http块中定义连接限制区域:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
然后在location块中应用:
location /api/ {
limit_conn conn_limit 10;
proxy_pass http://backend;
}
limit_conn conn_limit 10表示每个IP最多同时建立10条并发连接。这个配置对于防止单IP通过大量长连接耗尽服务器资源非常有效。需要注意的是,在HTTP/2多路复用场景下,连接数限制的效果会弱化,因为多个请求可以共享同一条连接。
四、一个真实案例:电商秒杀接口的限流防护
某电商平台的南京云主机上部署了一套秒杀系统,后端是Java微服务集群。上线后第一次做促销活动,流量瞬间翻了十几倍,大量用户和脚本同时涌入秒杀接口,后端数据库连接池在几秒内被耗尽,整个服务直接瘫痪,用户看到的是一片502错误。
事后复盘发现,问题根源在于Nginx层面没有任何限流措施,所有请求无论正常还是异常,都被原封不动地转发到了后端。按照以下方案添加限流配置后,情况得到了根本性改善:
在http块中添加:
limit_req_zone $binary_remote_addr zone=seckill_limit:10m
rate=5r/s;
limit_conn_zone $binary_remote_addr zone=seckill_conn:10m;
在秒杀接口的location块中添加:
location /api/seckill/ {
limit_req zone=seckill_limit burst=10
nodelay;
limit_req_status 429;
limit_conn seckill_conn 5;
proxy_pass http://seckill_backend;
}
这套配置的效果是:每个IP每秒最多5个请求,允许突发10个,超出部分直接返回429;每个IP最多5条并发连接。重新压测后,后端服务的请求量被平稳地控制在了可承受范围内,即使面对脚本刷单也能从容应对,服务全程稳定运行。
五、白名单机制:避免误伤正常流量
全局限流有一个潜在风险,就是可能误伤内部监控、运维工具或合作方的正常请求。可以通过geo和map模块实现白名单绕过:
geo $whitelist {
default 1;
10.0.0.0/8 0;
172.16.0.0/12
0;
192.168.0.0/16 0;
}
map $whitelist $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_limit:10m rate=10r/s;
这段配置的原理是:内网IP段被标记为白名单,对应的$limit_key为空字符串,Nginx遇到空字符串key时会自动跳过限流检查,从而实现白名单放行。
六、进阶技巧:多维度限流与干跑模式
除了基于IP限流,Nginx还支持基于其他维度进行限流。比如基于API Key限流,可以将limit_req_zone的key改为$http_x_api_key,这样每个API密钥都有独立的速率配额。基于请求URI限流,可以将key改为$request_uri,对不同接口设置不同的限流策略。
如果你的Nginx版本在1.17.1以上,还可以使用limit_req_dry_run on开启干跑模式。这个模式下Nginx会记录哪些请求会被限流,但不会实际拒绝它们,非常适合在生产环境上线限流策略前做观察和调参,避免配置过于激进误伤正常用户。
七、验证限流是否生效
配置完成后,执行nginx -t检查语法,确认无误后执行nginx -s reload重载配置。然后用ab或wrk等压测工具模拟高频请求,观察返回结果中是否出现了429状态码。也可以在Nginx的error_log中查看限流相关的日志记录,确认限流规则正在按预期工作。
总结
南京云主机上Nginx的请求限流配置,核心思路是"速率限制加连接限制双管齐下"。通过limit_req_zone和limit_req控制单IP的请求频率,通过limit_conn_zone和limit_conn控制单IP的并发连接数,再配合白名单机制避免误伤、干跑模式辅助调参,就能构建起一套轻量高效的流量防护体系。这套方案不需要额外安装任何模块,配置简单、性能开销极低,是保护后端服务稳定运行的第一道防线。
纵横云服务器租赁,欢迎随时联系,客服联系方式:QQ3494196421,手机微信19906048601。




使用微信扫一扫
扫一扫关注官方微信 

