nginx请求限流设置:常见的有基于 IP 地址的限流、基于请求速率的限流以及基于连接数的限流

发布于:2025-03-16 ⋅ 阅读:(20) ⋅ 点赞:(0)

在 Nginx 中可以通过不同的方式进行请求限流,常见的有基于 IP 地址的限流、基于请求速率的限流以及基于连接数的限流等,以下为你详细介绍各种限流设置的实现方法。

基于 IP 地址的限流

这种方式可以限制每个 IP 地址在一定时间内的请求次数。

配置步骤
  1. 定义限流区域:在 http 块中定义一个限流区域,使用 limit_req_zone 指令。

http {
    # 定义一个名为 one 的限流区域,使用 $binary_remote_addr 作为键(即客户端 IP 地址)
    # zone=one:10m 表示分配 10MB 的内存来存储限流信息
    # rate=1r/s 表示允许每个 IP 地址每秒最多发起 1 个请求
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 应用名为 one 的限流规则
            limit_req zone=one;
            proxy_pass http://backend;
        }
    }

配置解释

  • $binary_remote_addr:表示客户端的 IP 地址,使用二进制形式存储,节省内存。
  • zone=one:10m:定义一个名为 one 的限流区域,分配 10MB 的内存来存储限流信息。
  • rate=1r/s:表示允许每个 IP 地址每秒最多发起 1 个请求。
  • limit_req zone=one:在 location 块中应用名为 one 的限流规则。
可选参数
  • burst:允许突发的请求数量。例如 limit_req zone=one burst=5,表示允许在瞬间有 5 个突发请求,但后续请求会按照设定的速率进行限制。
  • nodelay:当突发请求超过 burst 数量时,不进行延迟处理,直接返回 503 错误。例如 limit_req zone=one burst=5 nodelay

基于请求速率的限流

除了基于 IP 地址限流,还可以对整个服务器的请求速率进行限制。

配置步骤

 

http {
    limit_req_zone $server_name zone=all:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=all;
            proxy_pass http://backend;
        }
    }
}

配置解释
  • $server_name:表示服务器名称,这里以服务器名称为键进行限流。
  • zone=all:10m:定义一个名为 all 的限流区域,分配 10MB 的内存。
  • rate=10r/s:表示整个服务器每秒最多允许 10 个请求。

基于连接数的限流 

可以限制每个客户端 IP 地址的最大连接数。

配置步骤

http {
    # 定义一个名为 conn_limit 的限流区域,使用 $binary_remote_addr 作为键
    # zone=conn_limit:10m 表示分配 10MB 的内存来存储连接信息
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 限制每个 IP 地址最多同时建立 5 个连接
            limit_conn conn_limit 5;
            proxy_pass http://backend;
        }
    }
}

 

配置解释
  • limit_conn_zone $binary_remote_addr zone=conn_limit:10m:定义一个名为 conn_limit 的连接限制区域,使用客户端 IP 地址作为键,分配 10MB 的内存来存储连接信息。
  • limit_conn conn_limit 5:在 location 块中应用连接限制规则,限制每个 IP 地址最多同时建立 5 个连接。

验证配置并重启 Nginx

在修改完 Nginx 配置文件后,需要验证配置的正确性并重启 Nginx 服务。

# 验证配置文件
sudo nginx -t

# 重启 Nginx 服务
sudo systemctl restart nginx

Nginx 请求限流可以通过多种模块来实现,常见的有ngx_http_limit_req_module模块和ngx_http_limit_conn_module模块,以下是它们的对比:

功能特点

  • ngx_http_limit_req_module:主要用于限制请求的速率,通过漏桶算法来控制请求的处理速度,允许一定数量的请求在桶中排队等待处理,超过限制的请求则会被拒绝。可以根据客户端的 IP 地址、特定的请求头或其他变量来限制请求速率。
  • ngx_http_limit_conn_module:用于限制连接数,即同时连接到服务器的客户端数量。它可以根据客户端的 IP 地址或其他变量来限制每个 IP 地址或整个服务器的连接数。

应用场景

  • ngx_http_limit_req_module:适用于对请求频率有严格限制的场景,例如防止恶意攻击、限制 API 接口的调用频率等。可以有效防止短时间内大量请求对服务器造成压力,保护服务器资源不被耗尽。
  • ngx_http_limit_conn_module:主要用于限制并发连接数,适用于服务器资源有限,需要控制同时连接到服务器的客户端数量的场景。例如,当服务器的带宽、内存或 CPU 资源有限时,限制连接数可以避免服务器因过载而崩溃。

配置方式

  • ngx_http_limit_req_module:配置相对复杂一些,需要定义限流的规则和桶的容量等参数。例如,可以使用limit_req_zone指令来定义一个限流区域,然后在服务器或位置块中使用limit_req指令来应用限流规则。
  • ngx_http_limit_conn_module:配置相对简单,只需要使用limit_conn_zone指令定义连接数限制的区域,然后在服务器或位置块中使用limit_conn指令来应用限制即可。

对性能的影响

  • ngx_http_limit_req_module:由于需要对每个请求进行速率检查和排队处理,可能会对性能产生一定的影响,尤其是在高并发场景下。但是,通过合理配置桶的容量和请求速率,可以在保证服务器性能的前提下,有效限制请求频率。
  • ngx_http_limit_conn_module:对性能的影响相对较小,主要是在连接建立时进行连接数的检查,一旦连接建立后,对请求的处理性能影响不大。

总的来说,ngx_http_limit_req_modulengx_http_limit_conn_module都有各自的优势和适用场景,在实际应用中,需要根据具体的业务需求、服务器资源状况和性能要求来选择合适的限流模块,并进行合理的配置。