一、简介
对付网站来说,尤其是流量较大出名的网站,常常碰着攻击,如DDoS攻击等,虽然有些第三方,如Cloudflare可以挡,但对付动态网站php来说,只能挡一部分。这时候须要对付单个IP恶意攻击做出限流。Nginx的两个模块可以限流。
nginx两个限流模块:
连接频率限定,ngx_http_limit_conn_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

要求频率限定,ngx_http_limit_req_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
二、两者模块差异首先理解要乞降连接,HTTP要求建立在一次TCP连接根本上, 一次TCP连接至少产生一次HTTP要求(1次或多次)
网上理论很多,根据名字可知:
· connection是连接,即常说的tcp连接,通过三次握手而建立的一个完全状态机。建立一个连接,必须要三次握手。
· request是指要求,即http要求,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议。
当然还是看不懂的话,普通点讲(相对付韶光比较):
· limit_req_zone,在 有限的韶光 内限定,单个IP每秒或者每分钟只能发出多少要求。多的一概不理会。
· limit_conn_zone, 不限韶光 ,只许可单个IP这么多个连接,或者称为并发。如:设置10个连接,第11个连接时,必须等前面有一个已经完成或者开释后,这个连接才能许可。
比如秒杀,抢购,连接频率限定和要求频率限定该当合营利用 , 利用连接频率限定同一IP同时只能有3个连接, 再利用要求频率限定对付同一ip的要求,限定均匀速率为5个要求/秒 , 这样比单独只利用一种限定要好很多。
比如只利用要求频率限定 , 可以精确地限定同一ip1秒只能发起5次的http要求 , 如果同一ip1秒内发起了100000次要求 , 虽然限定了只有5次成功相应 , 但是其他的99995次的要求TCP握手建立http连接是不是会花费做事器资源? 以是还须要合营利用。
三、配置1、limit_req_zone,示例:
http{
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限定均匀每秒的要求为20个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限定两秒钟一个要求,可以设置成30r/m
server{
location / {
#限定每ip每秒不超过20个要求,漏桶数burst为5
#brust的意思便是,如果第1秒、2,3,4秒要求为19个,
#第5秒的要求为25个是被许可的。
#但是如果你第1秒就25个要求,第2秒超过20的要求返回503缺点。
#nodelay,如果不设置该选项,严格利用均匀速率限定要求数,
#第1秒25个要求时,5个要求放到第2秒实行,
#设置nodelay,25个要求将在第1秒实行。
limit_req zone=allips burst=5 nodelay;
}
}
}
2、limit_conn_zone,示例:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
#定义一个名为addr的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key
#nginx 1.18往后用limit_conn_zone更换了limit_conn,
#且只能放在http{}代码段.
server {
location / {
limit_conn addr 10; #连接数限定,并发数
#设置给定键值的共享内存区域和许可的最大连接数。超出此限定时,做事器将返回503(做事临时不可用)缺点.
#如果区域存储空间不敷,做事器将返回503(做事临时不可用)缺点
}
}
}
3、搭配一起利用
http {
...
...
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=20r/s;
#限定连接要求设置,访问内存10M,所有访问ip 限定每秒10个要求
limit_conn_zone $binary_remote_addr zone=addr:10m;
#限定连接IP设置
...
...
server {
listen 80;
server_name ywbj.cc;
location / {
...
limit_req zone=req_zone burst=5 nodelay;
limit_conn addr 5;
...
}
}
}