再談nginx變數 二

2021-08-26 21:40:59 字數 1617 閱讀 2700

nginx中除了一些內建變數,自定義變數(通過set指令定義的),還有一模擬較特別的變數,我稱它們為特殊字首變數,這類變數多數在

內建變數陣列內是找不到的,形式可以分一下幾類:

其中有些常見的http_***和sent_http_***(其實主要是一些header)在內建變數陣列中已經給出,多數偏僻的則沒有指明,所以nginx碰到這些變數的時候,就把他們列為"unknown header", 處理這些"unknown header"的方法,則採用統一的handler,因為nginx處理時並不關心內容和細節,從這個角度來說,nginx這種不懂的東西不裝懂,做好基本的事情就ok的行為,是值得我們平時為人處世時去借鑑的^_^。

那麼這幾種變數具體指代什麼呢?他們又是如何運作的呢?

$http_***,指代那些客戶請求過來的header。

$sent_http_***,指代將要由nginx發往客戶端的header。

$upstream_http_***,指代nginx接收到的上游響應header。

$cookie_***,用來確定cookie中的特定值。

$arg_***,用來取得特定請求引數值

關於他們的實際運作,可以參考ngx_http_variables_init_vars函式,比較簡單。

比如:要取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++) }

主要做的工作就是把那些所謂的不能快取的變數值(no_cacheable),全部置為無效和not fond。這樣也就保證了每次要獲取這些變數的時候都去重新獲取。舉個例子,比如$uri,這個變數是用來獲得請求uri,而它在整個處理週期中可能會經常變化,例如重寫,重定向等操作,所以我們獲取它的時候一定要去通過get_handler來獲取當前的最新值,所以$uri這個變數在內建變數陣列中的初始型別就是no cacheable的。

還有乙個需要注意的點就是:e->flushed,一般用的時候我們把它置1,這樣我們就希望nginx去通過get_handler來獲取最新的變數值。

當有已經快取的有效變數值是,我們就不去設定它,這樣,nginx會先去考察之前已經獲得的結果,當不滿足使用條件時,在通過get_handler重新取。

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

再談nginx變數 二

nginx中除了一些內建變數,自定義變數 通過set指令定義的 還有一模擬較特別的變數,我稱它們為特殊字首變數,這類變數多數在 內建變數陣列內是找不到的,形式可以分一下幾類 其中有些常見的http 和sent http 其實主要是一些header 在內建變數陣列中已經給出,多數偏僻的則沒有指明,所以...

再談互斥鎖與條件變數

pthread cond wait總和乙個互斥鎖結合使用。在呼叫pthread cond wait前要先獲取鎖。pthread cond wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。int pthread cond signal pt...

再談互斥鎖與條件變數

pthread cond wait總和乙個互斥鎖結合使用。在呼叫pthread cond wait前要先獲取鎖。pthread cond wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。int pthread cond signal pt...