Nginx限流最全详解(图文全面总结)

在很多大流量高并发的场景,如果用户并发量很高就会出现宕机的局面,所以这个时候都会涉及到限流@mikechen

高并发限流

限流是一种流量控制机制,用于限制客户端对服务器的请求速率、或并发连接数。

Nginx限流最全详解(图文全面总结)-mikechen

通过限流,可以保护服务器免受过多请求的影响,防止因请求过载而导致系统性能下降、或崩溃。

限流能过滤掉恶意请求、和非正常流量,防止瞬时流量激增对后端应用或数据库造成冲击,确保系统整体稳定性。

比如:防止拒绝服务攻击(DoS)限流机制,可以有效缓解 DoS 攻击和暴力破解尝试,在攻击初期就控制请求量,为运维提供响应时间和缓解措施。

 

Nginx 限流

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

Nginx限流最全详解(图文全面总结)-mikechen

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

主要有两个核心模块:

limit_req

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

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

limit_conn

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

ngx_http_limit_conn_module:限制并发连接数。

 

Nginx限流原理

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

如下图所示:

Nginx限流最全详解(图文全面总结)-mikechen

        +--------------+
        | 令牌桶       |  <--- 定时添加令牌
        +--------------+
             |
请求到达 → 判断令牌:有令牌则通过,无令牌则拒绝(或延时)

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

  1. 令牌生成系统以固定速率在一个“令牌桶”中不断添加令牌,令牌桶有一个上限容量。
  2. 令牌消耗当有请求到来时,需要从令牌桶中取走一个或多个令牌才能被允许执行。如果令牌不够,则请求会被拒绝或延时处理。
  3. 允许突发配置中可以设置一个突发(burst)值,这样在短时间内允许超过限速的请求积攒一定额度,适应瞬时流量波动。

通过这样的机制,Nginx 能够对请求进行即时判断,从而实现“速率平滑”的效果,在整个流量峰值期间保护后端服务的稳定性。

 

Nginx 限流配置

每个 IP 每秒最多 5 个请求,最多允许 10 个突发请求(瞬时爆发)。

如下所示:

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 限流是一种高效的流量管理手段,能够帮助开发者应对高并发、恶意攻击和资源滥用等问题。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法