使用nginx限制使用者的訪問
阿新 • • 發佈:2020-07-25
使用ngx_http_limit_req_module限制使用者訪問
該模組使用的是漏斗演算法來進行限制。
官方的配置示例如下:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
引數的簡單解釋:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
- $binary_remote_addr 用來獲取客戶端的IP(如果使用負載均衡或CDN時需要進行更改)
- zone=one:10m,設定一個10M的記憶體空間,用來儲存訪問的頻次資訊
- rate=1r/s, 設定訪問的頻率,現在時1s 一次訪問
limit_req zone=one burst=5 nodelay;
- burst, 設定快取的大小,如果有大量的請求過來時,超過的部分可以先放入緩衝區
- nodelay 超過訪問頻次而且緩衝區也滿了的時候就會直接返回503
測試部分:
我自己寫了一個簡單的Go指令碼進行測試,程式碼如下
package main import ( "fmt" "net/http" "time" ) func curl(){ r,err := http.Get("https://www.fengcc.club/") if err != nil{ fmt.Println(err.Error()) } fmt.Println(time.Now(), r.Status) } func main(){ for i := 0; i < 100; i++{ go curl() } time.Sleep(time.Millisecond*4000) }
100次請求開始的時間為10:48:38.8205601
,結束時間為10:48:40.9850476
,共有8個請求成功,其他均為503.符合預期.
使用ngx_http_limit_conn_module限制使用者請求數
官方示例如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
配置和功能和上面的模組類似,就不在介紹。
使用負載均衡和CDN時限制使用者的訪問
前言:當使用CDN或負載均衡技術時,我們獲取的remote_IP,很可能不是客戶端的IP,因此我們需要獲取客戶端的真實IP再去做限制,可以通過"X-Forwarded-For"來獲取。
nginx配置如下:
http {
#獲取客戶端的真實IP
map $http_x_forwarded_for $clientRealIp {
default $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
#設定IP白名單,
geo $whiteiplist {
default 1;
127.0.0.1 0;
134.175.207.203 0;
#221.218.233.79 0;
}
#對內部的IP不設限
map $whiteiplist $all_limit {
1 $clientRealIP;
0 "";
}
#對IP做的限制
limit_conn_zone $all_limit zone=two:10m;
limit_req_zone $all_limit zone=one:10m rate=2r/s;
server {
location / {
limit_req zone=one burst=5 nodelay;
limit_conn_zone two 5;
}
}
}
注:如果不生效,可以嘗試重啟軟體。