法国云服务器Nginx如何配置连接限流?
- 来源:纵横数据
- 作者:中横科技
- 时间:2026/8/31 10:54:14
- 类别:新闻资讯
在法国云服务器上部署Web服务后,随着访问量的增长,难免会遇到恶意爬虫刷接口、CC攻击、突发流量冲击等问题。如果不做任何流量控制,所有请求一股脑打到后端,轻则导致服务响应变慢,重则直接拖垮数据库连接池,造成整个服务雪崩。Nginx作为高性能的反向代理服务器,内置了强大的限流模块,可以在接入层就完成流量管控,以极低的资源开销保护后端服务。下面从原理到实践,详细讲解如何在Nginx中配置连接限流。
区分两种限流:连接数限制与请求速率限制
在动手配置之前,需要先理解Nginx提供的两种限流机制的区别,这样才能根据实际场景选择合适的策略。
limit_conn模块负责限制并发连接数,它统计的是同一个IP同时保持的活跃TCP连接数量。比如设置每个IP最多10个并发连接,那么当某个IP已经建立了10个连接时,第11个连接会被直接拒绝。这种机制适合防范慢连接攻击和单IP占用过多连接资源的场景。
limit_req模块负责限制请求速率,它基于漏桶算法控制单位时间内的请求数量。比如设置每个IP每秒最多10个请求,超出速率的请求会被延迟处理或直接拒绝。这种机制适合防范高频刷接口、暴力破解、CC攻击等场景。
两者解决的是不同维度的问题,生产环境中通常建议组合使用,形成完整的连接限流防护体系。
配置并发连接数限制
并发连接数限制的配置分为两步:先在http块中定义共享内存区域,再在server或location块中启用限制。
在nginx.conf的http块中添加:
limit_conn_zone $binary_remote_addr zone=perip:10m;
这里使用$binary_remote_addr而不是$remote_addr,是因为二进制格式的IP地址占用的内存更少,10MB的共享内存大约可以存储16万到30万个独立IP的连接状态。如果预估访问IP数量较大,可以适当调高到20m。
然后在需要防护的location块中启用限制:
location /api/ {
limit_conn perip 10;
limit_conn_status
429;
proxy_pass http://backend;
}
limit_conn perip 10表示每个IP最多允许10个并发连接,超出的连接会被拒绝。limit_conn_status 429将默认的503状态码改为429 Too Many Requests,语义更加明确,也方便前端做针对性的错误处理。
配置请求速率限制
请求速率限制同样需要两步配置。首先在http块中定义限流区域和基准速率:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
rate=10r/s表示每个IP每秒最多处理10个请求。对于登录、短信验证码等低频接口,也可以使用r/m(每分钟请求数)作为单位,控制粒度更精准。
然后在location块中应用限流规则:
location /api/ {
limit_req zone=api_limit burst=20
nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
这里的burst和nodelay是理解请求速率限制的关键。burst=20表示允许瞬时超出基准速率的请求进入一个长度为20的缓冲区。nodelay表示缓冲区内的请求立即处理,不做排队延迟。如果不加nodelay,缓冲区内的请求会按照基准速率排队处理,导致响应延迟明显增大,对于接口类服务来说体验很差。
举个例子,当rate=10r/s、burst=20且带nodelay时,如果某个IP瞬间发来50个请求,前30个会被立即处理(10个按基准速率,20个走burst缓冲区),第31个及之后的请求会被直接拒绝并返回429。
组合使用两种限流机制
将并发连接数限制和请求速率限制组合在一起,可以同时防范"多连接慢速攻击"和"高频刷接口"两种威胁:
http {
limit_conn_zone $binary_remote_addr
zone=perip:10m;
limit_req_zone $binary_remote_addr zone=api_limit:10m
rate=10r/s;
server {
listen 80;
server_name yourdomain.com;
location /api/ {
limit_conn perip 10;
limit_req zone=api_limit burst=20
nodelay;
limit_conn_status 429;
limit_req_status 429;
proxy_pass http://backend;
}
}
}
配置IP白名单避免误伤
生产环境中,办公网络、监控节点、健康检查探针等来源的请求不应该被限流。可以通过geo和map指令组合实现白名单机制:
geo $is_whitelist {
default 1;
10.0.0.0/8 0;
172.16.0.0/12
0;
192.168.0.0/16 0;
}
map $is_whitelist $limit_key {
0 "";
1 $binary_remote_addr;
}
然后将limit_req_zone中的$binary_remote_addr替换为$limit_key:
limit_req_zone $limit_key zone=api_limit:10m rate=10r/s;
当请求来自白名单IP时,$limit_key为空字符串,Nginx会跳过限流逻辑,这些IP的请求不受任何限制。
实际案例:API服务遭遇高频刷接口后的限流加固
曾有一个案例,某团队在法国云服务器上部署了一个用户注册和登录的API服务,上线后不久就遭遇了暴力破解攻击。攻击者使用自动化脚本,从少量IP地址以极高的频率发送登录请求,尝试各种用户名和密码组合。由于没有限流机制,大量无效请求直接打到后端服务,数据库连接池被迅速耗尽,正常用户也无法登录。
运维团队在Nginx中针对登录接口配置了严格的限流策略。对于/api/login路径,设置每个IP每秒最多2个请求,burst为5,并发连接数限制为3。对于其他普通API接口,设置每秒10个请求,burst为20。同时配置了办公网络的IP白名单,避免内部测试被误限流。
配置生效并reload Nginx后,攻击者的请求被大量返回429状态码,后端服务的数据库连接池不再被耗尽,正常用户的登录请求响应时间恢复到了正常水平。
针对不同接口设置差异化阈值
限流策略不应该一刀切,需要根据不同接口的业务特点设置差异化的阈值。
对于登录、注册、短信验证码等敏感接口,应该设置最严格的限流,比如每秒2到5个请求,防止暴力破解和短信轰炸。
对于普通查询类接口,可以适当放宽到每秒10到20个请求,保证正常用户的浏览体验。
对于静态资源的访问,通常不需要做请求速率限制,因为Nginx处理静态文件的开销极低,但可以通过limit_rate指令限制单个连接的下载带宽,防止大文件下载占满服务器带宽。
验证限流效果
配置完成后,可以通过ab压测工具快速验证限流是否生效:
ab -n 100 -c 20 http://yourdomain.com/api/test
执行后查看返回结果中429状态码的占比是否符合预期。同时可以通过tail -f /var/log/nginx/error.log实时观察错误日志,命中限流时会出现"limiting requests"或"limiting connections by zone"的日志记录,方便确认限流规则是否正确触发。
总结
在法国云服务器上通过Nginx配置连接限流,核心思路是组合使用limit_conn和limit_req两个模块,分别从并发连接数和请求速率两个维度进行流量管控。配置时需要注意合理设置burst和nodelay参数,为合法突发流量留出缓冲空间;通过geo和map指令配置IP白名单,避免误伤正常请求;针对不同接口设置差异化的限流阈值,在安全防护和用户体验之间找到平衡。Nginx层面的限流开销极低,是保护后端服务的第一道防线,也是生产环境中不可或缺的基础安全措施。
纵横云服务器租赁,欢迎随时联系,客服联系方式:QQ3494196421,手机微信19906048601。




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

