詳解Nginx服務(wù)器中map模塊的配置與使用
map指令使用ngx_http_map_module模塊提供的。默認(rèn)情況下,nginx有加載這個(gè)模塊,除非人為的 --without-http_map_module。
ngx_http_map_module模塊可以創(chuàng)建變量,這些變量的值與另外的變量值相關(guān)聯(lián)。允許分類或者同時(shí)映射多個(gè)值到多個(gè)不同值并儲(chǔ)存到一個(gè)變量中,map指令用來創(chuàng)建變量,但是僅在變量被接受的時(shí)候執(zhí)行視圖映射操作,對(duì)于處理沒有引用變量的請(qǐng)求時(shí),這個(gè)模塊并沒有性能上的缺失。
一. ngx_http_map_module模塊指令說明
map
語法: map $var1 $var2 { ... }
默認(rèn)值: —
配置段: http
map為一個(gè)變量設(shè)置的映射表。映射表由兩列組成,匹配模式和對(duì)應(yīng)的值。
在 map 塊里的參數(shù)指定了源變量值和結(jié)果值的對(duì)應(yīng)關(guān)系。
匹配模式可以是一個(gè)簡(jiǎn)單的字符串或者正則表達(dá)式,使用正則表達(dá)式要用('~')。
一個(gè)正則表達(dá)式如果以 “~” 開頭,表示這個(gè)正則表達(dá)式對(duì)大小寫敏感。以 “~*”開頭,表示這個(gè)正則表達(dá)式對(duì)大小寫不敏感。
map $http_user_agent $agent {
default "";
~curl curl;
~*apachebench" ab;
}
正則表達(dá)式里可以包含命名捕獲和位置捕獲,這些變量可以跟結(jié)果變量一起被其它指令使用。
map $uri $value {
/ttlsa_com /index.php;
~^/ttlsa_com/(?<suffix>.*)$ /boy/;
~/fz(/.*) /index.php?;
}
[warning]不能在map塊里面引用命名捕獲或位置捕獲變量。如~^/ttlsa_com/(.*) /boy/$1; 這樣會(huì)報(bào)錯(cuò)nginx: [emerg] unknown variable。[/warning]如果源變量值包含特殊字符如‘~',則要以‘\'來轉(zhuǎn)義。
map $http_referer $value {
Mozilla 111;
\~Mozilla 222;
}
結(jié)果變量可以是一個(gè)字符串也可以是另外一個(gè)變量。
map $num $limit {
1 $binary_remote_addr;
0 "";
}
map指令有三個(gè)參數(shù):
default : 指定如果沒有匹配結(jié)果將使用的默認(rèn)值。當(dāng)沒有設(shè)置 default,將會(huì)用一個(gè)空的字符串作為默認(rèn)的結(jié)果。
hostnames : 允許用前綴或者后綴掩碼指定域名作為源變量值。這個(gè)參數(shù)必須寫在值映射列表的最前面。
include : 包含一個(gè)或多個(gè)含有映射值的文件。
如果匹配到多個(gè)特定的變量,如掩碼和正則同時(shí)匹配,那么會(huì)按照下面的順序進(jìn)行選擇:
1. 沒有掩碼的字符串
2. 最長(zhǎng)的帶前綴的字符串,例如: “*.example.com”
3. 最長(zhǎng)的帶后綴的字符串,例如:“mail.*”
4. 按順序第一個(gè)先匹配的正則表達(dá)式 (在配置文件中體現(xiàn)的順序)
5. 默認(rèn)值
map_hash_bucket_size
語法: map_hash_bucket_size size;
默認(rèn)值: map_hash_bucket_size 32|64|128;
配置段: http
指定一個(gè)映射表中的變量在哈希表中的最大值,這個(gè)值取決于處理器的緩存。
map_hash_max_size
語法: map_hash_max_size size;
默認(rèn)值: map_hash_max_size 2048;
配置段: http
設(shè)置映射表對(duì)應(yīng)的哈希表的最大值。
二. 實(shí)例
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


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;
}
}
}

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ù)要點(diǎn):
1. geo指令定義一個(gè)白名單$whiteiplist, 默認(rèn)值為1, 所有都受限制。 如果客戶端IP與白名單列出的IP相匹配,則$whiteiplist值為0也就是不受限制。
2. map指令是將$whiteiplist值為1的,也就是受限制的IP,映射為客戶端IP。將$whiteiplist值為0的,也就是白名單IP,映射為空的字符串。
3. limit_conn_zone和limit_req_zone指令對(duì)于鍵為空值的將會(huì)被忽略,從而實(shí)現(xiàn)對(duì)于列出來的IP不做限制。
測(cè)試方法:
# ab -c 100 -n 300 http://test.ttlsa.com:8080/ttlsa.com/docs/pdf/nginx_guide.pdf
相關(guān)文章
nginx實(shí)現(xiàn)單主機(jī)多域名映射的項(xiàng)目實(shí)踐
本文主要介紹了nginx實(shí)現(xiàn)單主機(jī)多域名映射的項(xiàng)目實(shí)踐,配置不同的子域名映射到不同的內(nèi)部服務(wù)端口,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過程
今天通過本文給大家分享Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過程,在這小編提示大家在安裝nginx時(shí)需要先安裝nginx-full,具體安裝方法跟隨小編一起通過本文學(xué)習(xí)下吧2021-05-05
nginx?反向代理負(fù)載均衡策略配置SSL訪問匹配規(guī)則優(yōu)先級(jí)
本文主要包含1.Nginx配置文件詳解2.Nginx實(shí)現(xiàn)負(fù)載均衡3.Nginx前端項(xiàng)目部署4.Nginx配置SSL訪問5.nginx匹配規(guī)則說明以及匹配的優(yōu)先級(jí)的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
nginx部署https網(wǎng)站的實(shí)現(xiàn)步驟(親測(cè))
本文詳細(xì)介紹了使用Nginx在保持與http服務(wù)兼容的情況下部署HTTPS,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
nginx 部署 vue 項(xiàng)目找不到j(luò)s css文件的解決方法
這篇文章主要介紹了nginx 部署 vue 項(xiàng)目找不到j(luò)s css文件的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
強(qiáng)大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉庫)
OpenResty 是?個(gè)強(qiáng)大的 Web 應(yīng)?服務(wù)器,Web 開發(fā)?員可以使用 Lua 腳本語?調(diào)動(dòng) Nginx ?持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以快速構(gòu)造出足以勝任 10K 以上并發(fā)連接響應(yīng)的超高性能 Web 應(yīng)用系統(tǒng)2023-06-06
Nginx + Tomcat實(shí)現(xiàn)請(qǐng)求動(dòng)態(tài)數(shù)據(jù)和請(qǐng)求靜態(tài)資源的分離詳解
這篇文章主要給大家介紹了關(guān)于Nginx + Tomcat實(shí)現(xiàn)請(qǐng)求動(dòng)態(tài)數(shù)據(jù)和請(qǐng)求靜態(tài)資源的分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

