我們通常稱 Nginx 是一個(gè)反向代理服務(wù)器,那么到底什么是反向代理,什么是正向代理?
A 找 B 直接溝通,這就等于沒(méi)有什么代理;
然而中間夾一個(gè)傳話的 C,C 就是代理了,A 通過(guò) C 把信息傳遞給 B,然后 C 再把 B 的反饋轉(zhuǎn)達(dá)給 A。
在這個(gè)過(guò)程中,A 知道溝通的直接目標(biāo)是 B,只不過(guò)由于各種原因無(wú)法直接和 B 面對(duì)面,需要中間人 C,這就是所謂“正向代理”,其實(shí)我們很少說(shuō)正向代理,在英文原文里,這個(gè)叫 Forward Proxy,一般就直接叫代理,你翻譯成“轉(zhuǎn)交代理”或“傳達(dá)代理”都比“正向代理”強(qiáng),然而沒(méi)必要,因?yàn)榇磉@個(gè)詞的本意就是如此。
另外一種情況則是:A 并不知道 B 的存在,它只知道找 C 就可以得到想要的回復(fù),對(duì)于 A 來(lái)說(shuō)有沒(méi)有 B 或者有多少個(gè) B、D、E、F……都不重要,只要有 C 就夠了。而 C 則根據(jù)情況去獲取反饋然后響應(yīng)給 A。
這種就叫反向代理了。理解其中的區(qū)別不要從“正反”兩個(gè)反義方向詞上做文章,英文里的 Forward 和 Reverse 并不是一對(duì)反義詞,F(xiàn)orward 和 Backward 才是,然而 Reverse 和 Backward 并不是一個(gè)意思……所以說(shuō)技術(shù)書(shū)籍資料還就是得看原文的啊。
------
剛才有小伙伴問(wèn)了我一個(gè)問(wèn)題,因?yàn)樗€是對(duì)此有困惑,我給他舉個(gè)例子他明白了。我不知道我上面的答案是否能讓大家明白,所以我把這個(gè)例子也寫(xiě)出來(lái):
我想訪問(wèn) www.google.com,然而大家都知道它被墻了,我沒(méi)法直接訪問(wèn)它。于是我連接了一個(gè) VPN 服務(wù)并設(shè)定其為本地 HTTP 訪問(wèn)的代理(比如說(shuō)在 Mac 下勾選“通過(guò) VPN 連接發(fā)送所有流量),然后我再訪問(wèn) www.google.com,此時(shí)我的請(qǐng)求被該 VPN 服務(wù)代理了,它幫我訪問(wèn)了 www.google.com 然后把結(jié)果返回給我。
這個(gè)例子是代理的一種應(yīng)用場(chǎng)景,但并非代表代理只能用于這個(gè)
最重要的特征是我知道 www.google.com 的存在,而且我訪問(wèn)的網(wǎng)址也的確是 www.google.com,只不過(guò)我的訪問(wèn)請(qǐng)求經(jīng)由了 VPN 代理來(lái)轉(zhuǎn)交,同樣響應(yīng)也是如此
在本例中,代理是透明的,用戶有可能不知道它的存在(通常是知道的,只不過(guò)代理的設(shè)置可能不是他自己來(lái)做)
我有一個(gè) Nginx 服務(wù)部署在 www.mysite.com 的 80 端口,用戶訪問(wèn)它就可以看見(jiàn)我做的網(wǎng)站;在我的網(wǎng)站中有一些 Ajax 請(qǐng)求去獲取 JSON 數(shù)據(jù),然而提供這些數(shù)據(jù)的 API Service 部署在服務(wù)器上的 8000 端口,該端口由于防火墻的阻撓使得用戶無(wú)法直接訪問(wèn)到。
于是我重新配置了 Nginx,讓它把所有經(jīng)由 :80/api/ 的訪問(wèn)請(qǐng)求都代理給 localhost:8000,然后把響應(yīng)返回給原始的請(qǐng)求方(即:Origin Host),這就是反向代理?,F(xiàn)在我的用戶可以正常訪問(wèn) www.mysite.com 啦。
同上,這是反向代理的一種應(yīng)用場(chǎng)景,但并非代表它只能這樣用
最重要的特征是我的用戶壓根不知道 localhost:8000 這個(gè)服務(wù)的存在,并且即使知道也訪問(wèn)不到——開(kāi) VPN 也訪問(wèn)不到,這是倆碼事!
對(duì)于用戶來(lái)講,唯一的“對(duì)話”方只有 www.mysite.com(80 端口),他們不知道也不必知道后面發(fā)生了什么
反向代理意味著它背后的目標(biāo)是固定的
用戶訪問(wèn)到你的nginx等價(jià)于訪問(wèn)后面代理的web服務(wù)
正向代理是指它代理的目標(biāo)是不固定的
用戶通過(guò)代理服務(wù)器可以訪問(wèn)任意web服務(wù)
主要區(qū)別在于,到底是客戶端還是服務(wù)器做的代理。
如果是客戶端發(fā)送請(qǐng)求時(shí)使用的代理,就是正向代理;
而服務(wù)器端接收到客戶端的請(qǐng)求時(shí)使用代理轉(zhuǎn)移到其他服務(wù)器則是反向代理;
正向代理: 你需要主動(dòng)設(shè)置代理服務(wù)器ip或者域名進(jìn)行訪問(wèn)。由設(shè)置的服務(wù)器ip或者域名去獲取訪問(wèn)內(nèi)容并返回。
反向代理: 你不需要任何設(shè)置,直接訪問(wèn)服務(wù)器真實(shí)ip或者域名,但是服務(wù)器內(nèi)部會(huì)自動(dòng)根據(jù)訪問(wèn)內(nèi)容進(jìn)行跳轉(zhuǎn)及內(nèi)容返回,你不知道它最終訪問(wèn)的是哪些機(jī)器。
對(duì)于ABC例子,正向代理可以理解為:C作為A的代理人去找B,而反向代理中的C更像是B的代理人,去向A做反饋。
最簡(jiǎn)單來(lái)說(shuō)看你代理誰(shuí)??蛻舳说拇砭褪钦虼恚?wù)端的代理就是反向代理
電腦訪問(wèn)服務(wù)器,服務(wù)器不知電腦真實(shí)IP,則兩者間有一個(gè)正向代理。
電腦訪問(wèn)服務(wù)器,電腦不知服務(wù)器真實(shí)IP,則兩者間有一個(gè)反向代理。
當(dāng)然,現(xiàn)在很多正向代理也可以通過(guò)http head 傳遞電腦的真實(shí)IP
正向代理:你去吃 KFC 吃漢堡雞翅,這個(gè)漢堡雞翅經(jīng)過(guò)各層“代理”分中心從總部拿到,再分發(fā)到你手上。
反向代理:KFC 總部在給你漢堡雞翅時(shí),可能先分配不同地區(qū)的分中心然后再到門(mén)店,最后再到配送給你,但對(duì)于你來(lái)說(shuō),是透明的,無(wú)需知道是華東還是華北的分中心給你配送。
我們上網(wǎng)的時(shí)候,有時(shí)需要配置一個(gè)代理服務(wù)器(比如被墻),這個(gè)代理服務(wù)器是正向代理;開(kāi)發(fā)服務(wù)器系統(tǒng)的時(shí)候,將客戶端/瀏覽器發(fā)過(guò)來(lái)的請(qǐng)求代理分發(fā)到后臺(tái)多個(gè)真正的業(yè)務(wù)服務(wù)器,這個(gè)代理是反向代理。
可以認(rèn)為正向代理是客戶端的,反向代理是服務(wù)端的。