nginx map配置根據(jù)請(qǐng)求頭不同分配流量到不同后端服務(wù)

最近在做一個(gè)需求開(kāi)發(fā):根據(jù)請(qǐng)求后的不同,nginx將請(qǐng)求分發(fā)到不同的后端服務(wù)钧萍;需要修改kubernetes的ingress-nginx-controller的源碼给猾,調(diào)試的時(shí)候遇到了挺多問(wèn)題拗秘,寫(xiě)出來(lái)签舞,有需要的老鐵可以參考贷帮。具體方案就不說(shuō)了戚揭,只說(shuō)一下nginx配置這一塊。

首先貼出組件版本:
ingress-nginx-controller的版本為0.9-beta.18撵枢,可以在github上找到開(kāi)源的項(xiàng)目源碼:

nginx map配置根據(jù)請(qǐng)求頭不同分配流量到不同后端服務(wù)
nginx版本為:nginx version: nginx/1.13.7

map配置的一個(gè)報(bào)錯(cuò):

nginx.conf文件部分如下:

http {
    
    include /etc/nginx/conf.d/server-map.d/*-map.conf;
    include /etc/nginx/conf.d/*-upstream.conf;
    include /etc/nginx/conf.d/server-map.d/*-server.conf;

    ....

    map_hash_bucket_size 64;

    ....
}

在/etc/nginx/conf.d/server-map.d/目錄下的flow-ppp-map.conf:

map $http_x_group_env $svc_upstream {
    default zxl-test-splitflow-old-version;
    ~*old zxl-test-splitflow-old-version;
    ~*new zxl-test-splitflow-new-version;
}

flow-ppp-server.conf

server {
    listen 8998;
    server_name aa.hc.harmonycloud.cn;
    location /testdemo/test {
        proxy_pass http://$svc_upstream;
    }
}

ingressgroup-upstream.conf

upstream zxl-test-splitflow-old-version {
    server 10.168.173.29:8080 max_fails=0 fail_timeout=0;
}

upstream zxl-test-splitflow-new-version {
    server 10.168.177.171:8080 max_fails=0 fail_timeout=0;
}

當(dāng)nginx -tc /etc/nginx/nginx.conf測(cè)試配置正確與否時(shí)報(bào)錯(cuò)如下:

Error: exit status 1
nginx: [emerg] "map_hash_bucket_size" directive is duplicate in /etc/nginx/nginx.conf:60
nginx: configuration file c test failed
image.png

解決:

這是因?yàn)槭状握{(diào)用map時(shí)會(huì)隱式設(shè)置map_hash_bucket_size民晒,即在nginx中map后寫(xiě)map_hash_bucket_size相當(dāng)于設(shè)置了兩次map_hash_bucket_size,如:

http {
    ...
    map $status $_status {
        default 42;
    }
    map_hash_bucket_size 64;
    ...
}

因此可以在map之前設(shè)置它锄禽,如下所示潜必。

http {
    map_hash_bucket_size 64;
    ...
    map $status $_status {
        default 42;
    }
    ...
}

所以include map配置也應(yīng)該放到設(shè)置map_hash_bucket_size之后:

http {
    ...

    map_hash_bucket_size 64;

    ...
    
    include /etc/nginx/conf.d/server-map.d/*-map.conf;
    include /etc/nginx/conf.d/*-upstream.conf;
    include /etc/nginx/conf.d/server-map.d/*-server.conf;
}

map配置說(shuō)明:

通過(guò)上面的include三個(gè)配置文件,最終對(duì)nginx生效的配置應(yīng)該是這樣的:

http {
    ...

    map_hash_bucket_size 64;

    ...
    
    map $http_x_group_env $svc_upstream {
        default zxl-test-splitflow-old-version;
        ~*old zxl-test-splitflow-old-version;
        ~*new zxl-test-splitflow-new-version;
    }
    
    
    upstream zxl-test-splitflow-old-version {
        server 10.168.173.29:8080 max_fails=0 fail_timeout=0;
    }

    upstream zxl-test-splitflow-new-version {
        server 10.168.177.171:8080 max_fails=0 fail_timeout=0;
    }
    
    server {
        listen 8998;
        server_name aa.hc.harmonycloud.cn;
        location /testdemo/test {
            proxy_pass http://$svc_upstream;
        }
    }
}

當(dāng)在電腦上hosts文件里配置了aa.hc.harmonycloud.cn域名解析后沃但,訪問(wèn)http://aa.hc.harmonycloud.cn:8998/testdemo/test時(shí)(即server的server_name和listen磁滚、location的配置),nginx將會(huì)把請(qǐng)求轉(zhuǎn)發(fā)到http://$svc_upstream宵晚,這個(gè)$svc_upstream具體是什么垂攘,就是通過(guò)map配置來(lái)賦值的。這里map配置如下:

map $http_x_group_env $svc_upstream {
        default zxl-test-splitflow-old-version;
        ~*old zxl-test-splitflow-old-version;
        ~*new zxl-test-splitflow-new-version;
}

其中$http_x_group_env可以是nginx內(nèi)置變量淤刃,也可以是自定義的header的key晒他、請(qǐng)求參數(shù)名;$svc_upstream即為自定義變量名钝凶。這里的配置含義為:當(dāng)請(qǐng)求頭里的x-group-env的值old時(shí),$svc_upstream被賦值為zxl-test-splitflow-old-version唁影;當(dāng)請(qǐng)求頭里的x-group-env的值new時(shí)耕陷,$svc_upstream被賦值為zxl-test-splitflow-new-version;默認(rèn)賦值為zxl-test-splitflow-old-version据沈;
(其中正則表達(dá)式如果以 “~” 開(kāi)頭哟沫,表示這個(gè)正則表達(dá)式對(duì)大小寫(xiě)敏感。以 “~*”開(kāi)頭锌介,表示這個(gè)正則表達(dá)式對(duì)大小寫(xiě)不敏感)嗜诀。而zxl-test-splitflow-new-version和zxl-test-splitflow-old-version表示兩個(gè)upstream名稱猾警。

因此nginx將會(huì)把請(qǐng)求轉(zhuǎn)發(fā)到http://$svc_upstream,這里的$svc_upstream會(huì)被替換為upstream的名稱隆敢,最終將得到upstream中的后端服務(wù)IP和Port发皿。

注意:如果我們自定義header為X-Real-IP,通過(guò)第二個(gè)nginx獲取該header時(shí)需要這樣:$http_x_real_ip; (一律采用小寫(xiě),而且前面多了個(gè)http_拂蝎,且中間用_替換)

測(cè)試

當(dāng)請(qǐng)求頭里加x-group-env為new時(shí)穴墅,訪問(wèn)后端打印出的是I am new version


image.png

當(dāng)請(qǐng)求頭里加x-group-env為old時(shí),訪問(wèn)后端打印出的是I am old version


image.png

最終通過(guò)請(qǐng)求頭不同實(shí)現(xiàn)了將流量分配到不同的后端服務(wù)温自。

將請(qǐng)求頭的key變?yōu)閄-Group-Env玄货,value變?yōu)镺LD或者NEW也沒(méi)關(guān)系:


old
new
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悼泌,隨后出現(xiàn)的幾起案子松捉,更是在濱河造成了極大的恐慌,老刑警劉巖馆里,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘世,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡也拜,警方通過(guò)查閱死者的電腦和手機(jī)以舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慢哈,“玉大人蔓钟,你說(shuō)我怎么就攤上這事÷鸭” “怎么了滥沫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)键俱。 經(jīng)常有香客問(wèn)我兰绣,道長(zhǎng),這世上最難降的妖魔是什么编振? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任缀辩,我火速辦了婚禮,結(jié)果婚禮上踪央,老公的妹妹穿的比我還像新娘臀玄。我一直安慰自己,他們只是感情好畅蹂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布健无。 她就那樣靜靜地躺著,像睡著了一般液斜。 火紅的嫁衣襯著肌膚如雪累贤。 梳的紋絲不亂的頭發(fā)上叠穆,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音臼膏,去河邊找鬼硼被。 笑死,一個(gè)胖子當(dāng)著我的面吹牛讶请,可吹牛的內(nèi)容都是我干的祷嘶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夺溢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼论巍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起风响,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘉汰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后状勤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鞋怀,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年持搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了密似。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葫盼,死狀恐怖残腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贫导,我是刑警寧澤抛猫,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站孩灯,受9級(jí)特大地震影響闺金,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峰档,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一败匹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讥巡,春花似錦掀亩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尸红。三九已至吱涉,卻和暖如春刹泄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怎爵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工特石, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳖链。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓姆蘸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芙委。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逞敷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容