现在的 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; } }}复制代码