现在的 http 协议支持在一次连接上建立多次请求,于是就有了请求限制和连接限制
http1.1 支持顺序性 tcp 复用,到了2.0支持多路tcp复用。
limit_conn_module,连接频率限制
配置语法:
Syntax: limit_conn_zone key zone=name:size;
Default: -
Context: http
复制代码
Syntax: limit_conn name number;
Default: -
Context: http,server,location
复制代码
示例:
http {
...
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
// conn_zone 是自定义的变量
// $binary_remtoe_addr 表示客户端地址,放在这里表示通过客户端地址限制请求次数。$binary_remote_addr 比 $remote_addr 节省空间。
server {
...
limit_conn conn_zone 1;
// 限制同一个 IP 同时只能有一个连接。
// 同时只能有一个连接的意思不是同时只能有一个请求,一个连接可以有多个请求
location / {
root html;
index index.html index.htm;
}
}
}
复制代码
limit_req_module,请求频率限制
配置语法:
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: -
Context:http
复制代码
Syntax: limit_req zone=name [burst=number][nodelay];
Default: -
Context: http,server,location
复制代码
示例:
http {
...
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
// 表示对同一个 IP 限制每秒请求一次。
// $binary_remtoe_addr 表示客户端地址,放在这里表示通过客户端地址限制请求次数。$binary_remote_addr 比 $remote_addr 节省空间。
// 1m 表示 zone 的大小
// zone=req_zone 表示 zone 的名字
// rate=1r/s 表示每秒一次请求
server {
...
limit_req zone=req_zone;
// 在这个 server 下的所有 location 使用 req_one 的限制,每秒只能请求一次。
limit_req zone=req_zone burst=3 nodelay;
// burst=3 表示达到限制之后有3个会到下一秒执行,对客户端访问限速
// nodelay 是不等待直接返回 503 等
location / {
root html;
index index.html index.htm;
}
}
}
复制代码