map指令簡單介紹
當然這里寫的都是官方文檔是已經(jīng)寫過的,我簡單抄一下哈。
map指令來自于ngx_http_map_module模塊,提供的核心能力是 基于一個變量創(chuàng)建一個新變量,大概是這意思。
語法: 只能配置在http塊內(nèi) map string $variable {...}
直接看這個語法好像看不出來它能干什么,所以官方文檔上給了幾個例子:
map $http_host $name { hostnames; default 0; example.com 1; *.example.com 1; example.org 2; *.example.org 2; .example.net 3; wap.* 4; }
解析一下上面這個例子的意思:
map: 關(guān)鍵字,開辟一段內(nèi)存空間聲明一個map $http_host: 獲取host請求頭:eg: www.baidu.com $name: 新變量,具體取值是什么取決于結(jié)構(gòu)體內(nèi)的映射關(guān)系 結(jié)構(gòu)體內(nèi)的數(shù)據(jù)解析: hostnames: - 官方文檔給出的解釋是:允許用前綴或者后綴掩碼指定域名作為源變量值。這個參數(shù)必須寫在值映射列表的最前面。 讀都能讀的懂,字也都認識,但是怎么感覺好像還是不太懂呢,又沒有同感?于是我測試了一下,其實就是你想用下面那種泛域名來匹配host的話就加一下這個參數(shù), 否則是達不到預(yù)期效果的。 default 0; :匹配不到符合條件的數(shù)據(jù)時 則$name 這個變量就取默認值 0
知道了這之后我能用它來做什么呢?看實際應(yīng)用的例子
map指令的實踐使用
1. 基于cookie做多環(huán)境分流
一般中大型公司都會有多套測試環(huán)境,對于多環(huán)境的訪問可能最容易想到的就是對應(yīng)多個域名,這方法當然可以,但是不優(yōu)雅,維護多個域名太累。為了偷懶,我們用了一個域名,使用不同的cookie來轉(zhuǎn)發(fā)相應(yīng)的流量到相應(yīng)的環(huán)境。
如何實現(xiàn)?
map $cookie_cl_env_num $cl_backend_map { default 1.1.1.1:80; dev-01 upstream_dev-01; dev-02 upstream_dev-02; dev-03 upstream_dev-03; test-01 upstream_test-01; test-02 upstream_test-02; test-03 upstream_test-03; test-04 upstream_test-04; test-05 upstream_test-05; test-06 upstream_test-06; test-07 upstream_test-07; test-08 upstream_test-08; test-09 upstream_test-09; test-10 upstream_test-10; test-11 upstream_test-11; test-12 upstream_test-12; test-13 upstream_test-13; test-14 upstream_test-14; test-15 upstream_test-15; } # 隨便寫一個 upstream upstream_test-14 { server 2.2.2.2:80; } # 局部實現(xiàn)寫一下 location / { pass_pass http://$cl_backend_map; } # 請求 curl --cookie "cl_env_num=test-15" a.test.com/api/v1/hahaha
這不就實現(xiàn)了嘛,很方便哈。僅提供思路!當然也可以使用其他變量來分流 UA|args ...
2. 做安全的多域名跨域訪問
跨域訪問一般情況下我們都會直接設(shè)置 * 允許所有跨域訪問。但是難免會有一些對安全性要求較高的業(yè)務(wù)不允許這樣,那么對于域名比較多的安全跨域配置,也可以使用map來實現(xiàn)。
map $http_origin $allow_origin { ~http://www.baidu.com http://www.baidu.com; ~http://m.baidu.com http://m.baidu.com; ~http://a.baidu.com http://a.baidu.com; default deny; } server { listen 80; server_name www.baidu.com; location / { ... add_header Access-Control-Allow-Origin $allow_origin; ... } }
僅提供思路哈,具體情況可以再優(yōu)化
總結(jié)
當然還有很多場景都可以用到, 無法一一列舉, 自己能夠根據(jù)需求和場景靈活運用是最好的。
鏈接:https://www.cnblogs.com/chaizhenhua/p/16247460.html
-
模塊
+關(guān)注
關(guān)注
7文章
2788瀏覽量
50342 -
指令
+關(guān)注
關(guān)注
1文章
616瀏覽量
36441
原文標題:Nginx的map指令還能這樣用
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
簡單介紹ARM的指令集
介紹編譯器生成的map和htm文件
總線的簡單介紹
介紹一些MOV與ADD指令的簡單例子
制作一個簡單的AT指令
基于MAP的嵌入式MP3播放器設(shè)計與實現(xiàn)
Map Service Engine Based On We
mapreduce 中MAP進程的數(shù)量怎么控制?

mapreduce設(shè)置map個數(shù)_mapreduce設(shè)置map內(nèi)存

Java Map的幾種循環(huán)方式學(xué)習總結(jié)
ESP8266和單片機最簡單的AT指令的使用程序免費下載

評論