Nginx 限速
限制并发连接数量
ngx_http_limit_conn_module,可以根据设定的条件来限定客户端(单一ip)的并发访问,但是并不是所有的访问都会被计数,
只有那些正在被处理的的请求(这些请求的头信息已被完全读入),所在的访问才会被计数。
例子:
...
http {
...
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name localhost;
location / {
limit_conn addr 1;
proxy_pass http://127.0.0.1:8001/cur_time;
root html;
index index.html index.htm;
}
}
}
1) limit_conn_zone $binary_remote_addr zone=addr:10m;
第一个参数 $binary_remote_addr:表示以客户端 ip 作为键值来进行限制
第二个参数 zone=addr:10m:表示生成一个大小为10M,名字为 addr 的存储区域,用来存储访问次数
2) limit_conn addr 1;
表示在 addr 存储区内,限制客户端 ip 只能访问一次,若超过访问限制,则返回503错误。
注意,在使用 ab 对该模块进行测试时发现,若服务器立即返回,如简单的 html 页面,则 ngx_http_limit_conn_module 模块没有达到预想效果,若是一个需要经过后端处理的才返回的页面则生效,在上面的例子中,我写了一个延迟 5s 再从后端返回当前服务器时间的页面 http://127.0.0.1:8001/cur_time,则可以测出效果
官网参考文档:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
限制请求速度
ngx_http_limit_req_module,可以根据设定的条件来限定客户端(单一ip)的访问频率。
例子:
...
http {
...
limit_req_zone $binary_remote_addr zone=two:10m rate=5r/s;
server {
listen 80;
server_name localhost;
location / {
limit_req zone=two burst=3 nodelay;
proxy_pass http://127.0.0.1:8001/cur_time;
root html;
index index.html index.htm;
}
}
}
1) limit_req_zone $binary_remote_addr zone=two:10m rate=5r/s;
第一个参数 $binary_remote_addr:表示以客户端 ip 作为键值来进行限制, 访问的IP被转为2进制存放,10兆的内存可以存放16,0000个IP地址。
第二个参数 zone=two:10m :表示生成一个大小为10M,名字为two的存储区域,用来存储访问频率
第三个参数 rate=5r/s:表示限定客户端的访问频率为每秒5次
2) limit_req zone=two burst=3 nodelay;
第一个参数 zone=two:表示使用存储区域 two 来限制
第二个参数 burst=5:表示设定一个缓存区域,当有大量请求时,超过了访问频次限制的请求会放在这个缓冲区域内
第三个参数 nodelay:表示当超过访问次数并缓冲也满的情况下,直接放回503错误,若不设置,这些多余的请求会延迟处理
设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,
你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。
如果这些IP访问超过了 rate 限制并且溢出了 burst 所限大小的队列,就会触发 503 错误。
注意:nginx 的限流统计是基于毫秒的,设置的速度是 5r/s,转换一下就是 200ms内单个IP只允许通过一个请求,从201ms开始才允许通过第二个请求。
官网参考文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html