nginx limit req zone用法詳解

2021-09-12 22:59:36 字數 1503 閱讀 7862

nginx可以使用ngx_http_limit_req_module模組的limit_req_zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。

ngx_http_limit_req_module模組是nginx預設安裝的,所以直接配置即可。

首先,在nginx.conf檔案中的http模組下配置:

limit_req_zone $binary_remote_addr zone=commonper:10m rate=10r/s;

limit_req_zone $binary_remote_addr zone=50per:10m rate=50r/s;

說明:

區域名稱為commonper 和 50per(自定義),占用空間大小為10m,平均處理的請求頻率不能超過每秒十次,50per的每秒50次。

我這裡配置了兩種不同規格的配置,用於子模組配置時可自由指定。

$binary_remote_addr$remote_addr(客戶端ip)的二進位制格式,固定占用4個位元組(可能是c語言的long型別長度)。

第二,在http模組的子模組server下面配置

location ~^(.+\.php)

(.*)$

這裡是對專案中所有請求限制。

高速的可選擇zone=50per

注意zone=commonper和前面的定義對應。

burst是緩衝佇列的長度。

nodelay字面的意思是不延遲,具體說是對使用者發起的請求不做延遲處理,而是立即處理。比如我上面定義的rate=10r/s,即每秒鐘只處理10個請求。

如果同一時刻有11個請求過來,若設定了nodelay,則會立刻處理這兩個請求。若沒設定nodelay,則會嚴格執行rate=10r/s的配置,即只處理十個請求,然後下一秒鐘再處理剩下乙個請求。

真正對限流起作用的配置就是rate=10r/s和burst=50這兩個配置。

下面我們來分析一下具體案例。

某一時刻有兩個請求同時到達nginx,其中乙個被處理,另乙個放到了緩衝佇列裡。雖然配置了nodelay導致第二個請求也被瞬間處理了,但還是占用了緩衝佇列的乙個長度,如果下一秒沒有請求過來,這個占用burst乙個長度的空間就會被釋放,否則就只能繼續占用著burst的空間,直到burst空間占用超過5之後,再來請求就會直接被nginx拒絕,返回503錯誤碼。

可見,如果第二秒又來了兩個請求,其中乙個請求又占用了乙個burst空間,第三秒、第四秒直到第五秒,每秒都有兩個請求過來,雖然兩個請求都被處理了(因為配置了nodelay),但其中乙個請求仍然占用了乙個burst長度,五秒後整個burst長度=5都被占用了。第六秒再過來兩個請求,其中乙個請求就被拒絕了。

原文參考:

優先佇列priority queue 用法詳解

優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所以我們無論按照什麼順序push一堆數,最終在佇列...

優先佇列priority queue 用法詳解

優先佇列priority queue 用法詳解 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所...

優先佇列priority queue 用法詳解

優先佇列priority queue 用法詳解 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所...