在閱讀了Nginx 的limit_conn_zone和limit_req_zone檔案后,我感到很困惑。盡管它們都使用$binary_remote_addr變數來存盤密鑰,但它們描述了不同大小的空間占用。請問這是檔案錯誤嗎?在 64 位平臺上存盤 TCP 連接狀態需要多少空間?
來自limit_conn_zone 中的描述。
請注意,這里使用
$remote_addr的是變數而不是 。$binary_remote_addr變數的$remote_addr大小可以在 7 到 15 個位元組之間變化。存盤狀態在 32 位平臺上占用 32 或 64 位元組的記憶體,在 64 位平臺上始終占用 64 位元組。對于 IPv4 地址,該$binary_remote_addr變數的大小始終為 4 個位元組,對于 IPv6 地址,該變數的大小始終為 16 個位元組。存盤狀態在 32 位平臺上總是占用 32 或 64 位元組,在 64 位平臺上總是占用 64 位元組。
來自limit_req_zone 中的描述。
請注意,這里使用
$remote_addr的是變數而不是 。$binary_remote_addr對于 IPv4 地址,該$binary_remote_addr變數的大小始終為 4 個位元組,對于 IPv6 地址,該變數的大小始終為 16 個位元組。存盤狀態在 32 位平臺上總是占用 64 位元組,在 64 位平臺上總是占用 128 位元組。
uj5u.com熱心網友回復:
這兩個指令都在共享記憶體中定義了一個區域,該區域包含從鍵到某個狀態的映射。您將密鑰的大小誤認為狀態的大小。此外,他們不必將$binary_remote_addr變數用作鍵。實際上,通過指令的第一個引數(鍵),您是決定使用什么變數作為鍵的人。
映射是指一個函式/資料結構,給定一個鍵回傳與該鍵關聯的值。相同的鍵將始終回傳相同的值。這類似于字典(抽象資料型別),可以使用哈希表(資料結構)來實作。我不是 100% 確定 NGINX 實作專門使用這些型別,但這是可能的。閱讀它們可能會幫助您更好地理解該主題。然而,它是否實作,NGINX 將這種映射稱為“區域”。
在這兩個指令中,您都定義了一個區域并能夠指定要用作鍵的變數。這將決定哪些請求/連接被分組到相同的值中,哪些不是。$binary_remote_addr舉個例子。在這種情況下,共享遠程地址的所有請求/連接將被分組為區域中的一個值。
最后,對于存盤狀態 - 這是與鍵關聯的值。您可以將記憶體的抽象布局想象為:
[key1] ---> { some state stored in the zone, associated with key1 }
[key2] ---> { some other state, associated with key2 }
etc.
現在,重要的是,雖然它們使用相同的鍵來索引資料,但這些指令中的每一個都在區域中存盤不同的資訊。兩者的定義都始于:
為共享記憶體區域設定引數,該區域將保持各種鍵的狀態。
因為這是區域的通用定義。它們的區別在于以“特別”開頭的句子:
特別是,狀態存盤當前過多請求的數量。
對于limit_req_zone或
特別是,狀態包括當前的連接數。
為limit_conn_zone.
每個指令創建的區域將在與鍵關聯的狀態中存盤不同的資訊。在一種情況下是過多請求的數量,在另一種情況下是連接數。由于資訊不同,大小自然也不同。因此,每個指令將“存盤狀態”的大小描述為不同的值。他們可能(但不必,您決定)使用與鍵相同的變數,例如$binary_remote_addr. 在這種情況下,鍵的大小將是相同的,但它們與與每個區域中的那些鍵關聯的狀態的大小無關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487226.html
標籤:nginx
上一篇:Ngninx位置回傳404
