本來想寫一下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_系列等。