1. 理解什么是反向代理
關(guān)于反向代理的概念可以參考上一篇文章《Nginx系列9:nginx正反向代理概念與配置》脊阴。
1.1 理解proxy_pass指令
該指令是用來設(shè)置代理服務(wù)器的地址,可以是主機(jī)名稱蚯瞧,IP地址加端口號(hào)等形式嘿期。語法結(jié)構(gòu):
proxy_pass: URL;
因此我們經(jīng)常會(huì)看到如下nginx上的配置:如下代碼:
server {
listen 80;
server_name xy.xxx.com; // 接口的域名
location / {
proxy_pass http://192.168.1.212:8136;
include nginx_proxy.conf;
}
}
如上代碼的含義是:監(jiān)聽80端口號(hào),然后我們定義的接口的域名為 xy.xxx.com埋合, 然后當(dāng)我們?cè)L問 http://xy.xxx.com/xxxx這樣的接口的時(shí)候备徐,它會(huì)通過 location / {} 這樣的反向代理到 http://192.168.1.212:8136上來。
當(dāng)然如果代理服務(wù)器是一組服務(wù)器的話饥悴,我們可以使用upstream指令配置后端服務(wù)器組坦喘。如下代碼:
upstream proxy_xxx {
server http://192.168.1.211:8136/xxx;
server http://192.168.1.212:8136/xxx;
server http://192.168.1.213:8136/xxx;
}
server {
listen 80;
server_name xy.xxx.com; // 接口的域名
location / {
proxy_pass proxy_xxx; // 使用服務(wù)器組proxy_xxx
}
...
}
但是在上面配置各個(gè)服務(wù)器中都指明了傳輸協(xié)議為 http://
, 但是如果上面的接口沒有指明協(xié)議的話,像這樣:
upstream proxy_xxx {
server 192.168.1.211:8136/xxx;
server 192.168.1.212:8136/xxx;
server 192.168.1.213:8136/xxx;
}
那么我們需要在 proxy_pass上加上http://
:
proxy_pass http://proxy_xxx;
1.2 注意proxy_pass的URI
在使用proxy_pass指令時(shí)還要注意西设,URL中是否包含URI瓣铣,Nginx服務(wù)器的處理方式是不同的。如果URL中不包含URI贷揽,Nginx服務(wù)器不會(huì)改變?cè)瓉淼刂返腢RI棠笑;但如果包含了URI,Nginx服務(wù)器將會(huì)使用新的URI替代原來的URI禽绪。
- 不含有URI的情況蓖救,請(qǐng)看下面的Nginx配置片段:
server {
listen 80;
server_name www.myweb.com; // 接口的域名
location /server/ {
proxy_pass http://192.168.1.1;
}
...
}
根據(jù)上面的配置洪规,如果請(qǐng)求http://www.myweb.com/server
,由于proxy_pass指令的URL不含有URI循捺,所以轉(zhuǎn)向地址http://192.168.1.1/server
斩例。
- 包含URI的情況,看下面的Nginx配置片段:
server {
listen 80;
server_name www.myweb.com; // 接口的域名
location /server/ {
proxy_pass http://192.168.1.1/loc/;
}
...
}
在上面配置中从橘,proxy_pass指令的URL包含了URI/loc/
念赶,如果客戶端仍然使用http://www.myweb.com/server/
發(fā)起請(qǐng)求,Nginx服務(wù)器將轉(zhuǎn)向地址http://192.168.1.1/loc/
恰力。
通過上面的實(shí)例叉谜,可以看出,在使用proxy_pass指令時(shí)踩萎,如果不想改變?cè)刂分械腢RI停局,就不要在URL變量中配置URI。
1.3 proxy_pass指令的URL末尾是否加斜杠/
的問題
理解了上面的proxy_pass指令中URL結(jié)尾是否含有URI的兩種情況香府,關(guān)于/
的使用也就很好理解了董栽。
- url帶斜杠:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
訪問地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/test.html
- url末尾不帶斜杠:
location /proxy/ {
proxy_pass http://127.0.0.1;
}
訪問地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/proxy/test.html
- url末尾帶有uri+
/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
訪問地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/aaa/test.html
- url末尾帶有uri但不帶
/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
訪問地址http://server/proxy/test.html
代理到URL:http://127.0.0.1/aaatest.html