Nginx現(xiàn)在已經(jīng)是最火的負載均衡之一,在流量陡增的互聯(lián)網(wǎng)面前,接口限流也是很有必要的,尤其是針對高并發(fā)的場景。Nginx的限流主要是兩種方式:限制訪問頻率和限制并發(fā)連接數(shù)。
限流(rate limiting)是NGINX眾多特性中最有用的,也是經(jīng)常容易被誤解和錯誤配置的,特性之一。該特性可以限制某個用戶在一個給定時間段內(nèi)能夠產(chǎn)生的HTTP請求數(shù)。請求可以簡單到就是一個對于主頁的GET請求或者一個登陸表格的POST請求。
限流也可以用于安全目的上,比如減慢暴力密碼破解攻擊。通過限制進來的請求速率,并且(結(jié)合日志)標記出目標URLs來幫助防范DDoS攻擊。一般地說,限流是用在保護上游應(yīng)用服務(wù)器不被在同一時刻的大量用戶請求湮沒。
NGINX限流是如何工作的
NGINX限流使用漏桶算法(leaky bucket algorithm),該算法廣泛應(yīng)用于通信和基于包交換計算機網(wǎng)絡(luò)中,用來處理當帶寬被限制時的突發(fā)情況。和一個從上面進水,從下面漏水的桶的原理很相似;如果進水的速率大于漏水的速率,這個桶就會發(fā)生溢出。
在請求處理過程中,水代表從客戶端來的請求,而桶代表了一個隊列,請求在該隊列中依據(jù)先進先出(FIFO)算法等待被處理。漏的水代表請求離開緩沖區(qū)并被服務(wù)器處理,溢出代表了請求被丟棄并且永不被服務(wù)。
一、限制訪問頻率(正常流量)
Nginx中我們使用ngx_http_limit_req_module模塊來限制請求的訪問頻率,基于漏桶算法原理實現(xiàn)。接下來我們使用 nginx limit_req_zone 和 limit_req 兩個指令,限制單個IP的請求處理速率。
語法:limit_req_zone key zone rate
二、限制訪問頻率(突發(fā)流量)
按上面的配置在流量突然增大時,超出的請求將被拒絕,無法處理突發(fā)流量,那么在處理突發(fā)流量的時候,該怎么處理呢?Nginx提供了 burst 參數(shù)來解決突發(fā)流量的問題,并結(jié)合 nodelay 參數(shù)一起使用。burst 譯為突發(fā)、爆發(fā),表示在超過設(shè)定的處理速率后能額外處理的請求數(shù)。
新聞熱點
疑難解答