ngx_http_limit_req_module
ngx_http_limit_req_module模塊(0.7.21)可以通過(guò)定義的 鍵值來(lái)限制請(qǐng)求處理的頻率爹殊。特別的酱酬,它可以限制來(lái)自單個(gè)IP地址的請(qǐng)求處理頻率。 限制的方法是通過(guò)一種“漏桶”的方法——固定每秒處理的請(qǐng)求數(shù),推遲過(guò)多的請(qǐng)求處理。
配置示例
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
指令
語(yǔ)法: limit_req zone=name [burst=number] [nodelay];
默認(rèn)值: —
上下文: http, server, location
解釋
設(shè)置對(duì)應(yīng)的共享內(nèi)存限制域和允許被處理的最大請(qǐng)求數(shù)閾值失驶。 如果請(qǐng)求的頻率超過(guò)了限制域配置的值,請(qǐng)求處理會(huì)被延遲枣购,所以 所有的請(qǐng)求都是以定義的頻率被處理的嬉探。 超過(guò)頻率限制的請(qǐng)求會(huì)被延遲,直到被延遲的請(qǐng)求數(shù)超過(guò)了定義的閾值 這時(shí)棉圈,這個(gè)請(qǐng)求會(huì)被終止涩堤,并返回503 (Service Temporarily Unavailable) 錯(cuò)誤。這個(gè)閾值的默認(rèn)值等于0分瘾。 比如這些指令
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5;
}
- 限制平均每秒不超過(guò)一個(gè)請(qǐng)求胎围,同時(shí)允許超過(guò)頻率限制的請(qǐng)求數(shù)不多于5個(gè)。
如果不希望超過(guò)的請(qǐng)求被延遲德召,可以用nodelay參數(shù):
limit_req zone=one burst=5 nodelay;
語(yǔ)法: limit_req_log_level info | notice | warn | error;
默認(rèn)值:
limit_req_log_level error;
上下文: http, server, location
- 設(shè)置你所希望的日志級(jí)別白魂,當(dāng)服務(wù)器因?yàn)轭l率過(guò)高拒絕或者延遲處理請(qǐng)求時(shí)可以記下相應(yīng)級(jí)別的日志。 延遲記錄的日志級(jí)別比拒絕的低一個(gè)級(jí)別上岗;比如福荸, 如果設(shè)置“l(fā)imit_req_log_level notice”, 延遲的日志就是info級(jí)別肴掷。
語(yǔ)法: limit_req_zone $variable zone=name:size rate=rate;
默認(rèn)值: —
上下文: http
- 設(shè)置一塊共享內(nèi)存限制域的參數(shù)敬锐,它可以用來(lái)保存鍵值的狀態(tài)。 它特別保存了當(dāng)前超出請(qǐng)求的數(shù)量呆瞻。 鍵的值就是指定的變量(空值不會(huì)被計(jì)算)台夺。 示例用法:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
- 這里,狀態(tài)被存在名為“one”痴脾,最大10M字節(jié)的共享內(nèi)存里面颤介。對(duì)于這個(gè)限制域來(lái)說(shuō) 平均處理的請(qǐng)求頻率不能超過(guò)每秒一次。
- 鍵值是客戶端的IP地址明郭。 如果不使用binary_remote_addr變量丰泊, 可以將每條狀態(tài)記錄的大小減少到64個(gè)字節(jié)薯定,這樣1M的內(nèi)存可以保存大約1萬(wàn)6千個(gè)64字節(jié)的記錄。 如果限制域的存儲(chǔ)空間耗盡了瞳购,對(duì)于后續(xù)所有請(qǐng)求话侄,服務(wù)器都會(huì)返回 503 (Service Temporarily Unavailable)錯(cuò)誤肉渴。
- 請(qǐng)求頻率可以設(shè)置為每秒幾次(r/s)。如果請(qǐng)求的頻率不到每秒一次财岔, 你可以設(shè)置每分鐘幾次(r/m)呐籽。比如每秒半次就是30r/m。
示例
user root;
worker_processes 4;
#配置Nginx worker進(jìn)程最大打開(kāi)文件數(shù)
worker_rlimit_nofile 65535;
events {
#最大連接數(shù)
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
proxy_buffering on;
proxy_buffer_size 1024k;
proxy_buffers 16 512k;
proxy_busy_buffers_size 1024k;
proxy_temp_file_write_size 1024k;
client_max_body_size 20m;
server_names_hash_bucket_size 128;
#限流主配置 一秒只允許同一個(gè)客戶端訪問(wèn)兩次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server {
listen 80;
server_name abc.hhh.com;
#設(shè)置限流限制訪問(wèn)時(shí),返回的狀態(tài)碼
limit_req_status 429;
location /aaa {
proxy_pass http://adminserver;
#設(shè)置限流
limit_req zone=mylimit burst=5 nodelay;
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
proxy_send_timeout 12s;
proxy_set_header Connection "";
proxy_http_version 1.1;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}