nginx-變量

變量也是nginx的一大亮點,這也使得nginx更加靈活了,變量的語法格式為 $XXX? 或 ${xxxx}
首先說下變量的分類,變量分為內置和自定義,網絡不少對變量的描述都不太準確,他們認為但凡不是nginx原生的變量都是屬于自定義,這么說其實也可以,但嚴格來說,
內置變量應該是但凡編譯到代碼里的都是內置,通用性強
自定義的僅限于配置文件中,局限性小
編譯進代碼的不僅包含ng原生的,也含我們的第三方模塊定義的變量。

自定義的如
set $my_var "hello world";
location / {
????add_header My-Var $my_var;
}

內置的都是需要編譯到代碼中的

ng原生變量的就太多了,實現文件在ngx_http_variables.c 和 ngx_stream_variables.c
內置變量需要在代碼里定義,并且調用對應的接口
ngx_http_add_variable 或ngx_stream_add_variable添加到全局中去,內置變量由ng框架進行維護和管理。
變量的抽象定義如下(以下都http為例,stream類同):
struct ngx_http_variable_s {

??? ngx_str_t??? name ;//變量名

??? ngx_http_set_variable_pt set_handler ;//變量的set方法,即寫

? ? ngx_http_get_variable_pt get_handler;//變量的get方法,即讀

??? uintprt_t??????? data ;//調用方法時,傳遞的參數,即變量掛載的任意數據指針,調用get和set的時候會透傳

??? ngx_uint_t flags; //變量標簽特性,NGX_HTTP_VAR_CHANGEABLE ,NGX_HTTP_VAR_NOCACHEABLE

????ngx_uint_t index;//變量的索引值,內置變量都在存儲在一個全局的數組中的,通過下標去讀取變量是最快的,nginx在啟動的時候會初始化

}
?
有了變量,就肯定要涉及到變量的類型。先看

表示變量值的結構體:

typedef ngx_variable_value_t ngx_http_variable_value_t;

typedef struct {

unsigned len:28;

unsigned valid:1;

unsigned no_cacheable:1;

unsigned not_found:1;

unsigned escape:1;

u_char *data;

} ngx_variable_value_t;
?

結構體并未指出變量的類型,其實變量其本質就是一塊內存,nginx無法確定變量的具體類型,于是通過長度確定,由使用者去“強轉”

在c語言內,任何類型 變量其實就是一塊內存,有了內存首地址,還有長度,就夠了。
比如是int類型,對data指向的字符串進行轉整數即可
還是可以二進制的,比如

v->len = sizeof(in_addr_t);

v->data = (u_char *) &sin->sin_addr;
?ng有幾個原生的地址變量就是二進制的。

ngx_http_add_variable 或ngx_stream_add_variable添加到全局中后,任意模塊任何地方都可以使用之。

變量有了,變量主要就是拿來使用的,否則就沒意義,使用最基本肯定是讀,變量存儲了我們想存儲的數據
再看下讀寫方法定義
讀:
typedef ngx_int_t (*ngx_http_get_variable_pt?) (ngx_http_request* r,ngx_http_variable_value_t *v , uintptr_t data) ;
寫:
typedef void (*ngx_http_set_variable_pt?)(ngx_http_request* r,ngx_http_variable_value_t *v , uintptr_t data)

第二個參數就是變量值,需要我們填充該結構體,data則是我們在ngx_http_add_variable時,填充到ngx_http_variable_s 結構體中的data,在某個地方使用了你的變量,那么ng就會調用 你定義好的?get_handler來獲取變量的值

代碼實例:
配置:
server {

?listen 9999;

?location / {
???? proxy_pass ${my_http_url} ;
? }
}
訪問9999端口,ng則會代理到?${my_http_url}存儲的url地址去。

在代碼里 實現get方法

ngx_str_t myurl = ngx_string("127.0.0.1:6666") ;

ngx_int_t? my_get_handler(ngx_http_request* r,ngx_http_variable_value_t *v , uintptr_t data)
{
? ?? v->len =?myurl .len;
???? v->data =?myurl .data ;
? ? ?v->valid = 1 ;//這個必須置1
? ? ?v->not_found=0;//必須置0
? ? v->no_cachebale = 0 ;

?return NGX_OK ;
}
當有人訪問9999端口時,ng就會調用我們定義好的get方法來取這個url地址,該地址ng自己去解析使用,如此可以實現動態的代理,比如可以根據不同的 請求r 來實現不同的代理地址。

ng的變量具體框架實現 其實還是很復雜的,代碼量也是比較大的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24243.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS中常用的一些宏以及用法

目錄 1.NS_UNAVAILABLE 2.__kindof 前言 這里博客主要介紹iOS中常用的一些宏以及用法。 1.NS_UNAVAILABLE NS_UNAVAILABLE是一個宏,通常用于指示某個方法不可用,無法被調用。 當一個方法被標記為NS_UNAVAILABLE時&…

【uniapp】帶圓角漸變邊框實現

1. 效果圖 2. 代碼實現 <image class"item-left-img" :src"url" mode"aspectFill" />.item-left-img {width: 240rpx;height: 320rpx;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padd…

校驗參數個數工具類

項目中有個需求&#xff1a;前后端參數一致性校驗&#xff0c;在某業務場景下后端代碼需要校驗參數個數&#xff0c;因此設計了1個工具類方便大伙使用&#xff0c;特此簡單記錄下。 校驗參數個數工具類 一、校驗工具類CheckNumInsideParamters二、單元測試ParameterSizeTest三…

數據挖掘--挖掘頻繁模式、關聯和相關性:基本概念和方法

頻繁項集、閉項集和關聯規則 頻繁項集&#xff1a;出現的次數超過最小支持度計數閾值 閉頻繁項集&#xff1a;一個集合他的超集(包含這個集合的集合)在數據庫里面的數量和這個集合在這個數據庫里面的數量不一樣,這個集合就是閉項集 如果這個集合還是頻繁的,那么他就是極大頻…

關于json文件的保存

在nodejs中&#xff0c;通常用fs.writeFileSync(filepath,JSON.stringify(jsonvar))這樣的調用&#xff0c;將json或者json數組轉換成字符串寫入到文件中&#xff0c;這時json的數據是緊湊的&#xff0c;沒有空格、制表符和換行來分隔&#xff0c;優點是可以省存儲空間&#xf…

SpringCache和SpringTask

SpringCache 在啟動類上加EnableCaching注解 我們只要在Controller上寫一個SpringCache相應的注解 我們就能實現緩存了 簡化緩存操作代碼&#xff0c;提高我們的效率 我們默認是我們的spring做緩存 但我們還可以替換我們的緩存技術 例如 EhCache Google Redis 來作為…

MAVEN:自定義模板Archetype的創建

目錄 一、簡介 二、具體步驟 三、 vscode通過模板創建項目 四、通過IDEA創建 一、簡介 有時候MAVEN自帶的模板庫并不能滿足我們創建項目的需求&#xff0c;為了能夠快速創建項目&#xff0c;免去每次復雜的配置&#xff0c;所以我們需要自定義模板庫&#xff0c;本次操作基于…

Linux 性能優化基礎

文章目錄 常見指標分類&#xff08;USE法&#xff09;常見性能工具CPU性能工具內存性能工具文件系統和磁盤I/O性能工具網絡性能工具 根據指標找工具CPU性能內存性能文件系統和磁盤I/O網絡性能 根據工具找指標CPU性能內存性能文件系統和磁盤I/O網絡性能 CPU性能分析一般步驟內存…

【C++題解】1254. 求車速

問題&#xff1a;1254. 求車速 類型&#xff1a;簡單循環 題目描述&#xff1a; 一輛以固定速度行駛的汽車&#xff0c;司機在上午 10 點看到里程表上的讀數是一個對稱數(即這個數從左向右讀和從右向左讀是完全一樣的)&#xff0c;為95859 。 兩小時后里程表上 出現了一個新的…

不明確的unicode字符

不明確的unicode字符 起因&#xff1a;一個Demo源碼&#xff0c;也不知道是用什么編輯器編的&#xff0c;中文注釋非常全面。就打算原來的基礎上改改就用&#xff0c;特別是里面大量接口、類的定義&#xff0c;真沒必要重寫。但是在VS Code里面打開&#xff0c;出現“本文檔包含…

k-means聚類模型的優缺點

一、k-means聚類模型的優點 1. 簡單高效&#xff1a;k-means算法思想簡單直觀&#xff0c;易于實現。它通過迭代計算樣本點與聚類中心之間的距離&#xff0c;并不斷調整聚類中心的位置&#xff0c;直至滿足終止條件。由于其計算過程相對直接&#xff0c;所以具有較高的執行效率…

控制臺輸入javac命令輸出的結果中的中文亂碼解決方式

默認字符編碼UTF-8無法解析中文。設置環境變量中 “JAVA_TOOL_OPTIONS” 的值為"UTF-8" 即可。 具體配置步驟&#xff1a; 桌面右鍵"我的電腦" --> 屬性 高級系統設置 環境變量 用戶變量中添加 JAVA_TOOL_OPTIONS 然后確定&#xff0c;保存即可。

阿里云一鍵登錄號碼認證服務

阿里云文檔&#xff1a;號碼認證SDK_號碼認證服務(PNVS)-阿里云幫助中心 對于后端大概流程 前端App會傳一個token過來 后端通過下面方法解析 如果解析可以獲得號碼,說明號碼認證成功,如果無法正確解析則認證失敗 /*** actoken來換取電話號碼* param token app端用戶授權actok…

WDF驅動開發-PNP和電源管理(二)

下面是一種比較典型的 PnP 和電源管理方案&#xff0c;WDF框架在這些情況下調用驅動程序的事件回調函數&#xff1a; 用戶插入設備用戶拔出設備設備進入低功耗狀態設備回到工作狀態PnP 管理器重新分發系統資源 這些幾乎是所有的和PNP、電源管理相關的場景了&#xff0c;它們分…

達夢8 網絡中斷對系統的影響

測試環境&#xff1a;三節點實時主從 版本&#xff1a;--03134283938-20221019-172201-20018 測試1 系統沒有啟動確認監視器 關閉節點3網卡 登錄節點1檢查主庫狀態 顯示向節點2發送歸檔成功&#xff0c;但無法收到節點3的消息&#xff0c;節點1掛起 日志報錯如下&#xf…

易于上手的requests

Python中的requests庫主要用于發送HTTP請求并獲取響應結果。在現代網絡編程中&#xff0c;HTTP請求是構建客戶端與服務器之間通信的基礎。Python作為一種高級編程語言&#xff0c;其豐富的庫支持使得它在網絡數據處理領域尤為突出。其中&#xff0c;requests庫以其簡潔、易用的…

力扣560. 和為 K 的子數組

Problem: 560. 和為 K 的子數組 文章目錄 題目描述思路復雜度Code 題目描述 思路 1.初始化一個哈希表preSum&#xff0c;用于記錄前綴和及其出現次數,ans記錄和為k的子數組數量、sum_i記錄當前前綴和&#xff1b; 2.將前綴和為 0 的情況存入哈希表&#xff0c;表示前綴和為 0 出…

【Python】認識 Python

一、計算機基礎概念 1、什么是計算機 很多老一輩的人&#xff0c;管下面這個叫做計算機。然而&#xff0c;它只是 “計算器”&#xff0c;和計算機是有很大區別的。 現在我們所說的計算機&#xff0c;不光能進行算術運算&#xff0c;還能進行邏輯判斷、數據存儲、網絡通信等…

遇到no module named ‘pyLDAvis.sklearn‘的解決辦法

在NLP學習中&#xff0c;常常用到LDA主題模型對文本進行分類&#xff0c;可視化經常用到的代碼有 import pyLDAvis import pyLDAvis.sklearnpanel pyLDAvis.sklearn.prepare(lda, tf_idf, tf_idf_vectorizer) pyLDAvis.save_html(panel, lda_visualization.html) pyLDAvis.di…

HTML靜態網頁成品作業(HTML+CSS)—— 節日母親節介紹網頁(5個頁面)

&#x1f389;不定期分享源碼&#xff0c;關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 &#x1f3f7;?本套采用HTMLCSS&#xff0c;未使用Javacsript代碼&#xff0c;共有5個頁面。 二、作品演示 三、代…