如今的 http 協議支持在一次鏈接上創建屢次請求,因而就有了請求限制和鏈接限制
http1.1 支持順序性 tcp 複用,到了2.0支持多路tcp複用。html
配置語法:node
Syntax: limit_conn_zone key zone=name:size;
Default: -
Context: http
複製代碼
Syntax: limit_conn name number;
Default: -
Context: http,server,location
複製代碼
示例:bash
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;
}
}
}
複製代碼
配置語法:tcp
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
複製代碼
示例:spa
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;
}
}
}
複製代碼