下面是 nginx 官网上给的解释
limit_req_zone
Limit frequency of connections from a client.
This module allows you to limit the number of requests for a given session, or as a special case, with one address.
limit_req_zone
Limit frequency of connections from a client.
This module allows you to limit the number of requests for a given session, or as a special case, with one address.
Restriction done using leaky bucket.
按照字面的理解,lit_req_zone的功能是通过 令牌桶原理来限制 用户的连接频率,(这个模块允许你去限制单个地址 指定会话或特殊需要 的请求数 )
以下是我的测试:
第一种情况:
1)注意配置的位置,现在http模块中声名,然后在server中引用(当然也可以在location中应用);
2)$binary_remote_addr : 客户端的IP;
100m是保存ip地址的,通常1M可以保存16000个ip信息;
rate=12r/m 表示每分钟可以访问12次,平均5秒钟一次;
3)
public class HttpClientDemo {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 20; i++) {
new Thread(getRunnable(i + ":")).start();
Thread.sleep(500);
}
}
private static Runnable getRunnable(final String threadName) {
return new Runnable() {
@Override
public void run() {
HttpGet httpGet = new HttpGet("http://localhost/index.html");
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse execute = null;
try {
execute = client.execute(httpGet);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int statusCode = execute.getStatusLine().getStatusCode();
System.out.println(threadName + ":" + statusCode);
}
};
}
}
运行的结果:只有一个200.(你可以去掉刚才的配置直接跑,结果会是全部200)
第二种情况:
添加了 burst=5;
直接在运行刚才的代码,看结果:
一个有6个状态是200的,其中5个是在最后的,这五个就是暂存在burst中的.
(时间太长了,超过了gif工具录制时长)
第三种情况:
看结果:
自己跑一下三个情况,你就明白了!