Nginx 限速设置
Nginx服务器有一个非常有用的限速功能, 这个功能用来限制用户在某些时间段内的HTTP请求数,主要是被应用于网络安全及带宽控制方面。比如减慢暴力密码破解的攻击,爬虫对网页的抓取,防止DDOS攻击等。
Nginx 提供三种限速方式:
限制连接数:
语法: limit_conn_zone key zone=name:size;
详细说明:https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone
例如:
http { limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; ... server { ... # 限制每个IP能够最多建立10个连接 limit_conn perip 10; # 限制每个网站最多接受100个连接 limit_conn perserver 100; } }
限制请求速度:
语法:limit_req_zone key zone=name:size rate=rate [sync];
详细说明: https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone
限制请求速度可用于防止DDoS攻击,或防止上游服务器同时被太多请求淹没。
例如:
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=2r/s; limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; ... server { ... # 限制每个IP每秒不超过2个请求,突发不超过5个请求。 limit_req zone=perip burst=5 nodelay; # 限制每个网站每秒不超过10个请求,突发不超过10个请求。 limit_req zone=perserver burst=10; location /search/ { # 限制每个IP每秒不超过1个请求。 limit_req zone=one; } } }
限制带宽:
语法:limit_rate rate;
单位为:byte/s
详细说明: https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate
该设置主要用于限制单个请求的下载速度,以为一个客户端可以建立多个请求,所以一般需要结合限制连接数使用,防止因为个别客户端而耗尽服务器带宽。
http { limit_conn_zone $binary_remote_address zone=perip:10m ... server { ... location /download/ { # 限制每个IP只能建立一个连接 limit_conn perip 1; # 当请求的流量超500KB后进行限速 limit_rate_after 500k; # 限速 50KB/s limit_rate 50k; } } }
完整配置:
http { # 限速IP白名单 geo $limit { default 1; 10.0.0.0/8 0; 192.168.0.0/24 0; 172.20.0.35 0; } # 白名单不限速,非白名单按照客户端IP限速 map $limit $limit_key { 0 ""; 1 $binary_remote_addr; } limit_conn_zone $server_name zone=perserver:10m; limit_req_zone $server_name zone=perserverreq:10m rate=10r/s; limit_conn_zone $limit_key zone=perip:10m; limit_req_zone $limit_key zone=two:10m rate=2r/s; limit_req_zone $limit_key zone=one:10m rate=1r/s; ... server { ... # 限制每个网站每秒不超过10个请求,突发不超过10个请求。 limit_req zone=perserverreq burst=10; # 限制每个网站最多接受100个请求 limit_conn perserver 100; # 限制每个IP能够最多建立10个请求 limit_conn perip 10; # 限制每个IP每秒不超过1个请求,突发不超过3个请求。 limit_req zone=one burst=3 nodelay; location /search/ { # 限制每个IP每秒不超过1个请求。 limit_req zone=one; } location /download/ { # 限制每个IP只能建立一个连接 limit_conn perip 1; # 当请求的流量超500KB后进行限速 limit_rate_after 500k; # 限速 50KB/s limit_rate 50k; } } }
备注:
需要注意的是客户端IP使用 $binary_remote_addr 变量,而不是 $remote_addr。
$remote_addr 是一个文本型变量,长度为7至15个字节之间。
$binary_remote_addr 是二进制的IP表达形式,对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址,变量的大小始终为16个字节。
存储状态在32位平台上总是占用32或64字节,在64位平台上占用64字节。 1M的内存空间可以保留大约32000个32字节状态或16000个64位字节。例子中的10M的话换算下来可以保留16万个IP地址信息。当超出请求是服务器将返回错误。
原文链接地址:http://blog.exsvc.cn/article/nginx-limiting-access.html
转载请注明:转载自 易科博客 ,谢谢!