linux's docs

26.11.0: NGINX配置-limit_req访问限制配置


1. 配置字段解释

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

1,$binary_remote_addr,ip地址的二进制变量
2,zone=one,one是自定义的名称
3,zone=one:10m,10m定义的是可储存用户session请求的空间大小
4,rate=1r/s,1r/s代表的是1 request 每second

limit_req zone=zone_name burst=number nodelay;

1,zone,指定使用的zone名称
2,burst,用来缓存一定数量的请求
3,nodelay,用来使超过限定数量的请求即时返回503,不再delay


2. 测试基本配置

# 配置1,最基本配置(no burst & nodelay)
******************************************
http {
    ......
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        ......
        limit_req zone=one;
    }
}
******************************************
# 测试100万次请求,每次并发10
ab -n 1000000 -c 10 172.16.2.243/
......
Time taken for tests:   28.724 seconds
......
# 结果显示用时28.7s

# 查看200请求返回是29次,每秒一次
cat /data/log/weblog/www.limit-test.com.log |grep 200|wc -l
29
cat /data/log/weblog/www.limit-test.com.log |grep 200 |cut -d ' ' -f 4,9
[15/Jan/2016:01:21:45 200
[15/Jan/2016:01:21:46 200
[15/Jan/2016:01:21:47 200
[15/Jan/2016:01:21:48 200
[15/Jan/2016:01:21:49 200
[15/Jan/2016:01:21:50 200
[15/Jan/2016:01:21:51 200
[15/Jan/2016:01:21:52 200
[15/Jan/2016:01:21:53 200
[15/Jan/2016:01:21:54 200
[15/Jan/2016:01:21:55 200
[15/Jan/2016:01:21:56 200
......

## 总结,当仅配置"limit_req zone=one;"时,
当nginx没有请求处理时来到的请求,会按照每一秒处理一个的频率处理
当nginx正在处理请求时来到的请求,会即刻返回503

3. 测试burst

## 配置2
******************************************
http {
    ......
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        ......
        limit_req zone=one burst=5;
    }
}
******************************************
# 进行100次请求,并发4测试(并发数4小于burst=5)
ab -n 100 -c 4 172.16.2.243/
......
Time taken for tests:   99.009 seconds
......
## 用时99s多

# 200状态码返回100次
cat /data/log/weblog/www.limit-test.com.log |grep 200|wc -l
100
# 查看日志内容发现每一次请求都是200,显然burst=5起了作用
# 又测试了一遍,当并发数为5时,跟上述是一样的情况

# 进行1000次请求,并发10测试(burst=5,小于并发数10)
ab -n 1000 -c 10 172.16.2.243/
......
Time taken for tests:   5.004 seconds
......
## 用时5s多

# 查看日志
cat /data/log/weblog/www.limit-test.com.log |cut -d ' ' -f 1,4,9
172.16.2.243 [16/Jan/2016:00:21:24 200
......
172.16.2.243 [16/Jan/2016:00:21:24 503
172.16.2.243 [16/Jan/2016:00:21:24 503
172.16.2.243 [16/Jan/2016:00:21:24 503
172.16.2.243 [16/Jan/2016:00:21:24 503
172.16.2.243 [16/Jan/2016:00:21:25 200
172.16.2.243 [16/Jan/2016:00:21:26 200
172.16.2.243 [16/Jan/2016:00:21:27 200
172.16.2.243 [16/Jan/2016:00:21:28 200
172.16.2.243 [16/Jan/2016:00:21:29 200
## 可看到日志中的几个规律
1,第一个请求返回200
2,跟第一个请求同一秒的请求全部返回503
3,第一个请求之后的4s内每秒返回一个200
## 说明了burst确实缓存了5个请求,分别在后续的每秒处理一个

## 总结
1、burst并不能提高rate设定的每秒处理1次的这个值
2、burst会缓存小于等于本身值的请求

4. 测试nodelay

## 配置2
******************************************
http {
    ......
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        ......
        limit_req zone=one burst=5 nodelay;
    }
}
******************************************
# 进行1000次请求,并发10测试
ab -n 1000 -c 10 172.16.2.243/
......
Time taken for tests:   5.005 seconds
......

# 查看日志
cat /data/log/weblog/www.limit-test.com.log |cut -d ' ' -f 1,4,9
172.16.2.243 [16/Jan/2016:00:42:30 200
......
172.16.2.243 [16/Jan/2016:00:42:30 503
172.16.2.243 [16/Jan/2016:00:42:30 503
172.16.2.243 [16/Jan/2016:00:42:30 503
172.16.2.243 [16/Jan/2016:00:42:30 503
172.16.2.243 [16/Jan/2016:00:42:30 503
172.16.2.243 [16/Jan/2016:00:42:31 200
172.16.2.243 [16/Jan/2016:00:42:32 200
172.16.2.243 [16/Jan/2016:00:42:33 200
172.16.2.243 [16/Jan/2016:00:42:34 200
172.16.2.243 [16/Jan/2016:00:42:35 200
## 发现跟上面没加nodelay一样

# 尝试逐渐增大测试数量,发现了些许不同
1、随着测试数量的增大,发现有nodelay与否影响完成测试的时间,加上nodelay后,处理的时间要明显短于不加,说明nodelay确实有作用,但是查了很多资料,也没有弄明白具体原理,贴上官方解释,以后继续研究
2、If delaying of excessive requests while requests are being limited is not desired, the parameter nodelay should be used

Contents