明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

高并发场景下,Nginx如何限流应对并发?

Posted on 2025-05-14 09:59  且行且思  阅读(112)  评论(0)    收藏  举报

Nginx 限流

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

通过限流机制,Nginx 可以对某个 IP、接口或用户维度的访问频率进行限制,从而防止服务过载、恶意攻击或资源滥用。

主要有两个核心模块:

limit_req

基于请求速率的限流模块,通过设置请求的单位时间内允许的最大请求数来平滑流量。

ngx_http_limit_req_module:限制请求速率(QPS)。

limit_conn

限制单个客户端或连接的同时并发数,防止单个用户消耗过多资源。

ngx_http_limit_conn_module:限制并发连接数。



Nginx限流原理

Nginx 的限流:主要依赖于令牌桶算法(Token Bucket)。

该算法工作的基本思路如下:

  1. 令牌生成系统以固定速率在一个“令牌桶”中不断添加令牌,令牌桶有一个上限容量。
  2. 令牌消耗当有请求到来时,需要从令牌桶中取走一个或多个令牌才能被允许执行。如果令牌不够,则请求会被拒绝或延时处理。
  3. 允许突发配置中可以设置一个突发(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 限流是一种高效的流量管理手段,能够帮助开发者应对高并发、恶意攻击和资源滥用等问题。