Nginx 限流
Nginx 限流指的是利用 Nginx 自身提供的模块,对进入服务的请求进行速率控制,从而防止流量激增时服务被压垮。

通过限流机制,Nginx 可以对某个 IP、接口或用户维度的访问频率进行限制,从而防止服务过载、恶意攻击或资源滥用。
主要有两个核心模块:
limit_req
基于请求速率的限流模块,通过设置请求的单位时间内允许的最大请求数来平滑流量。
ngx_http_limit_req_module
:限制请求速率(QPS)。
limit_conn
限制单个客户端或连接的同时并发数,防止单个用户消耗过多资源。
ngx_http_limit_conn_module
:限制并发连接数。
Nginx限流原理
Nginx 的限流:主要依赖于令牌桶算法(Token Bucket)。
该算法工作的基本思路如下:
- 令牌生成系统以固定速率在一个“令牌桶”中不断添加令牌,令牌桶有一个上限容量。
- 令牌消耗当有请求到来时,需要从令牌桶中取走一个或多个令牌才能被允许执行。如果令牌不够,则请求会被拒绝或延时处理。
- 允许突发配置中可以设置一个突发(burst)值,这样在短时间内允许超过限速的请求积攒一定额度,适应瞬时流量波动。
通过这样的机制,Nginx 能够对请求进行即时判断,从而实现“速率平滑”的效果,在整个流量峰值期间保护后端服务的稳定性。
Nginx 限流配置
http {
# 定义限流区域
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server {
location /api/ {
# 应用限流规则
limit_req zone=req_limit_per_ip burst=10 nodelay;
proxy_pass http://backend_api;
}
}
}
适用于:防止单个 IP 在短时间内频繁请求 API 接口。
基于并发连接数的限流配置,假设我们要限制每个 IP 最多建立 10 个并发连接。
如下所示:
http {
# 定义连接限制区域,基于客户端 IP,分配 10MB 内存
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name example.com;
location / {
# 限制每个 IP 的最大并发连接数为 10
limit_conn zone=conn_limit 10;
root /var/www/html;
index index.html;
}
}
}
limit_conn_zone:定义连接限制区域。
limit_conn:设置每个 IP 的最大并发连接数为 10,超出限制的请求将被拒绝。
总之,Nginx 限流是一种高效的流量管理手段,能够帮助开发者应对高并发、恶意攻击和资源滥用等问题。