本來想寫一下nginx的指令碼引擎的,但是看起來實在是有點龐大,一時間還不知道該從**寫比較好。就先寫一下他的變數系統吧,這是指令碼引擎非常重要的組成部分。
首先為了表述清楚先規定幾個術語吧
內建變數:nginx配置檔案裡不用set就可以直接用的變數。(比如$uri/$host等)
先看帶快取的內建變數吧
第一步:nginx在初始化模組的時候會建立內建變數陣列cmcf->variables_keys,元素的值裡有**函式,用來取變數的值。
第二步:掃瞄配置檔案,把配置檔案裡會用到的變數建立乙個陣列cmcf->variables。
第三步:掃瞄cmcf->variables_keys陣列和cmcf->variables陣列,建立乙個對應關係。把所有cmcf->variables的元素的索引寫到相對應的cmcf->variables_keys值的index欄位。
先舉個例子,假如你在配置檔案裡用到了$uri這個變數,第二步nginx就會把uri這個變數寫到cmcf->variables陣列,再假如uri在cmcf->variables陣列的索引是2,第三步就會把cmcf->variables_keys對應uri的這個變數的值的index欄位賦值成2。
第四步:為了加快查詢速度,把cmcf->variables_key陣列轉化成雜湊表cmcf->variables_hash。
編譯指令碼**的部分先略過。
第五步:當http請求來的時候會申請乙個和cmcf->variables等大小的陣列r->variables,這個就是變數快取,用來儲存當前請求的變數值的(內建變數是和http請求相關的,比如說對於某個請求$host變數的值是www.foo.com,對於另乙個請求$host的值又變成了www.bar.com)。
第六步:當處理某個http請求並且需要某個變數的時候就從cmcf->variables_hash查詢變數的index值找到快取r->variables,如果快取r->variables不存在就用cmcf->variables_hash裡的**函式取值存到r->variables裡,下次再用就可以直接讀快取。(這裡面包含了編譯指令碼的和執行指令碼的步驟,這次先不寫了)。
此外還有不帶快取的內建變數,與帶快取的內建變數不同的地方就是他不會在r->variables裡設定快取,每次使用都會呼叫**函式,比如http_系列/cookie_系列/upstream_http_系列/upstream_cookie_系列等。
nginx的內建變數
arg parameter http請求中某個引數的值。例 index.html?size 100,可以用 arg size獲取100 binary remote addr 二進位制格式的客戶端位址。body bytes sent 表示在向客戶端傳送的http響應中,包體部分的位元組數 conten...
nginx配置變數
arg parameter 功能 如果在請求中設定了查詢字串,那麼這個變數包含在查詢字串是get請求parameter中的值。args 功能 該變數的值是get請求在請求行中的引數。binary remote addr body bytes sent 功能 響應體的大小,即使發生了中斷或者是放棄,也...
nginx內建變數
nginx作為乙個成熟 久經考驗的負載均衡軟體,與其提供豐富 完整的內建變數是分不開的,它極大增加了對nginx網路行為的控制細度。這些變數大部分都是在請求進入時解析的,並把他們快取到請求cycle中,方便下一次獲取使用。首先來看看nginx對都開放了那些api。參看下表 名稱說明 arg name...