Nginx 如何自定義變數?

2022-02-20 20:53:10 字數 4909 閱讀 8680

之前的兩篇文章 nginx 變數介紹以及利用 nginx 變數做防盜煉 講的是 nginx 有哪些變數以及乙個常見的應用。那麼如此靈活的 nginx 怎麼能不支援自定義變數呢,今天的文章就來說一下自定義變數的幾個模組以及 nginx 的 keepalive 特性。

模組:ngx_http_map_module預設編譯進 nginx,通過--without-http_map_module禁用

context: http我們主要看一下map string $variable這個指令。所謂類似 switch case 的語法是指,string 的值可以有多個,可以根據 string 值的不同,來給 $variable 賦不同的值。

case 規則: 內的匹配規則需要遵循以下規則,尤其是要注意當使用 hostnames 指令時,與 server name 的匹配規則是一致的,可以看之前的文章 nginx 的配置指令

default 規則

其他大家看到上面這些規則可能都有些暈,廢話不多說,直接來看乙個實戰配置檔案就懂了。

這裡我們有乙個配置檔案,在這個檔案裡面我們定義了兩個 map 塊,分別配置了兩個變數,$name 和 $mobile,$name 中包含 hostnames 指令。

}下面看一下實際的請求:

➜  test_nginx curl -h "host: map.ziyang.org.cn" 127.0.0.1:10001

2:0

為什麼會返回 2:0 呢?我們來看一下匹配順序。

map.ziyang.org.cn 有三個規則可以生效,分別是:

而泛網域名稱是優先於正規表示式的,* 在前的泛網域名稱優先於在後面的泛網域名稱,因此最終匹配到的就是:

而第二個變數 $mobile 自然走的是 default 規則,不用多說。

這就是 map 模組的作用,大家可以多嘗試一下。

下面再來看乙個與 map 模組有點類似的 split_clients 模組,這個模組也是通過生成新的變數來完成 ab 測試功能的,它可以按照變數的值,按照百分比的方式,生成新的變數。

模組:ngx_http_split_clients_module,預設編譯進 nginx,通過--without-http_split_clients_module禁用

case 規則:

syntax: split_clients string $variable 

default: —

context: http

split_clients 的指令與 map 是非常相似的,可以看一下前面的介紹,這裡不再贅述了。

下面這個配置,來看下有沒有啥問題:

split_clients "$" $variant
細心的同學可能已經發現了,所有的百分比相加已經超過了 100%,所以 nginx 直接會丟擲乙個錯誤,禁止執行。

➜  test_nginx ./sbin/nginx -s reload

nginx: [emerg] percent total is greater than 100% in /users/mtdp/myproject/nginx/test_nginx/conf/example/17.map.conf:31

然後將40% .four;這一行給遮蔽掉再試試看:

abtestfile.three正常執行。

geo 模組與前面兩個模組也很相似,不同之處在於,這個模組是基於 ip 位址或者子網掩碼這樣的變數值來生成新的變數的。

模組:ngx_http_geo_module,預設編譯進 nginx,通過--without-http_geo_module禁用

指令

syntax: geo [$address] $variable 

結果如下:

```shell

➜ test_nginx curl -h 'x-forwarded-for: 10.1.0.0,127.0.0.2' geo.ziyang.com

us➜ test_nginx curl -h 'x-forwarded-for: 10.1.0.0,127.0.0.1' geo.ziyang.com

ru➜ test_nginx curl -h 'x-forwarded-for: 10.1.0.0,127.0.0.1,1.2.3.4' geo.ziyang.com

zz

這裡可以看出來,匹配規則實際上是遵循最長匹配的規則的。

geoip 模組可以根據 ip 位址生成對應的位址變數,用法與前面的也都類似,nginx 是基於 maxmind 資料庫來生成對應的位址的。

模組:ngx_http_geoip_module,預設未編譯進 nginx,通過--with-http_geoip_module禁用

使用這個模組是需要安裝 maxmind 庫的,安裝步驟如下:

指令

syntax: geoip_country file; # 指定國家類的位址檔案

context: http

變數

指令

syntax: geoip_city file;

default: —

context: http

變數

$geoip_region:洲或者省的編碼,例如 02

$geoip_region_name:洲或者省的名稱,例如 zhejiang 或者 saint petersburg

$geoip_city:城市名

$geoip_postal_code:郵編號

$geoip_area_code:僅美國使用的郵編號,例如 408

$geoip_dma_code:僅美國使用的 dma 編號,例如 807

前面說的都是 nginx 的變數相關的內容,其實 nginx 還有乙個很具有特色的模組,那就是 keepalive 模組,由於內容不是很多,所以我就直接寫到這篇文章裡面了,單寫一篇顯得內容不夠哈。

這裡指的是 http 的 keepalive,tcp 也有 keepalive,後面會說。

而且是對客戶端的 keepalive,不是對上游伺服器的。

connection 頭部

keepalive 頭部:timeout=n,單位是秒,表示連線至少保持 n 秒

對客戶端行為控制的指令:

context: http, server, location

好了,關於 nginx 的模組介紹就已經全部介紹完了,有興趣的同學可以去翻我前面的系列文章。當然還有一部分重要的內容還沒有介紹,那就是關於 nginx 的反向**和負載均衡部分,這塊咱們單獨抽出來說,別著急,馬上乾貨就出來。

本文首發於我的個人部落格:iziyang.github.io,所有配置檔案我已經放在了 nginx 配置檔案,大家可以自取。

nginx模組使用自定義變數

在模組中,我們要使用乙個自定義的變數。1 首先,需要新增乙個變數 呼叫ngx http add variable函式來新增乙個變數,新增時指明變數的名稱和變數型別。name 即變數的名字 flags 如果同乙個變數要多次新增,則flags應該設定ngx http var changeable 否則,...

nginx自定義變數與內建預定義變數

nginx可以使用變數簡化配置與提高配置的靈活性,所有的變數值都可以通過這種方式引用 變數名而nginx中的變數分為兩種,自定義變數與內建預定義變數 宣告可以在sever,http,location等標籤中使用set命令 非唯一 宣告變數,語法如下 set 變數名 變數值注意nginx中的變數必須都...

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...