有时候我们会通过在一定时间内ip访问次数来判断用户是否恶性访问,来达到防刷的目的,下面借用nginx模块来限制。
nginx模块限制ip
#nginx.conf
http{
...
limit_req_zone $binary_remote_addr zone=limits:10m rate=50r/s;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
limit_req zone=limits burst=50;
limit_conn conn_zone 1;
limit_rate 50k;
}
...
}
limit_req_zone : 限制单位时间内的请求数
limit_req_conn : 限制同一时间内的连接(并发)数
超出限制会直接返货503错误。
limit_req_zone模块
limit_req_zone $binary_remote_addr zone=five:10m rate=50r/s;
$binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
zone=limits:10m:表示生成一个大小为10M,名字为limits的内存区域,用来存储访问的频次信息。
rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
limit_req zone=limits burst=50;
zone=limits:使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
burst=50:burst这个配置的意思是设置一个大小为50的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
limit_conn_zone模块
顾名思义,这里是限制读取到请求头后的连接ip。
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
zone=addr:10m; 表示生成一个大小为10M,名字为conn_zone的内存区域,用来存储访问的频次信息
limit_conn conn_zone 1;
limit_conn conn_zone 1;表示限制每个IP只能发起一个并发连接。
limit_rate 50k;
limit_rate 50k; 表示对每个连接限速50k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。