1、基础
1.1、为什么要限速?
限制某个用户在一定时间内能够产生的Http请求。或者说限制某个用户的下载速度。
1.2、限速应用场景以及模块
1、下载限速:限制用户下载资源的速度,
使用Nginx模块:ngx_http_core_module。
2、请求限制︰限制用户单位时间内所产生的Http请求数,
使用Nginx模块:ngx_http_limit_req_module。
3、连接限制:限制同一时间的连接数,及并发数限制。
使用Nginx模块:ngx_http_limit_conn_module
2、实战
2.1、限制下载速度
2.1.1、配置nginx
cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
server{
listen 80;
server_name mirror.cyc.com;
charset utf-8;
root /mnt/;
limit_rate_after 1m; # 当到达1m的时间,开始限速,速度为:100k/s
limit_rate 100k;
location /cdrom {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location / {
index index.html;
}
}
EOF
2.1.2、重新加载nginx
2.1.3、测试效果

2.2、限制单位时间内所产生的Http请求数
2.2.1、需求
基于来源IР对下载速率限制,限制每秒处理1次请求,但可以突发超过3个请求放入缓存区
2.2.2、配置nginx
cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server{
listen 80;
server_name mirror.cyc.com;
charset utf-8;
root /mnt/;
location /cdrom {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
limit_req zone=req_one burst=3 nodelay;
}
location / {
index index.html;
}
}
EOF
2.2.3、配置解析
# http
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#第一个参数: $binary_remote_addr 表示通过这个标识来做限制,限制同一客户端ip地址。
#第二个参数: zone=req_one:10m 表示生成一个大小为10M,名为req_one的内存区域,用来存储访问的频次信息。
#第三个参数: rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒1次。
# server
limit_req zone=req_one burst=3;
#第一个参数: zone=req_one设置使用哪个配置区域来做限制,与上面Limit_req_zone 里的name对应。
#第二个参数: burst=3,设置一个大小为3的缓冲区,当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
#第三个参数: nodelay,超过访问频次并且缓冲区也满了的时候,则会返回503,如果没有设置,则所有请求会等待排队。
2.2.4、访问测试

2.3、限制客户端同一时刻的并发连接数
2.3.1、需求
设置共享内存区域和给定键值的最大允许个连接数。超过此限制时,服务器将返回503错误以回复请求
2.3.2、配置nginx
]# cat /etc/nginx/conf.d/mirror.cyc.com.conf
limit_conn_zone $binary_remote_addr zone=addr_conn:10m;
server{
listen 80;
server_name mirror.cyc.com;
charset utf-8;
root /mnt/;
location /cdrom {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
limit_conn addr_conn 2;
}
location / {
index index.html;
}
}
2.3.3、重新加载nginx
2.4、综合案例
2.4.1、需求
限制web服务器请求数处理为1秒一次,触发值为5、限制用户仅可同时下载一个文件。当下载超过10OM则限制下载速度为500k。如果同时下载超过2个视频,则返回提示"请联系管理员进行会员充值"。
2.4.2、配置nginx
cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr_conn:10m;
server{
listen 80;
server_name mirror.cyc.com;
charset utf-8;
root /mnt/;
limit_req zone=req_one burst=5 nodelay;
limit_conn addr_conn 1;
limit_rate_after 100m;
limit_rate 500k;
location /cdrom {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
error_page 503 @errpage;
location @errpage {
default_type text/html;
return 200 '提示:请联系管理员进行会员充值';
}
location / {
index index.html;
}
}
EOF
2.4.3、重新加载nginx
2.4.4、测试访问
