preaccess阶段主要进行限速
1.limit_conn模块(默认不编译进nginx)
该模块是对连接客户端的限制。即对同一个ip的连接限制
文档:limit_conn模块
nginx配置
在http块中定义
#定义共享内存大小
limit_conn_zone $binary_remote_addr zone=addr:10m;
在server或location中定义
location / {
limit_conn addr 10;
#单个最大连接数
limit_rate 50;
#限速
limit_conn_log_level warn;
#记录日志
limit_conn_status 500;
#超出响应500状态码
}
进行ab多次压测
ab -n 15 -c 15 域名
结果显示
Concurrency Level: 5
Time taken for tests: 20.021 seconds
Complete requests: 5
Failed requests: 0
Write errors: 0
Total transferred: 4225 bytes
HTML transferred: 3060 bytes
ab -n 200 -c 200 域名
Concurrency Level: 200
Time taken for tests: 20.020 seconds
Complete requests: 200
Failed requests: 10
(Connect: 0, Receive: 0, Length: 10, Exceptions: 0)
Write errors: 0
Non-2xx responses: 190
貌似连接数小的时候就不起作用了
若去掉限速后,甚至完全不起作用???
Concurrency Level: 200
Time taken for tests: 1.264 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 169000 bytes
HTML transferred: 122400 bytes
Requests per second: 158.26 [#/sec] (mean)
Time per request: 1263.722 [ms] (mean)
总结:限制客户端每秒连接数不好用
2.limit_req模块(默认编译进nginx)
文章参考:https://blog.csdn.net/hellow__world/article/details/78658041
官方文档
nginx配置
http块下
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;
#每分种只处理同一个ip的2个请求(平均),若超过则响应503状态码
location / {
limit_req zone=one;
#limit_req zone=one burst=3 nodelay;
}
参数介绍:
1.zone=one :设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
2.burst=5:重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求**可以先放到这个缓冲区内等待**,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
3.nodelay:
如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,**永远不存在请求需要等待的情况**。(这里的rate的单位是:r/s)
如果没有设置,则所有请求会依次等待排队(也就意味着不设置后面的请求可能会出现超时)
进行ab压测
Concurrency Level: 10
Time taken for tests: 0.002 seconds
Complete requests: 10
Failed requests: 9
(Connect: 0, Receive: 0, Length: 9, Exceptions: 0)
Write errors: 0
Non-2xx responses: 9
Total transferred: 7037 bytes
HTML transferred: 5058 bytes
Requests per second: 5959.48 [#/sec] (mean)
Time per request: 1.678 [ms] (mean)
Time per request: 0.168 [ms] (mean, across all concurrent requests)
Transfer rate: 4095.39 [Kbytes/sec] received
生效,还不错
修改配置
location / {
#limit_req zone=one;
limit_req zone=one burst=3 nodelay;
}
Concurrency Level: 10
Time taken for tests: 0.002 seconds
Complete requests: 10
Failed requests: 6
(Connect: 0, Receive: 0, Length: 6, Exceptions: 0)
Write errors: 0
Non-2xx responses: 6
虽然请求被延迟,但也有效果
注意点
limit_req模块的执行在limit_conn模块之前,所以当超出限制的连接数到来后,后面响应的是limit_req的503响应码
3.其他
文档http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except
limit_rate 限速多少b
limit_rate_after 设置多少bytes过后将启动limit计数,如果小于此值则不限速
limit_except 方法 限制除了该方法外的方法
location / {
limit_except GET {
#除了GET以外方法都收到下面条款限制(但是GET已经包含HEAD)
deny all;
}
}
网友评论