Nginx 配置限流
在高并发环境下,合理的限流策略可以有效保护服务器资源,防止恶意攻击和异常流量冲击。这里介绍Nginx 的四种主要限流方式,包括 请求速率限流、连接数限流、请求体大小限流 和 带宽限流
1. 请求速率限流
请求速率限流用于控制单位时间内的请求数,防止单个 IP 频繁访问 API 或网页,造成服务器压力过大。
# 定义限流区域,每个 IP 每秒最多 10 个请求
limit_req_zone $binary_remote_addr zone=req_rate_zone:10m rate=10r/s;
server {
listen 80;
server_name localhost;
location /api/ {
# 限制请求速率,每秒最多 10 个请求,允许 20 次突发请求
limit_req zone=req_rate_zone burst=20 nodelay;
proxy_pass http://xxx.com;
#其它配置
}
}
limit_req_zone key zone=name:size rate=rate;
key
:限流的依据(通常使用$binary_remote_addr
代表 IP)。zone=name:size
:定义共享内存区域name
,用于存储限流信息,size
决定可存储多少条记录(10M 大约存储 16 万个条目)。rate=rate
:定义限流速率(单位r/s
,即请求数/秒)。作用:基于IP 地址进行限流,每秒最多 10 个请求。
limit_req zone=name [burst=number] [nodelay];
burst=number
:允许的突发请求数量(即短时间内超额请求的缓冲)。nodelay
:如果请求超出速率但在突发范围内,立即处理(不等待)。超过
burst
阈值的请求会返回 503 Service Unavailable。
使用场景
API 接口限流,防止恶意刷接口请求。
保护后端数据库查询,防止高频访问导致数据库崩溃。
2. 连接数限流
Nginx 支持限制同一 IP 的并发连接数,以防止某个 IP 过度占用资源。
# 定义连接数限制,每个 IP 允许的最大并发连接数为 5
limit_conn_zone $binary_remote_addr zone=conn_limit_zone:10m;
server {
listen 80;
server_name localhost;
location / {
# 限制每个 IP 最大 5 个并发连接
limit_conn conn_limit_zone 5;
proxy_pass http://xxx.com;
#其它配置
}
}
limit_conn_zone key zone=name:size;
key
:限流的依据(一般使用$binary_remote_addr
代表 IP)。zone=name:size
:定义共享内存区域,存储 IP 连接数信息。
limit_conn name number;
name
:共享内存区域名称。number
:允许的最大并发连接数,超过该数量的请求会被拒绝。
使用场景
适用于 Web 服务器,防止某个 IP 建立大量连接,导致其他用户无法访问。
适用于 WebSocket 连接,限制每个用户的同时连接数。
3. 请求体大小限流
限制请求体大小可以防止恶意用户上传超大文件,造成服务器资源消耗过多。
server {
listen 80;
server_name localhost;
location /upload/ {
# 限制上传文件大小,最大 10MB
client_max_body_size 10m;
proxy_pass http://xxx.com;
#其它配置
}
}
client_max_body_size size;
size
:最大允许的请求体大小(如10m
表示 10MB)。如果请求体超过这个大小,Nginx 会返回 413 Request Entity Too Large 错误。
使用场景
文件上传接口,防止用户上传超大文件。
防止恶意请求占用服务器存储资源。
4. 带宽限流
带宽限流主要用于限制单个用户的下载速率,防止某些用户占用过多网络资源。
server {
listen 80;
server_name localhost;
location /downloads/ {
# 下载前 100KB 不限速,之后限速 50KB/s
limit_rate_after 100k;
limit_rate 50k;
proxy_pass http://xxx.com;
#其它配置
}
}
limit_rate_after size;
size
:在传输size
字节之后再开始限速。
limit_rate rate;
rate
:单位为字节/秒,表示最大下载速率。
使用场景
限制静态资源(图片、视频、文件)下载速率,防止带宽被个别用户占用。
视频点播或直播场景,平衡用户体验和服务器压力。
总结
这些限流策略可以单独使用,也可以组合使用,根据不同业务需求调整配置。Nginx 自带的限流功能可以满足大多数需求。如果有需要,结合 Redis + Lua 进行扩展可以实现更复杂的限流(如动态调整限流规则、分布式限流等)。
#2024(13)评论