NGINX基于cookie針對(duì)同一域名進(jìn)行分流轉(zhuǎn)發(fā)
最新了解到的姿勢(shì),結(jié)合著新接觸 Mac 電腦,第一次做實(shí)驗(yàn),學(xué)習(xí)之后,特別記錄一下。
1,說(shuō)明
很多時(shí)候,測(cè)試環(huán)境可能會(huì)有好多套環(huán)境,這個(gè)時(shí)候,如果每套都配置一個(gè)對(duì)應(yīng)的域名,會(huì)非常麻煩,但是很多時(shí)候針對(duì)這個(gè)問(wèn)題似乎又沒(méi)有特別好的方案,新公司新氣象,學(xué)到新的思路是在 NGINX 層面基于 cookie 來(lái)進(jìn)行不同環(huán)境的分流轉(zhuǎn)發(fā),今天就來(lái)做一下這個(gè)實(shí)驗(yàn)。
2,環(huán)境準(zhǔn)備
因?yàn)樵谛颅h(huán)境,還沒(méi)有個(gè)人自用的測(cè)試服務(wù)器,Mac 當(dāng)中做實(shí)驗(yàn)又不習(xí)慣,于是只能通過(guò) docker 來(lái)進(jìn)行了。
所以需要先安裝 docker 環(huán)境,這個(gè)就不在這里贅述了。
那么,docker 環(huán)境準(zhǔn)備完畢之后,就可以開(kāi)始實(shí)驗(yàn)了,所謂,docker 在手,天下我有。
3,思路說(shuō)明
首先跑兩個(gè) NGINX 的容器,訪問(wèn)之后會(huì)返回不同的結(jié)果,然后前端再添加一層 NGINX,代理所有的外部請(qǐng)求,根據(jù) cookie 的不同,分發(fā)到不同的后端容器去。
4,開(kāi)始操作
1,先啟兩個(gè)后端容器
準(zhǔn)備工作:
$ mkdir -p /Users/liqilong/docker/nginx $ cd /Users/liqilong/docker/nginx $ mkdir test1 test2 $ echo test1 > test1/index.html $ echo test2 > test2/index.html
啟動(dòng)容器:
$ docker pull daocloud.io/library/nginx:1.15.9-alpine-perl $ docker run --name test1 -v /Users/liqilong/docker/nginx/test1:/usr/share/nginx/html:ro -d -p 8080:80 daocloud.io/library/nginx:1.15.9-alpine-perl $ docker run --name test2 -v /Users/liqilong/docker/nginx/test2:/usr/share/nginx/html:ro -d -p 8081:80 daocloud.io/library/nginx:1.15.9-alpine-perl
訪問(wèn)驗(yàn)證:
$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 18:65:90:cc:52:a5
inet6 fe80::1cf4:9734:2fa8:8234%en0 prefixlen 64 secured scopeid 0x5
inet 172.16.29.170 netmask 0xfffffc00 broadcast 172.16.31.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
$ curl 172.16.29.170:8080
test1
$ curl 172.16.29.170:8081
test2
2,再啟動(dòng)一個(gè)前端 NGINX
因?yàn)橐鲆恍┫鄬?duì)的配置工作,我這里就用了自己配置的 centos 鏡像來(lái)做了,事實(shí)上仍舊可以利用剛剛那個(gè) NGINX 鏡像來(lái)做接下來(lái)的實(shí)驗(yàn)。
$ docker pull registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.4 $ docker run -itd --name eryajf registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.4
接下來(lái)的操作就是進(jìn)入此容器內(nèi)部進(jìn)行了。
$ docker exec -it eryajf sh sh-4.2# yum localinstall http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm sh-4.2# yum -y install nginx
添加如下 NGINX 配置:
cat >> /etc/nginx/conf.d/test.conf << EOF
upstream test01 { #此處可以單獨(dú)寫(xiě),也可以寫(xiě)在下邊map的內(nèi)容中
server 172.16.29.170:8080 weight=1 max_fails=1 fail_timeout=30s;
}
upstream test02 {
server 172.16.29.170:8081 weight=1 max_fails=1 fail_timeout=30s;
}
upstream root {
server 172.16.29.170:8080 weight=1 max_fails=1 fail_timeout=30s;
}
map $COOKIE_testenv $group { #$COOKIE_testenv的前半部分$COOKIE_是固定格式,后邊的testenv則是cookie的key,$group是別名
test1 test01; #表示cookie的value=test1,則轉(zhuǎn)發(fā)給test1
test2 test02;
default root;
}
server {
listen 81;
server_name localhost;
access_log logs/access_log;
error_log logs/error_log;
location / {
proxy_pass http://$group$request_uri; #注意此處url的拼接
proxy_set_header X-Forwarded-For $remote_addr;
}
}
EOF
然后啟動(dòng) NGINX:
nginx -t nginx
3,訪問(wèn)測(cè)試
這個(gè)時(shí)候可以通過(guò)命令行來(lái)模擬請(qǐng)求,然后查看效果。
sh-4.2# curl localhost:81 test1 sh-4.2# curl localhost:81 --cookie "testenv=test1" test1 sh-4.2# curl localhost:81 --cookie "testenv=test2" test2
此處只要是有一個(gè) cookie 名稱與內(nèi)容是符合 nginx 定義的規(guī)則的,那么如上規(guī)則就是成立的。
sh-4.2# curl localhost:81 --cookie "testenv=test1;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=test2;user=root;pass=123" test2
5,其他方面
另外除了上邊的比較固定的方式之外,還有比較靈活的控制方案,主要集中在 url 的匹配上。
1,匹配結(jié)尾關(guān)鍵字
需求就是匹配到 cookie 的指定結(jié)尾進(jìn)行分流轉(zhuǎn)發(fā)。NGINX 配置如下:
map $COOKIE_testenv $group {
~*1$ 172.16.29.170:8080;
~*2$ 172.16.29.170:8081;
default 172.16.29.170:8080;
}
server {
listen 81;
server_name localhost;
access_log logs/access_log;
error_log logs/error_log;
location / {
proxy_pass http://$group$request_uri;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
然后重新加載 NGINX 配置,請(qǐng)求一下驗(yàn)證效果:
sh-4.2# curl localhost:81 --cookie "testenv=dfhg;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=dfhg1;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=dfhg2;user=root;pass=123" test2
2,匹配開(kāi)頭關(guān)鍵字
與上邊的道理是一致的,只不過(guò)配置內(nèi)容更改一下即可。
map $COOKIE_testenv $group {
~*^1 172.16.29.170:8080;
~*^2 172.16.29.170:8081;
default 172.16.29.170:8080;
}
server {
listen 81;
server_name localhost;
access_log logs/access_log;
error_log logs/error_log;
location / {
proxy_pass http://$group$request_uri;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
然后請(qǐng)求一下,驗(yàn)證一下效果:
sh-4.2# curl localhost:81 --cookie "testenv=dfhg;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=1dfhg;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=2dfhg;user=root;pass=123" test2
3,匹配包含關(guān)鍵字
還有一種比較靈活的策略,就是只要包含指定的關(guān)鍵字標(biāo)識(shí),就往不同的后端進(jìn)行分流轉(zhuǎn)發(fā),配置如下:
map $COOKIE_testenv $group {
~*.*eryajf1.* 172.16.29.170:8080;
~*.*eryajf2.* 172.16.29.170:8081;
default 172.16.29.170:8080;
}
server {
listen 81;
server_name localhost;
access_log logs/access_log;
error_log logs/error_log;
location / {
proxy_pass http://$group$request_uri;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
然后請(qǐng)求一下,驗(yàn)證一下效果:
sh-4.2# curl localhost:81 --cookie "testenv=A3fklj;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=A3fkeryajf1lj;user=root;pass=123" test1 sh-4.2# curl localhost:81 --cookie "testenv=A3fkeryajf2lj;user=root;pass=123" test2
到此這篇關(guān)于NGINX基于cookie針對(duì)同一域名進(jìn)行分流轉(zhuǎn)發(fā)的文章就介紹到這了,更多相關(guān)nginx cookie分流轉(zhuǎn)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS 7.3.1611編譯安裝Nginx1.10.3+MySQL5.7.16+PHP7.1.2
這篇文章主要介紹了CentOS 7.3.1611編譯安裝Nginx1.10.3+MySQL5.7.16+PHP7.1.2,需要的朋友可以參考下2018-01-01
nginx請(qǐng)求時(shí)找路徑問(wèn)題解決
當(dāng)你安裝了nginx的時(shí)候,為nginx配置了如下的location,想要去訪問(wèn)路徑下面的內(nèi)容,可是總是出現(xiàn)404,找不到文件,這是什么原因呢,今天我們就來(lái)解決這個(gè)問(wèn)題,感興趣的朋友一起看看吧2023-10-10
使用LDAP實(shí)現(xiàn)Nginx用戶認(rèn)證的示例
本文主要使用Nginx和LDAP實(shí)現(xiàn)用戶認(rèn)證,通過(guò)配置Nginx和安裝nginx-auth-ldap模塊,可以實(shí)現(xiàn)基于LDAP的認(rèn)證邏輯,下面就來(lái)介紹一下,感興趣的可以了解一下2024-12-12
詳解Nginx 出現(xiàn) 403 Forbidden 的解決辦法
本篇文章主要介紹了詳解Nginx 出現(xiàn) 403 Forbidden 的解決辦法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
寶塔使用Nginx?Proxy?Manager申請(qǐng)SSL的實(shí)現(xiàn)
本文主要介紹了寶塔使用Nginx?Proxy?Manager申請(qǐng)SSL,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
如何利用map實(shí)現(xiàn)Nginx允許多個(gè)域名跨域
這篇文章主要給大家介紹了關(guān)于如何利用map實(shí)現(xiàn)Nginx允許多個(gè)域名跨域的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
使用Nginx實(shí)現(xiàn)端口轉(zhuǎn)發(fā)TCP代理的實(shí)現(xiàn)示例
本文主要介紹了使用Nginx實(shí)現(xiàn)端口轉(zhuǎn)發(fā)TCP代理的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Nginx 訪問(wèn) /root/下 403 Forbidden問(wèn)題解決
在使用Nginx作為Web服務(wù)器時(shí),可能會(huì)遇到403 Forbidden錯(cuò)誤,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05

