nginx限流模块(防范DDOS攻击)

Nginx限流模式(防范DDOS攻击)

nginx中俩个限流模块:

  1、ngx_http_limit_req_module(按请求速率限流)

  2、ngx_http_limit_conn_module(按连接数限流)

放到nginx配置文件中:(这是完整配置哦~)

http {
  limit_conn_status 503;
  limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/s;
  limit_conn_zone $binary_remote_addr zone=mylimit:10m;
  limit_conn_zone $server_name zone=perserver:10m;
	
  server {
	location \ {
	limit_req zone=addr burst=5 nodelay;
	limit_conn mylimit 10;
	limit_conn perserver 1000;
	}
  }
}

实现的限流效果:限制单个ip每秒发送2次请求,服务器允许的最大并发连接数为1000(每秒允许500个ip的2次请求)

1、ngx_http_limit_req_module 模块

ngx_http_limit_req_module 速率限制,采用的漏桶算法(暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水)

http {
  limit_conn_status 503;
  limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/s;
  server { 
	location / { 
	limit_req zone=addr burst=5 nodelay;
     }
  }
}
限流效果:1秒可以接收单个ip的2次请求(接收2个,burst缓存5个;如果缓存区满了,接收2个,其余的丢弃)

上述规则限制了每个IP访问的速度为2r/s,并将该规则作用于根目录。单个ip每秒可以访问2次

测试命令:ab -n 10 http://127.0.0.1:80/index.html
      -n:总请求数
      -c:并发数

第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址
第二个参数:zone=addr:10m表示生成一个大小为10M,名字为addr的内存区域,用来存储访问的频次信息
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的
第四个参数:zone=addr 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
第五个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内
第六个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队

示例2  自定义返回值

http {
  limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
  server { 
	location / { 
	  limit_req zone=mylimit burst=4 nodelay;
	  limit_req_status 598;
	}
  }
}

2、ngx_http_limit_conn_module 模块

 

这个模块用来限制同一时间连接数,即并发限制。并非所有的连接都被计数。只有在服务器处理了请求并且已经读取了整个请求头时,连接才被计数。

  理解: 连接频率限制和请求频率限制都可以实现Nginx的请求限制 , 但是他们的实现原理是不一样的 , 区别就在于连接和请求上 , http协议的链接与请求 , http协议是建立在tcp协议之上的,要完成一次http的请求,先要进行tcp的3次握手建立http的连接 , 然后才进行http的request和response(请求和响应) , 现在http1.1以上的版本已经可以实现一次建立http的连接进行多次的http的request和response(请求和响应) ,最后客户端和服务端不断的来发送FIN包和ACK包来保持HTTP的连接 。

http {
  limit_conn_status 503;
  limit_conn_zone $binary_remote_addr zone=mylimit:10m;
  limit_conn_zone $server_name zone=perserver:10m;
  server {
    location / {   limit_conn mylimit 10; #表示单个ip同时最多能持有10个连接   limit_conn perserver 1000;   #表示nginx服务可以同时处理的并发连接数为1000,超过请求的会被拒绝
    }   } }
限流效果:单个ip的最大并发量为10,最大的并发连接数为1000

第一个参数:limit_conn_status 自定义返回值
第二个参数:zone=mylimit:10m 表示生成一个大小为10M,名字为mylimit的内存区域,用来存储访问的频次信息


小测试:一次只允许每个IP地址一个连接

http {	
  limit_conn_zone $binary_remote_addr zone=mylimit:10m;
  server {
	location /download/ {
	  limit_conn mylimit 1;
	}
  }
}

  

东西没有高下之分,全在人心一念。

 

posted @ 2021-04-06 16:07  等风来~~  阅读(487)  评论(0编辑  收藏  举报