Nginx实例之限速
限速该特性可以限制某个用户在一个给定的时间段内能够产生的http请求数.
nginx可以通过连接频率限制(limit_conn_zone) 和 请求频率限制(limit_req_zone)对客户端访问进行限制.
连接频率限制和请求频率限制都可以实现Nginx的请求限制 , 但是他们的实现原理是不一样的 , 区别就在于连接和请求上 , http协议的连接与请求 , http协议是建立在tcp协议之上的,要完成一次http的请求,先要进行tcp的3次握手建立http的连接 , 然后才进行http的request和response(请求和响应) , 现在http1.1以上的版本已经可以实现一次建立http的连接进行多次的http的request和response(请求和响应) ,最后客户端和服务端不断的来发送FIN包和ACK包来保持HTTP的连接.
连接限制
http {
...
#对单个ip、单个会话同时存在的连接数的限制。这里定义一个存储区conn_zone,conn_zone的容量是1m,该存储区针对于变量$binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn one 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接。
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
server {
location / {
limit_conn conn_zone 1;
limit_rate 300k; # 对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2
}
}
请求限制
http { ... #$binary_remote_addr表示的是客户端的地址,zone=req_zone:1m代表的是开辟了一个名为req_zone的1M的空间, 速率rate=1r/s代表的是每秒1个 , 所以这里定义的配置代表:对于同一ip的请求,
限制平均速率为1个请求/秒。 limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; server { ... location / { root /usr/share/nginx/html; index index.html index.htm; #请求限制 : 对于符合名为req_zone的limit_req_zone 配置(对于同一ip的请求,限制平均速率为1个请求/秒) , 超过部分进行延迟处理,若超过3个请求/秒,丢弃超过部分。 #limit_req zone=req_zone burst=3 nodelay; #请求限制 : 对于符合名为req_zone的limit_req_zone 配置 ,超过部分进行延迟处理,若超过3个请求/秒,所有请求都被过度延迟,直到名为req_zone的limit_req_zone 配置设置的
1M存储区被占满,如果存储区耗尽,则删除最近最少使用的状态。即使在此之后无法创建新状态,请求也会因错误而终止。 #limit_req zone=req_zone burst=3;
#请求限制 : 对于符合名为req_zone的limit_req_zone 配置(对于同一ip的请求,限制平均速率为1个请求/秒) 若超过1个请求/秒,所有请求都被过度延迟,直到名为req_zone的
limit_req_zone 配置设置的1M存储区被占满,如果存储区耗尽,则删除最近最少使用的状态。即使在此之后无法创建新状态,请求也会因错误而终止。 #limit_req zone=req_zone; }