限速介绍
1、限速该特性可以限制某个用户在一个给定时间段内能够产生的http请求数。请求可以简单到就是一个对于主页的GET请求或者一个登录表格的请求。
例如12306春节抢票,限制特定ip的刷票,就非常有必要。防止服务器被海量刷新请求瘫痪
2、限速也可以用于安全目的,比如暴力密码破解攻击。通过限制进来的请求速率,并且(结合日志)标记出目标URLs来帮助DDoS攻击。一般的说,限流是用在保护上游服务器不被在同一时刻的大量用户淹没
应用场景
1、防止DDoS 防御
2、下载场景保护IO
大量的下载,也会增大服务器磁盘的读写,限速也可以保护磁盘,减小磁盘的压力
限速原理
image.png 算法思想是:
⽔(请求)从上⽅倒⼊⽔桶,从⽔桶下⽅流出(被处理);
来不及流出的⽔存在⽔桶中(缓冲),以固定速率流出;
⽔桶满后⽔溢出(丢弃)。
这个算法的核⼼是:缓存请求、匀速处理、多余的请求直接丢弃。
实现方式
Nginx 官方版本限制Ip的连接和并发分别有两个模块:
1、limit_req_zone 用来限制单位时间内的请求数,即速率限制。
limit_req_zone 参数配置
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location
限速案例1
基于IP对下载速率做限制 限制每秒处理1次请求,对突发超过5个以后的请求放⼊缓存区
http {
limit_req_zone $binary_remote_addr zone=baism :10m rate=1r/s;
server {
location /test/ {
limit_req zone=baism burst=5 nodelay;
}
}
}
limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s;
第⼀个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的⽬的是缩写内存占⽤量,是限制同⼀客户端ip地址。主要是针对用户原IP进行限制
第⼆个参数:zone=baism:10m表示⽣成⼀个⼤⼩为10M,名字为baism 的内存区域,⽤来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这⾥限制的是每秒1次,还可以有⽐如30r/m的。
limit_req zone=baism burst=5 nodelay;
第⼀个参数:zone=baism 设置使⽤哪个配置区域来做限制,与上⾯limit_req_zone ⾥的name对应。
第⼆个参数:burst=5,重点说明⼀下这个配置,burst爆发的意思,这个配置的意思是设置⼀个⼤⼩为5的缓冲区当有⼤量请求(爆发)过来时,超过了访问频次限制的请
求可以先放到这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次⽽且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队
2、limit_req_conn 用来限制同一时间连接数,即并发数。
基于IP做连接限制 限制同⼀IP并发为1 下载速度为100K
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /test {
limit_conn addr 1;
limit_rate 100k;
}
}
综合案例
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#基于IP做连接限制 限制同⼀IP并发为1 下载速度为100K
limit_conn_zone $binary_remote_addr zone=addr:10m;
#基于IP对下载速率做限制 限制每秒处理1次请求,对突发超过5个以后的请求放⼊缓存区
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /abc {
limit_req zone=one burst=5 nodelay;
limit_conn addr 1;
limit_rate 100k;
}
}
网友评论