简述Nginx限流怎么做的?

参考回答

Nginx 限流(Rate Limiting)是通过限制客户端请求的速率来控制访问频率,避免系统资源被滥用,保障服务的稳定性。Nginx 提供了多种方式来实现限流,常用的有基于 请求数连接数 的限流方式。最常用的限流方法是通过 limit_reqlimit_conn 模块来进行控制。

详细讲解与拓展

  1. 基于请求数的限流 (limit_req)
    limit_req 模块用于限制每个客户端 IP 在一定时间内发起的请求数。它通常用于防止某个客户端频繁访问某个资源。

    配置示例

    http {
       # 定义一个请求限制区域
       limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s;
    
       server {
           listen 80;
           server_name example.com;
    
           location / {
               # 限制请求频率为每秒 1 个请求
               limit_req zone=req_limit_per_ip burst=5 nodelay;
    
               # 其他配置
               root /var/www/html;
               index index.html;
           }
       }
    }
    
    nginx

    解释

    • limit_req_zone:定义一个名为 req_limit_per_ip 的区域,用于存储客户端的请求信息。$binary_remote_addr 是一个表示客户端 IP 地址的变量,zone=req_limit_per_ip:10m 表示使用 10MB 的共享内存,rate=1r/s 表示每个 IP 每秒最多只能发起 1 个请求。
    • limit_req:限制某个路径的请求速率,burst=5 表示允许 5 个突发请求,而 nodelay 表示如果请求数超过 1 个请求/秒时,直接丢弃多余的请求。

    这种方式适用于防止某个客户端短时间内过于频繁地请求相同的资源。

  2. 基于连接数的限流 (limit_conn)
    limit_conn 模块用于限制每个客户端(或者整个服务)的并发连接数。它通常用于限制用户在特定时间内的最大连接数,防止资源被某个客户端占满。

    配置示例

    http {
       # 定义连接限制区域
       limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    
       server {
           listen 80;
           server_name example.com;
    
           location / {
               # 限制每个 IP 的最大并发连接数为 1
               limit_conn conn_limit_per_ip 1;
    
               # 其他配置
               root /var/www/html;
               index index.html;
           }
       }
    }
    
    nginx

    解释

    • limit_conn_zone:定义了一个共享内存区域,用于存储每个客户端的连接信息,zone=conn_limit_per_ip:10m 表示使用 10MB 内存来存储客户端的连接信息。
    • limit_conn:限制某个路径的最大并发连接数,limit_conn conn_limit_per_ip 1 表示每个 IP 最多只能有 1 个并发连接。

    这种方式适用于限制过多的并发连接,以避免对服务器资源的过度占用。

  3. 结合 limit_reqlimit_conn 实现复合限流
    有时为了进一步增强限流效果,可以将请求数限制和连接数限制结合起来进行配置。这可以有效避免恶意用户通过多个连接或过于频繁的请求来攻击服务器。

    示例

    http {
       # 定义请求和连接限制区域
       limit_req_zone binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s;
       limit_conn_zonebinary_remote_addr zone=conn_limit_per_ip:10m;
    
       server {
           listen 80;
           server_name example.com;
    
           location / {
               # 限制每秒最多 2 个请求
               limit_req zone=req_limit_per_ip burst=5 nodelay;
    
               # 限制每个 IP 最多只能有 1 个并发连接
               limit_conn conn_limit_per_ip 1;
    
               # 其他配置
               root /var/www/html;
               index index.html;
           }
       }
    }
    
    nginx

    在这个示例中,Nginx 将同时限制每个 IP 的请求频率和并发连接数。每秒最多 2 个请求和 1 个并发连接。

  4. 限流的错误处理
    当请求或连接超出设定的限流阈值时,Nginx 会返回 503 Service Unavailable 错误,表示服务器当前无法处理该请求。

    你可以自定义该错误页面,例如:

    error_page 503 /custom_503.html;
    location = /custom_503.html {
       root /var/www/html;
       internal;
    }
    
    nginx

    在该配置中,当达到限流条件时,Nginx 会返回 503 错误,并展示一个自定义的错误页面。

总结

Nginx 限流通过 limit_reqlimit_conn 模块来实现,分别限制请求频率和并发连接数。limit_req 用于限制请求的速率,limit_conn 用于限制每个客户端的并发连接数。这些配置可以帮助防止恶意攻击、避免过载,并保证系统的稳定性。通过合理配置这些限流策略,可以确保 Web 服务器的高效运行。

发表评论

后才能评论