配置示例
針對(duì)不同URL的限流示例如下:
limit_conn_zone $server_name zone=perserver:10m;
limit_req_zone $server_name zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
location /conn_1/ {
limit_conn perserver 1;
echo_sleep 0.1;
echo $uri;
}
location /conn_5/ {
limit_conn perserver 5;
echo_sleep 0.1;
echo $uri;
}
location /conn_10/ {
limit_conn perserver 10;
echo_sleep 0.1;
echo $uri;
}
location /rate_10B/ {
limit_rate 10;
echo $uri;
}
location /rate_50B/ {
limit_rate 50;
echo $uri;
}
location /rate_4kB/ {
limit_rate 4k;
echo $uri;
}
location /rate/ {
if ($uri ~ "^/rate/10B/") {
limit_rate 10;
}
if ($uri ~ "^/rate/50B/") {
limit_rate 50;
}
if ($uri ~ "^/rate/4kB/") {
limit_rate 4k;
}
echo $uri;
}
location /req_1_0/ {
limit_req zone=one;
echo $uri;
}
location /req_1_5/ {
limit_req zone=one burst=5;
echo $uri;
}
location /req_1_5_nodelay/ {
limit_req zone=one burst=5 nodelay;
echo $uri;
}
}
注:示例中使用了echo模塊。
說明
- server_name必須設(shè)置导梆。如果不設(shè)置轨淌,會(huì)用nginx的默認(rèn)值“server_name "";”迂烁,此時(shí)用server_name做關(guān)鍵字定義的相關(guān)配置不生效。
- 同時(shí)發(fā)送多個(gè)請(qǐng)求訪問http://localhost/conn_1/递鹉,只有1個(gè)返回200狀態(tài)碼盟步,其余返回503錯(cuò)誤。錯(cuò)誤日志中出現(xiàn)如下信息:
limiting connections by zone "perserver", client: 127.0.0.1, server: localhost, request: "GET /conn_1/ HTTP/1.1", host: "localhost"
同理躏结,同時(shí)發(fā)送5個(gè)以上請(qǐng)求訪問http://localhost/conn_5/却盘,只有5個(gè)返回200狀態(tài)碼,其余返回503錯(cuò)誤媳拴。 - 訪問http://localhost/rate_10B/黄橘,通過查看訪問日志可以看到,$bytes_sent(nginx返回給客戶端的字節(jié)數(shù))為199字節(jié)屈溉,而$request_time(請(qǐng)求處理時(shí)間)為19.015秒塞关,即限速為每秒10字節(jié)。訪問http://localhost/rate/10B/時(shí)同樣是限速每秒10字節(jié)子巾。
訪問http://localhost/rate_50B/帆赢,通過查看訪問日志可以看到,$bytes_sent為199字節(jié)线梗,而$request_time為3.003秒椰于,即限速為每秒50字節(jié)。 - limit_rate限制的是nginx向客戶端傳送響應(yīng)的速率仪搔,不限制客戶端向nginx發(fā)送請(qǐng)求的速率瘾婿。nginx按連接限速,所以如果某個(gè)客戶端同時(shí)開啟了兩個(gè)連接烤咧,那么客戶端的整體速率是這條指令設(shè)置值的2倍偏陪。
- 同時(shí)發(fā)送多個(gè)請(qǐng)求訪問http://localhost/req_1_0/,只有1個(gè)返回200狀態(tài)碼髓削,其余返回503錯(cuò)誤竹挡。錯(cuò)誤日志中出現(xiàn)如下信息:
limiting requests, excess: 1.000 by zone "one", client: 127.0.0.1, server: localhost, request: "GET /req_1_0/ HTTP/1.1", host: "localhost" - 同時(shí)發(fā)送10個(gè)請(qǐng)求訪問http://localhost/req_1_5/,有1個(gè)立即返回200狀態(tài)碼立膛,有4個(gè)請(qǐng)求立即返回503狀態(tài)碼,之后剩余的5個(gè)請(qǐng)求每秒返回1個(gè)200的響應(yīng)梯码,總計(jì)耗時(shí)5秒宝泵,總計(jì)返回6個(gè)200狀態(tài)碼。錯(cuò)誤日志中出現(xiàn)如下信息:
limiting requests, excess: 5.997 by zone "one", client: 127.0.0.1, server: localhost, request: "GET /req_1_5/ HTTP/1.1", host: "localhost" - 同時(shí)發(fā)送10個(gè)請(qǐng)求訪問http://localhost/req_1_5_nodelay/轩娶,有6個(gè)請(qǐng)求立即返回200狀態(tài)碼儿奶,其余4個(gè)立即返回503錯(cuò)誤。錯(cuò)誤日志中出現(xiàn)如下信息:
limiting requests, excess: 5.998 by zone "one", client: 127.0.0.1, server: localhost, request: "GET /req_1_5_nodelay/ HTTP/1.1", host: "localhost" - limit_conn和limit_req不能設(shè)置在if指令中鳄抒,所以如果針對(duì)不同的URL進(jìn)行限流闯捎,只能通過不同的location實(shí)現(xiàn)椰弊。limit_rate可以在if指令中,可以使用if指令匹配URL實(shí)現(xiàn)不同URL的限流瓤鼻。