? nginx流量限制的工作原理?? nginx限流的基本配置
? 處理突發情況
? 無延遲排隊
流量限制
(rate-limiting)是nginx
最有用的功能之一,卻經常被錯誤理解和錯誤配置。它允許我們限制使用者在給定時間內可以發出的http請求數量。例如請求**首頁的get請求,表單登入的post請求等。
?速率限制可以出於安全目的使用。例如,可以降低暴力破解賬號密碼的攻擊速度。通過將傳入請求速率限制為實際使用者的典型值,並(通過記錄)標識目標url,它可以幫助我們防禦ddos攻擊。而更為通用的用法是,防止上游應用程式伺服器同時被太多使用者請求所淹沒。
?流量限制(rate-limiting)
使用的是漏斗演算法leaky bucket algorithm
,該演算法在頻寬受限的情況下廣泛用於電信和分組交換計算機網路中,以處理突發性問題。模擬是用乙個水桶,在水桶的頂部澆水,然後從底部漏水。如果倒水的速度超過漏水的速度,則水桶會溢位。在請求處理方面,水代表來自客戶端的請求,儲存桶代表佇列,根據先進先出(fifo)排程演算法,請求等待處理。漏水表示離開緩衝區以供伺服器處理的請求,溢位表示已丟棄且從未得到服務的請求。
?限流主要依靠2個指令來配置limit_req_zone
和limit_req
,配置如下範例?
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server
}
?實際範例驗證:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/m;
server
}
?突發情況:rate=10r/s
配置代表100
毫秒只接受1個請求。若100
毫秒收到2個請求,對於第二個請求,nignx
將直接返回503給客戶端。這並不是我們希望的,因為程式應用的請求往往不是線性的,而是突發性的。我們希望將多餘的請求快取下來,而不是粗暴的返回503錯誤。針對這種情況,我們在指令limit_req
上使用burst
引數,配置如下:?
location /login/
?實際範例驗證:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=6r/m;
server
}
?無延遲排隊實現了如下功能,同一ip指定時間段內接收並**固定數量的請求,超量請求將會被拒接。
?nodelay配置:burst可以增加接納請求的容量,但是並不實用,因為這會使我們的**顯得很慢。在示例中rate=10r/s
,佇列中第20個請求在2秒後才會被**,這時客戶端已經等待2秒了。若要解決這個情況,我們使用nodelay
引數,配合burst
引數使用:
location /login/
?實際範例驗證:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=6r/m;
server
}
❗對於大多數部署,我們都應當在limit_req
指令中包含burst
和nodelay
引數
參考文章
Nginx限流配置
nginx限流配置 編輯 1 限制域宣告 以下配置建議統一在http域中進行配置 定義乙個名為perip req的limit req zone用來儲存session,大小是10m記憶體,以 binary remote addr 為key,限制平均每分鐘的請求為30個,1m能儲存16000個狀態 以下...
nginx限流配置
表示處理請求的平均速度 每個請求之間至少要間隔 1000 60 16.7ms 超出的請求將會進入令牌桶中,例如在10ms內發出5個請求則只有乙個能得到處理,其餘4個會進入令牌桶 令牌桶內的令牌可以滿足這4個額外請求的時候,如果不滿足將會返回503或者自定義的status server locatio...
Nginx搶購限流配置
因業務需求經常會有搶購業務,因此需要在負載均衡前端進行限流錯誤。本文同樣也適用於防止cc.limit req zone server name zone sname 10m rate 1r s 限 務器每秒只能有一次訪問成功 limit req zone binary remote addr zon...