再談nginx變量(二)

nginx中除了一些內建變量,自定義變量(通過set指令定義的),還有一類比較特別的變量,我稱它們爲特殊前綴變量,這類變量多數在內建變量數組內是找不到的,形式可以分一下幾類:
$http_xxx, $sent_http_xxx, $upstream_http_xxx, $cookie_xxx, $arg_xxx。
其中有些常見的http_xxx和sent_http_xxx(其實主要是一些header)在內建變量數組中已經給出,多數偏僻的則沒有指明,所以nginx碰到這些變量的時候,就把他們列爲"unknown header", 處理這些"unknown header"的方法,則採用統一的handler,因爲nginx處理時並不關心內容和細節,從這個角度來說,nginx這種不懂的東西不裝懂,做好基本的事情就OK的行爲,是值得我們平時爲人處世時去借鑑的^_^。

那麼這幾種變量具體指代什麼呢?他們又是如何運作的呢?
$http_xxx,指代那些客戶請求過來的header。
$sent_http_xxx,指代將要由nginx發往客戶端的header。
$upstream_http_xxx,指代nginx接收到的上游響應header。
$cookie_xxx,用來確定cookie中的特定值。
$arg_xxx,用來取得特定請求參數值
關於他們的實際運作,可以參考ngx_http_variables_init_vars函數,比較簡單。
需要提醒一點的就是:標準header名中有‘-’連接線的,要寫成‘_’下劃線,這是語法上的約定.
比如:要取Accept-Encoding頭的內容,可以用$http_Accept_Encoding.

最後來做個總結,看看nginx變量在實際服務時的大致運作流程:
首先在配置解析階段,nginx完成了延遲執行機制的佈置,就像是一個機器組裝完畢,現在就等待服務了。類比一下,一個機器的工作,就是一個你給它輸入,它吐出輸出的過程,類似的,nginx通過函數ngx_http_script_run來完成,它的輸入length和value,這兩個是nginx設置的延遲執行裝置,通過他們的運作,就可以得到一個變量背後的實際值,也就是字符串,字符串自然需要知道它的長度(length)和起始位置(value)了。而我們想要的輸出結果,是通過
ngx_http_script_run的第二個參數來返回。總體看就是這些,那麼內部呢?

在ngx_http_script_run開始處理中:
for (i = 0; i < cmcf->variables.nelts; i++) {
    if (r->variables[i].no_cacheable) {
        r->variables[i].valid = 0;
        r->variables[i].not_found = 0;
    }
}
主要做的工作就是把那些所謂的不能緩存的變量值(no_cacheable),全部置爲無效和not fond。這樣也就保證了每次要獲取這些變量的時候都去重新獲取。舉個例子,比如$uri,這個變量是用來獲得請求uri,而它在整個處理週期中可能會經常變化,例如重寫,重定向等操作,所以我們獲取它的時候一定要去通過get_handler來獲取當前的最新值,所以$uri這個變量在內建變量數組中的初始類型就是no cacheable的。
還有一個需要注意的點就是:e->flushed,一般用的時候我們把它置1,這樣我們就希望nginx去通過get_handler來獲取最新的變量值。
當有已經緩存的有效變量值是,我們就不去設置它,這樣,nginx會先去考察之前已經獲得的結果,當不滿足使用條件時,在通過get_handler重新取。

差不多了,變量這塊就先這樣吧,以後發現那些細節在討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章