Nginx服務(wù)器中map模塊怎么配置與使用

map指令使用ngx_http_map_module模塊提供的。默認情況下,nginx有加載這個模塊,除非人為的 –without-http_map_module。
ngx_http_map_module模塊可以創(chuàng)建變量,這些變量的值與另外的變量值相關(guān)聯(lián)。允許分類或者同時映射多個值到多個不同值并儲存到一個變量中,map指令用來創(chuàng)建變量,但是僅在變量被接受的時候執(zhí)行視圖映射操作,對于處理沒有引用變量的請求時,這個模塊并沒有性能上的缺失。
一. ngx_http_map_module模塊指令說明
map
語法: map $var1 $var2 { … }
默認值: —
配置段: http
map為一個變量設(shè)置的映射表。映射表由兩列組成,匹配模式和對應(yīng)的值。
在 map 塊里的參數(shù)指定了源變量值和結(jié)果值的對應(yīng)關(guān)系。
匹配模式可以是一個簡單的字符串或者正則表達式,使用正則表達式要用(‘~’)。
一個正則表達式如果以 “~” 開頭,表示這個正則表達式對大小寫敏感。以 “~*”開頭,表示這個正則表達式對大小寫不敏感。

map?$http_user_agent?$agent?{ ????default?""; ????~curl?curl; ????~*apachebench"?ab; }

正則表達式里可以包含命名捕獲和位置捕獲,這些變量可以跟結(jié)果變量一起被其它指令使用。

map?$uri?$value?{ ??/ttlsa_com??????????/index.php; ??~^/ttlsa_com/(?<suffix>.*)$?/boy/; ??~/fz(/.*)??????????/index.php?;?????????????? }</suffix>

在 map 塊內(nèi)部,無法使用命名捕獲或位置捕獲變量。如~^/ttlsa_com/(.*)? /boy/$1; 這樣會報錯nginx: [emerg] unknown? variable。如果源變量值包含特殊字符,例如”~”,則需要使用轉(zhuǎn)義字符””來轉(zhuǎn)義。

map?$http_referer?$value?{ ??mozilla??111; ??~mozilla?222; }

結(jié)果變量可以是一個字符串也可以是另外一個變量。

map?$num?$limit?{ ?????1?$binary_remote_addr; ?????0?""; }

map指令有三個參數(shù):
default : 指定如果沒有匹配結(jié)果將使用的默認值。當沒有設(shè)置 default,將會用一個空的字符串作為默認的結(jié)果。
hostnames : 允許用前綴或者后綴掩碼指定域名作為源變量值。這個參數(shù)必須寫在值映射列表的最前面。
include : 包含一個或多個含有映射值的文件。
如果匹配到多個特定的變量,如掩碼和正則同時匹配,那么會按照下面的順序進行選擇:
1. 沒有掩碼的字符串
2. 最長的帶前綴的字符串,例如: “*.example.com”
3. 最長的帶后綴的字符串,例如:“mail.*”
4. 按順序第一個先匹配的正則表達式 (在配置文件中體現(xiàn)的順序)
5. 默認值
map_hash_bucket_size
語法: map_hash_bucket_size size;
默認值: map_hash_bucket_size 32|64|128;
配置段: http
指定一個映射表中的變量在哈希表中的最大值,這個值取決于處理器的緩存。
map_hash_max_size
語法: map_hash_max_size size;
默認值: map_hash_max_size 2048;
配置段: http
設(shè)置映射表對應(yīng)的哈希表的最大值。
二. 實例

http?{ ?map?$http_user_agent?$agent?{ ?~curl?curl; ?~*chrome?chrome; ?} ?server?{ ????listen????8080; ????server_name?test.ttlsa.com; ? ????location?/hello?{ ?default_type?text/plain; ?echo?http_user_agent:?$http_user_agent; ?echo?agent:?agent:$agent; ?} ?} }
#?curl?127.0.0.1:8080/hello
http_user_agent:?curl/7.15.5?(x86_64-redhat-linux-gnu)?libcurl/7.15.5?openssl/0.9.8b?zlib/1.2.3?libidn/0.6.5 agent:?curl

Nginx服務(wù)器中map模塊怎么配置與使用

Nginx服務(wù)器中map模塊怎么配置與使用

http?{ ?map?$uri?$match?{ ????~^/hello/(.*)?http://www.ttlsa.com/; ?} ?server?{ ????listen????8080; ????server_name?test.ttlsa.com; ? ????location?/hello?{ ????????default_type?text/plain; ????????echo?uri:?$uri; ????????echo?match:?$match; ????????echo?capture:?$1; ????????echo?new:?$match$1; ????} ?} }

Nginx服務(wù)器中map模塊怎么配置與使用

ps:基于map指令和geo指令的限速白名單配置

http?{ ?geo?$whiteiplist?{ ?default?1; ?127.0.0.1?0; ?10.0.0.0/8?0; ?121.207.242.0/24?0; ?} ? ?map?$whiteiplist?$limit?{ ?1?$binary_remote_addr; ?0?""; ?} ? ?limit_conn_zone?$limit?zone=limit:10m; ? ?server?{ ????listen????8080; ????server_name?test.ttlsa.com; ? ????location?^~?/ttlsa.com/?{ ????????limit_conn?limit?4; ????????limit_rate?200k; ????????alias?/data/www.ttlsa.com/data/download/; ????} ?} }

技術(shù)要點:
1. geo指令定義一個白名單$whiteiplist, 默認值為1, 所有都受限制。 如果客戶端ip與白名單列出的ip相匹配,則$whiteiplist值為0也就是不受限制。
2. map指令是將$whiteiplist值為1的,也就是受限制的ip,映射為客戶端ip。將$whiteiplist值為0的,也就是白名單ip,映射為空的字符串。
3. limit_conn_zone和limit_req_zone指令對于鍵為空值的將會被忽略,從而實現(xiàn)對于列出來的ip不做限制。
測試方法:

#?ab?-c?100?-n?300?http://test.ttlsa.com:8080/ttlsa.com/docs/pdf/nginx_guide.pdf

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享