Nginx-限流限速
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
systemctl reload 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、访问测试
刷新太快,则返回503
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
systemctl reload 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
systemctl reload nginx
2.4.4、测试访问
访问过频率的时候,503页面