1 限流
主要是當(dāng)訪問量達(dá)到一個(gè)限制量的時(shí)候可以選擇以服務(wù)器為主要音比,而選擇對(duì)用戶訪問請(qǐng)求的量做限制妖滔,對(duì)于超出限制的用戶請(qǐng)求會(huì)采取丟棄或者延遲處理等 方式處理隧哮,來保證更多用戶來訪問處理。
比如:某一服務(wù)器正常在高峰期上能支持的訪問量是1w座舍,但是突然某一時(shí)刻在訪問量上突然暴增一下子超過3w,5w則可能會(huì)導(dǎo)致服務(wù)器宕機(jī)沮翔,這個(gè)時(shí)候我們 就可以通過設(shè)置最大的訪問如1分鐘訪問8000次。
也可以防止攻擊(對(duì)同一個(gè)ip每秒訪問多少次)如:30min/次曲秉。
對(duì)應(yīng)模塊
ngx_http_limit_conn_module 限制連接數(shù)
ngx_http_limit_reg_module 限制請(qǐng)求頻率
1.1 ngx_http_limit_reg_module限制請(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];
語(yǔ)法: limit_req_zone $variable zone=name:size rate=rate;
$variable:變量
zone:代表當(dāng)前限制的名稱與存放大小
name:名稱
size:存放客戶端信息的大小
rate:表示速率
例子1: limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
zone=one 表示設(shè)置了名為“one”采蚀,大小為10兆字節(jié),也可以理解為設(shè)置的限流名為one rate=10r/s 的意思是允許1秒鐘不超過10個(gè)請(qǐng)求承二。
使用$binary_remote_addr【這是一個(gè)二進(jìn)制的信息記錄 $remote_addr(非二進(jìn)制的)】(nginx本身存在的榆鼠,保存客戶端的ip地址)變量,可以將每條狀態(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ò)誤。
速度可以設(shè)置為每秒處理請(qǐng)求數(shù)和每分鐘處理請(qǐng)求數(shù)袁滥,其值必須是整數(shù)盖桥,所以如果你需要指定每秒處理少于1個(gè)的請(qǐng)求,2秒處理一個(gè)請(qǐng)求题翻,可以使用 “30r/m”揩徊。
1.2 ngx_http_limit_conn_module限制請(qǐng)求連接數(shù)
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
}
語(yǔ)法:limit_conn_zone $binary_remote_addr zone=addr:10m;
說明:區(qū)域名稱為addr,大小為10m嵌赠,鍵值是客戶端IP塑荒。 如果限制域的存儲(chǔ)空間耗盡了,對(duì)于后續(xù)所有請(qǐng)求姜挺,服務(wù)器都會(huì)返回 503 (Service Temporarily Unavailable)錯(cuò)誤齿税。
下載限速操作實(shí)例:
http {
# ....
limit_conn_zone $binary_remote_addr zone=addr:10m;
# ....
server {
location / {
# root html;
autoindex on;
# 是限制每個(gè)IP只能發(fā)起1個(gè)連接 (addr 要跟 limit_conn_zone 的變量對(duì)應(yīng))
limit_conn addr 1;
limit_rate 10k; #限速為 10KB/秒
root /redis_2004;
# index index.html index.htm;
}
}
}