我們通常稱 Nginx 是一個反向代理伺服器,那麼到底什麼是反向代理,什麼是正向代理?
我想大声告诉你2017-05-16 17:23:59
A 找 B 直接溝通,這就等於沒有什麼代理;
然而中間夾一個傳話的 C,C 就是代理了,A 透過 C 把訊息傳遞給 B,然後 C 再把 B 的回饋轉達給 A。
在這個過程中,A 知道溝通的直接目標是B,只不過由於各種原因無法直接和B 面對面,需要中間人C,這就是所謂“正向代理”,其實我們很少說正向代理,在英文原文裡,這個叫Forward Proxy,一般就直接叫代理,你翻譯成「轉交代理」或「傳達代理」都比「正向代理」強,然而沒必要,因為代理這個詞的本意就是如此。
另外一種情況則是:A 並不知道B 的存在,它只知道找C 就可以得到想要的回复,對於A 來說有沒有B 或有多少個B、D、E、F…都不重要,只要有C 就夠了。而 C 則會根據情況去獲取回饋然後回應給 A。
這種就叫反向代理了。理解其中的差異不要從「正反」兩個反義方向詞上做文章,英文裡的Forward 和Reverse 並不是一對反義詞,Forward 和Backward 才是,然而Reverse 和Backward 並不是一個意思……所以說技術書籍資料還就是得看原文的啊。
------
剛才有小夥伴問了我一個問題,因為他還是對此有困惑,我給他舉個例子他明白了。我不知道我上面的答案是否能讓大家明白,所以我把這個例子也寫出來:
我想訪問 www.google.com,然而大家都知道它被牆了,我沒辦法直接訪問它。於是我連接了一個VPN 服務並設定其為本地HTTP 存取的代理(比如說在Mac 下勾選「透過VPN 連線發送所有流量),然後我再造訪www.google.com,此時我的請求被該VPN 服務代理了,它幫我訪問了www.google.com 然後把結果回傳給我。
於是我重新設定了 Nginx,讓它把所有經由 :80/api/ 的存取請求都代理給 localhost:8000,然後把回應傳回給原始的請求方(即:Origin Host),這就是反向代理。現在我的用戶可以正常訪問 www.mysite.com 啦。
同上,這是反向代理的一種應用場景,但並非代表它只能這樣用
最重要的特徵是我的用戶壓根不知道 localhost:8000 這個服務的存在,並且即使知道也訪問不到——開 VPN 也訪問不到,這是倆碼事!
對於使用者來講,唯一的「對話」方只有 www.mysite.com(80 埠),他們不知道也不必知道後面發生了什麼
大家讲道理2017-05-16 17:23:59
反向代理意味著它背後的目標是固定的
用戶訪問到你的nginx等價於訪問後面代理的web服務
正向代理是指它代理的目標是不固定的
用戶透過代理伺服器可以存取任意web服務
阿神2017-05-16 17:23:59
主要差別在於,到底是客戶端還是伺服器做的代理。
如果是客戶端發送請求時使用的代理,就是正向代理;
而伺服器端接收到客戶端的請求時使用代理轉移到其他伺服器則是反向代理;
PHP中文网2017-05-16 17:23:59
正向代理: 你需要主動設定代理伺服器ip或網域進行存取。由設定的伺服器ip或網域去取得存取內容並返回。
反向代理: 你不需要任何設置,直接訪問伺服器真實ip或域名,但是伺服器內部會自動根據訪問內容進行跳轉及內容返回,你不知道它最終訪問的是哪些機器。
PHP中文网2017-05-16 17:23:59
電腦存取伺服器,伺服器不知電腦真實IP,則兩者間有一個正向代理。
電腦存取伺服器,電腦不知伺服器真實IP,則兩者間有一個反向代理。
當然,現在很多正向代理也可以透過http head 傳遞電腦的真實IP
大家讲道理2017-05-16 17:23:59
正向代理:你去吃 KFC 吃漢堡雞翅,這個漢堡雞翅經過各層「代理」分中心從總部拿到,再分發到你手上。
反向代理:KFC 總部在給你漢堡雞翅時,可能先分配不同地區的分中心然後再到門店,最後再到配送給你,但對於你來說,是透明的,無需知道是華東還是華北的分中心給你。
给我你的怀抱2017-05-16 17:23:59
我們上網的時候,有時需要配置一個代理伺服器(例如被牆),這個代理伺服器是正向代理;開發伺服器系統的時候,將客戶端/瀏覽器發過來的請求代理分發到後台多個真正的業務伺服器,這個代理是反向代理。
可以認為正向代理是客戶端的,反向代理是服務端的。