為什么80%的碼農都做不了架構師?>>> ??
1??? 嚴格訪問
訪問能基于客戶端的IP地址允許或拒絕或使用基于HTTP驗證。
為了允許或拒絕從某個地址及或所有地址的訪問,使用allow和deny指令:
location / {
????deny 192.168.1.2;
????allow 192.168.1.1/24;
????allow 127.0.0.1;
????deny all;
}
?為了啟用驗證,使用auth_basic指令。用戶要么輸入有效的用戶名和密碼獲取網站的訪問。用戶名和密碼必須在auth_basic_user_file指令命名的文件中列出。
server {
????...
????auth_basic "closed website";
????auth_basic_user_file conf/htpasswd;
}
?你能讓網站的一些區域沒有驗證即使你需要整個網站驗證。在非驗證區域配置塊中,在auth_basic指令中包括off參數取消繼承外部配置級別設置。例如,限制整個網站訪問,但有些位置可以公開:
server {
????...
????auth_basic "closed website";
????auth_basic_user_file conf/htpasswd;
?
????location /public/ {
????????auth_basic off;
????}
}
為了聯合IP地址和驗證,使用satisfy指令。默認,設置為all,因此客戶端滿足這兩種類型的條件授予訪問權限。當satisfy指令設置為any,至少滿足一個條件授予訪問權限。因此,如果IP地址是允許的,未驗證的用戶可以訪問,反之亦然。
?location / {
????satisfy any;
?
????allow 192.168.1.0/24;
????deny ?all;
?
????auth_basic ??????????"closed site";
????auth_basic_user_file conf/htpasswd;
}
2??? 限制訪問
可以限制:
-
每個鍵值的連接數(例如,每個IP地址)
-
每個鍵值請求速率(在1秒/分鐘期間允許處理的請求數)
-
連接的下載速度
注意,IP地址能在NAT設備后共享,因此通過IP地址應該是明智的。
2.1??? 限制連接數
為了限制連接數,首先使用limit_conn_zone指令定義鍵并設置共享內存區域參數(worker進程將使用該區域共享鍵值計數器)。作為第一個參數,指定表達式計算為鍵。第二個參數,指定區域的名字和大小。
limit_conn_zone $binary_remote_address zone=addr:10m;
?第二,使用limit_conn指令應用location虛擬服務器或整個http上下文的限制。指定共享內存區域的名字作為第一個參數,允許每個鍵的連接作為第二個參數。
location /download/ {
????limit_conn addr 1;
}
連接數在IP地址基礎上的限制,因為$binary_remote_address變量用作鍵。通過使用$server_name變量限制指定服務器連接數:
http {
????limit_conn_zone $server_name zone=servers:10m;
?
????server {
????????limit_conn servers 1000;
????}
}
?2.2??? 限制請求速率
為了限制請求速率,首先設置鍵和共享內存區域保存計數器。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
rate參數能指定每秒的請求數(r/s)或沒分鐘的請求數(r/m)。
一旦定義共享內存區域,使用limit_req指令在虛擬服務器或location(或全局,如果需要)為了限制請求速度:
location /search/ {
????limit_req zone=one burst=5;
}
?如果速率超過限制,請求被放入隊列延遲處理。burst參數設置等待處理的最大請求數。超過burst限制的請求Nginx響應503錯誤。
如果burst期間不需要延遲,添加nodelay參數。
limit_req zone=one burst=5 nodelay;
2.3??? 限制帶寬
為了限制每個連接的帶寬,使用limit_rate指令:
location /download/ {
????limit_rate 50k;
}
使用該設置,客戶端將能夠通過單個連接下載內容速度最大為每秒50千字節。然而,客戶端打開各種連接。因此,如果目標是組織下載速度大于指定值,連接的數量也應該限制。例如,每個IP地址一個連接(如果共享區域使用上面指定的):
location /download/ {
????limit_conn addr 1;
????limit_rate 50k;
}
為了只在客戶端下載某一數據之后利用限制,使用limit_rate_after指令。合理允許客戶端快速下載某些數據(例如,文件頭——電影索引),限制下載剩下數據的速率(讓用戶看電影,不下載)。
limit_rate_after 500k;
limit_rate 20k;
下面例子顯示連接數和帶寬限制聯合配置。每個客戶端地址允許最大連接數為5,適合現代瀏覽器打開同時打開三個連接的情況。與此同時,服務下載的location只允許一個連接:
http {
????limit_conn_zone $binary_remote_address zone=addr:10m
?
????server {
????????root /www/data;
????????limit_conn addr 5;
?
????????location / {
????????}
?
????????location /download/ {
????????????limit_conn addr 1;
????????????limit_rate 1m;
????????????limit_rate 50k;
????????}
????}
}