Nginx 限制访问 - 对代理 HTTP 资源限制访问

原文地址

本节描述了如何设置连接的最大请求数,或从服务器下载内容的最大速率。

所有的限制,都需要指定关键字(比如 IP 地址),用这个关键字作为计数的标准。

1. 概述

使用 Nginx 或 Nginx Plus 时,可以限制:

  • 每个键值的连接数量(例如,每个 IP 地址)。
  • 每个键值的请求速率(每秒或每分钟允许处理的请求个数)。
  • 一个连接的下载速度。

注意,IP 地址可以通过 NAT 设备共享(一个局域网中可以有多台设备,但可能只有一个公网 IP),应该谨慎使用对 IP 地址的限制。

2. 限制连接数

要限制连接数,首先,使用 limit_conn_zone 指令来定义关键字,并设置共享内存区域的参数(工作进程会使用这个区域来共享键值的计数器)。作为第一个参数,指定解析为关键字的表达式。在第二个参数区域中,指定区域的名称及大小。

limit_conn_zone $binary_remote_addr zone=addr:10m;

第二,使用 limit_conn 指令来对 location、server 或整个 http 上下文使用限制。将共享内存区域的名字作为第一个参数,每个关键字允许的连接数作为第二个参数:

location /download/ {
    limit_conn addr 1;
}

这个例子中,连接数量限制在一个 IP 地址的基础上,因为关键字是 $binary_remote_addr 变量。指定服务器的连接数量可以通过使用 $server_name 变量来限制:

http {
    limit_conn_zone $server_name zone=servers:10m;

    server {
        limit_conn servers 1000;
    }
}

3. 限制请求速率

要限制请求速率,首先,通过使用 limit_req_zone 指令设置关键字和放计数器的共享内存区域。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

这里的关键字和 limit_conn_zone 指令的关键字一样。速率参数可以设置为每秒请求数(r/s)或每分钟请求数(r/m)。30 r/m 表示每分钟可以处理 30 个请求。

一旦定义好了共享内存区域,使用 server 或 location 中的 limit_req 指令来限制请求速率:

location /search/ {
    limit_req zone=one burst=5;
}

上面例子中,Nginx 在这个 location 中每秒钟处理的请求数不多于 1。如果请求速率高于每秒一个,则处理不过来的请求会放入队列中延迟处理,使整体速率不会超过指定值。burst 参数设置等待处理的最大请求个数。对于超过这个限制数量的请求,Nginx 会返回 503 错误。

如果在并发期间不希望有延迟,请添加 nodelay 参数:

limit_req zone=one burst=5 nodelay;

4. 限制带宽(Bandwidth)

使用 limit_rate 指令可以限制每个连接的带宽:

location /download/ {
    limit_rate 50k;
}

上面的这个设置会将客户端的一个独立连接的下载速率限制在 50 KB 每秒。然而客户端可以同时打开多个连接。因此,如果目标是阻止下载速度大于指定值,则连接数量也应该受到限制。 例如,每个IP地址一个连接(使用上面指定的共享内存区域):

location /download/ {
    limit_conn addr 1;
    limit_rate 50k;
}

使用 limit_rate_after 指令,可以只在客户端下载了一定数量的数据之后才限制速率。允许客户快速下载一定数量的数据(例如文件头 - 电影索引)并限制下载其余数据的速率(以使用户观看电影而不是下载)是合理的。

limit_rate_after 500k;
limit_rate 20k;

下面的例子是限制连接速率和带宽的综合示例。每个客户端 IP 地址的最大连接数量是 5,满足大多数情况(现代浏览器通常最多一次打开 3 个连接)。与此同时,/download/ 对应的 location 只允许 1 个连接:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m

    server {
        root /www/data;
        limit_conn addr 5;

        location / {
        }

        location /download/ {
            limit_conn addr 1;
            limit_rate 1m;
            limit_rate 50k;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值