nginx限速
nginx 要实现限速,完整的实现是要限制客户端请求频率,并发连接和传输速度
1.请求限制
Nginx 请求限制的功能来自于 ngx_http_limit_req_module 模块。使用它需要首先在 http
配置段中定义限制的参照标准和状态缓存区大小。比如下面的配置就是定义了使用客户端的 IP 作为参照依据,并使用一个 10M 大小的状态缓存区。结尾的 rate=1r/s
表示针对每个 IP 的请求每秒只接受一次。
limit_req_zone $binary_remote_addr zone=NAME:10m rate=1r/s;
NAME 是自定义的缓存区名称,可以随意命名,比如 per_ip
或 one
等。在 server
配置段中会用到。10M 的状态缓存空间够不够用呢?官方给出的答案是 1M 的缓存空间可以在 32 位的系统中服务 3.2 万 IP 地址,在 64 位的系统中可以服务 1.6 万 IP 地址,所以需要自己看情况调整。如果状态缓存耗光,后面所有的请求都会收到 503(Service Temporarily Unavailable) 错误。
然后就可以在 server
段中配置具体的连接限制了。比如下面的配置:
server { location / { limit_req zone=NAME burst=5; } }
后面的 burst=5
是一个宽容度配置。表示如果单个 IP 有每秒有超过 1 个请求限制的时候,最多接受多少个超出的配额。超出的请求会被加入到队列延迟处理。如果不想延迟,可以使用 nodelay
参数。示例如下:
server { location / { limit_req zone=NAME burst=5 nodelay; } }
2.并发限制
Nginx 并发限制的功能来自于 ngx_http_limit_conn_module 模块。跟请求配置一样,使用它之前,需要先定义参照标准和状态缓存区。
limit_conn_zone $binary_remote_addr zone=NAME:10m;
然后同样在 server
段中配置具体的限速数据。比如针对下载目录,每个 IP 只允许一个连接:
server { location /download/ { limit_conn NAME 1; } }
速度限制:
Nginx 除了限制请求和并发外,还可以使用 limit_rate
来限制传输速度。例如:
server { location / { limit_rate 100k; } }
上面的配置意思表示每个连接的传输速度不能超过 100k。
参考文档:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate