15 Dec 2015
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
# 配置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
## 配置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会缓存小于等于本身值的请求
## 配置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