Nginx请求限制

基本原理

nginx的请求限制本质上是基于交换机上大量使用的QoS流量令牌桶技术做的流量整形。

令牌桶是衡量流量是否超过额定请求的。令牌桶中的每一个令牌都代表一个请求。如果令牌桶中存在令牌,则允许发送请求;而如果令牌桶中不存在令牌,则不允许发送请求。

令牌桶中的令牌不仅仅可以被移除,同样也可以往里添加,所以为了保证接口随时有数据通过,就必须不停地往桶里加令牌,由此可见,往桶里加令牌的速度,就决定了数据通过接口的速度。因此,我们通过控制往令牌桶里加令牌的速度从而控制用户流量的请求数。

设置的这个用户传输数据的速率被称为承诺信息速率(CIR),通常以秒为单位。

每秒钟需要往桶里加的令牌总数,能存在桶中,桶能保存的令牌数量被称为Burst size(峰值)

常规配置

在nginx.conf文件中的http模块下配置

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

说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。

\(binary_remote_addr\)remote_addr(客户端IP)的二进制格式,固定占用4个字节。而\(remote_addr按照字符串存储,占用7-15个字节。用\)binary_remote_addr可以节省空间。

第二,在http模块的子模块server下面配置

location ~* .htm$ {
limit_req zone=one burst=5 ;
proxy_pass http://backend_tomcat;
}

这里是对uri后缀为htm的请求限流,其中zone=one和前面的定义对应。

例子:

limit_req zone=one burst=5 ;(漏桶)
burst=5表示桶的深度,此时可以有5个请求在桶中等待。超过桶的深度的返回503.

limit_req zone=one burst=5 nodelay;     (令牌桶)
表示超出的请求不延迟等待,直接响应。

limit_req zone=one burst=5  delay=3;  (混合桶)
最新版本的nginx 1.15 可以使用delay=3这样的语句,表示桶的深度是5,有三个延迟,2(+1)个马上处理。

在f5后端的配置

有两种方法:

用x-forward-for代替$remote_addr

## 这里取得原始用户的IP地址
map $http_x_forwarded_for  $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=one:10m  rate=1r/s;

key换成$server_name

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

总结