反向代理為何叫反向代理?

與正向代理比起來,反向代理是什麼東西反向了?


很久以前,老王去飯店吃飯,需要先到飯店,七葷八素點好菜,坐等飯菜上桌,然後大快朵頤,不亦樂乎。

有了第三方訂餐外賣平台(代理),老王懶得動身前往飯店,老王打個電話或用APP,先選好某個飯店,再點好菜,外賣小哥會送上門來。

由於某個品牌的飯店口碑特別好,食客絡繹不絕湧入,第三方訂餐電話也不絕於耳,但是限於飯店接待能力有限,無法提供及時服務,很多食客等得不耐煩了,紛紛鎩羽而歸,飯店老總看著煮熟的鴨子飛走了,心疼不已。

痛定思痛,老總又成立了幾個連鎖飯店,形成一個集群,對外提供統一標準的菜品服務,電話訂餐電話400-xxx-7777,當食客湧入飯店總台,總台將食客用大巴運到各個連鎖店,這樣食客既不需要排隊,各連鎖店都能高速運轉起來,一舉兩得,老總樂開了花,並為此種運作模式起名為「反向代理」(Reverse Proxy)。

反向代理
在計算機世界裡,由於單個伺服器的處理客戶端(用戶)請求能力有一個極限,當用戶的接入請求蜂擁而入時,會造成伺服器忙不過來的局面,可以使用多個伺服器來共同分擔成千上萬的用戶請求,這些伺服器提供相同的服務,對於用戶來說,根本感覺不到任何差別。

反向代理的實現
1)需要有一個負載均衡設備來分發用戶請求,將用戶請求分發到空閑的伺服器上

2)伺服器返回自己的服務到負載均衡設備

3)負載均衡將伺服器的服務返回用戶

以上的潛台詞是:用戶和負載均衡設備直接通信,也意味著用戶做伺服器域名解析時,解析得到的IP其實是負載均衡的IP,而不是伺服器的IP,這樣有一個好處是,當新加入/移走伺服器時,僅僅需要修改負載均衡的伺服器列表,而不會影響現有的服務。

談完反向代理服務,再來談談終端用戶常用的代理服務。

代理
1)用戶希望代理伺服器幫助自己,和要訪問伺服器通信,為了實現此目標,需要以下工作:

a) 用戶IP報文的目的IP = 代理伺服器IP
b) 用戶報文埠號 = 代理伺服器監聽埠號
c) HTTP 消息里的URL要提供伺服器的鏈接

2)代理伺服器可以根據c)里的鏈接與伺服器直接通信

3)伺服器返回網頁

4)代理伺服器打包3)中的網頁,返回用戶。

代理伺服器應用場景
場景一
如果不採用代理,用戶的IP、埠號直接暴露在Internet(儘管地址轉換NAT),外部主機依然可以根據IP、埠號來開採主機安全漏洞,所以在企業網,一般都是採用代理伺服器訪問互聯網。

那有同學會有疑問,那代理伺服器就沒有安全漏洞嗎?
相比千千萬萬的用戶主機,代理伺服器數量有限,修補安全漏洞更方便快捷。

場景二
在一個家庭區域網,家長覺得外部的世界是洪水猛獸,為了不讓小盆友們學壞,決定不讓小盆友們訪問一些網站,可小盆友們有強烈的逆反心理,儂越是不讓我看,我越是想看,於是小盆友們使用了代理伺服器,這些代理伺服器將禁止訪問的網頁打包好,然後再轉交給小盆友,僅此而已。

當然關鍵的關鍵是代理伺服器不在禁止名單當中!


代理其實就是一個中介,A和B本來可以直連,中間插入一個C,C就是中介。剛開始的時候,代理多數是幫助內網client訪問外網server用的(比如HTTP代理),從內到外。後來出現了反向代理,"反向"這個詞在這兒的意思其實是指方向相反,即代理將來自外網client的請求forward到內網server,從外到內


正向代理代理客戶端,反向代理代理伺服器


正向代理


A同學在大眾創業、萬眾創新的大時代背景下開啟他的創業之路,目前他遇到的最大的一個問題就是啟動資金,於是他決定去找馬雲爸爸借錢,可想而知,最後碰一鼻子灰回來了,情急之下,他想到一個辦法,找關係開後門,經過一番消息打探,原來A同學的大學老師王老師是馬雲的同學,於是A同學找到王老師,托王老師幫忙去馬雲那借500萬過來,當然最後事成了。不過馬雲並不知道這錢是A同學借的,馬雲是借給王老師的,最後由王老師轉交給A同學。這裡的王老師在這個過程中扮演了一個非常關鍵的角色,就是代理,也可以說是正向代理,王老師代替A同學辦這件事,這個過程中,真正借錢的人是誰,馬雲是不知道的,這點非常關鍵。


我們常說的代理也就是只正向代理,正向代理的過程,它隱藏了真實的請求客戶端,服務端不知道真實的客戶端是誰,客戶端請求的服務都被代理伺服器代替來請求,某些科學上網工具扮演的就是典型的正向代理角色。用瀏覽器訪問 http://www.google.com 時,被殘忍的block,於是你可以在國外搭建一台代理伺服器,讓代理幫我去請求google.com,代理把請求返回的相應結構再返回給我。

反向代理


大家都有過這樣的經歷,撥打10086客服電話,可能一個地區的10086客服有幾個或者幾十個,你永遠都不需要關心在電話那頭的是哪一個,叫什麼,男的,還是女的,漂亮的還是帥氣的,你都不關心,你關心的是你的問題能不能得到專業的解答,你只需要撥通了10086的總機號碼,電話那頭總會有人會回答你,只是有時慢有時快而已。那麼這裡的10086總機號碼就是我們說的反向代理。客戶不知道真正提供服務人的是誰。

反向代理隱藏了真實的服務端,當我們請求 www.baidu.com 的時候,就像撥打10086一樣,背後可能有成千上萬台伺服器為我們服務,但具體是哪一台,你不知道,也不需要知道,你只需要知道反向代理伺服器是誰就好了,www.baidu.com 就是我們的反向代理伺服器,反向代理伺服器會幫我們把請求轉發到真實的伺服器那裡去。Nginx就是性能非常好的反向代理伺服器,用來做負載均衡。

兩者的區別在於代理的對象不一樣:正向代理代理的對象是客戶端,反向代理代理的對象是服務端

不妨也關注一下公眾號 Python之禪


精闢,正向代理隱藏真實客戶端,反向代理隱藏真實服務端,一下就懂了,很有幫助


為阿笠碩士的答案補圖


所謂反向代理基本上就是一個服務端的負載均衡器。很好奇java界總喜歡弄一些新名詞。。莫名其妙。語言是用來交流的,不是用來裝逼的。有興趣的可以追根溯源一下這個名詞的出處。我理解就是寫apache文檔那個人造出來的。然後一幫人不理解這個反人類的名詞。然後理解了的自以為得意經常面試考,看到這個名詞的人以為逼格很高然後不知怎麼的這個名詞就」流行「起來。我對這個名詞的想法是跟UML一樣,屬於反人類的範疇,如果你不理解,完全可以。碰到別人說到這個名詞,你不理解就問他是什麼就行了。

=====================更正=======================
據我最新考據,這個詞語最早的出處應該是Sun公司2004年出的這本書
Securing Web Applications through a Secure Reverse Proxy
不清楚作者新造一個名詞的想法是什麼。目前也查不出是哪個傢伙發明這個反人類名詞的。
處於同一位置的負載均衡器的feature可完全包含所謂的反向代理。
Load balancing (computing)


先說正向代理,比如要訪問youtube,但是不能直接訪問,只能先找個翻牆軟體,通過翻牆軟體才能訪問youtube. 翻牆軟體就叫做正向代理。

所謂的反向代理,指的是用戶要訪問youtube,但是youtube悄悄地把這個請求交給x-art來做,那麼x-art就是反向代理了。


上面的答案都說的很好,我畫了張圖能更直觀地解釋為何反向代理叫「反向「代理

正向代理中,proxy和client同屬一個LAN,對server透明;
反向代理中,proxy和server同屬一個LAN,對client透明。
實際上proxy在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下,所以把後出現的那種代理方式叫成了反向代理。歡迎指正,以上。


看完這麼多人的,來說下我的想法,用訪問百度來比喻一下。
如果想用正向代理的方式訪問百度的話,那我們得這樣做:
1、自己搭一個或者找一個代理伺服器
2、將上一步得到的代理伺服器,在系統中設置好,windows中是這樣設置的

127.0.0.1是我的代理伺服器的ip,8888是我的代理伺服器的埠。
3、然後訪問http://baidu.com,這樣的話代理伺服器就會開始工作了,首先你訪問百度的請求會發送到代理伺服器上,然後代理伺服器就會聽你的話,去http://baidu.com把東西給拿回來,然後放在自己的伺服器上面,之後你就從代理伺服器上拿走,返回給自己電腦。
這裡的要點是:
客戶端沒有直接和服務端(http://baidu.com)接觸,而是通過代理伺服器(127.0.0.1:8888)間接訪問,數據也是從代理伺服器上直接拿的。而使用反向代理訪問http://baidu.com的話,我們本地根本就不用配置,因為啊,這個反向代理其實是伺服器端的配置。而且其實我們一直都是用反向代理訪問大多數網站的。
我們訪問的http://baidu.com,然後從這個伺服器拿到的資源,其實可能這些資源並不是從這個伺服器里拿出來的,而是這個伺服器作為反向代理,從別的伺服器拿過來的。
你以為你是這樣訪問百度的

而實際上你是這麼訪問百度的

所以我們用反向代理,這個反向代理就相當於一個統籌資源的作用


一個是代理(v)客戶端,為客戶端收發請求,使真實客戶端對伺服器不可見。
一個是代理(v)伺服器,為伺服器收發請求,使真實伺服器對客戶端不可見。
因為服務對象和自身角色不同,所以剛好是相反的。
(v代表動詞)


看完大家的回答,無論如何感覺認識更清楚了。
正向代理:代理端代理的是客戶端。
反向代理:代理端代理的是服務端。


普通的代理,是代表著用戶、客戶端,去向伺服器發請求,要求提供某種服務

反向代理,是代表著伺服器,為客戶端為用戶提供服務

這不就反了嘛


區別就在於,正向代理是用戶端部署/使用,目的為了隱藏客戶端;反向代理是服務端部署/使用,目的為了隱藏服務端。
至於負載均衡,CDN都是反向代理的應用,但他們都不代表反向代理,所以反對一下某些高票答案,低票答案比高票靠譜多了。


正向代理即是客戶端代理, 代理客戶端, 服務端不知道實際發起請求的客戶端.


反向代理即是服務端代理, 代理服務端, 客戶端不知道實際提供服務的服務端.


服務的目標不同。

普通代理,forward proxy,是服務於特定用戶(比如說一個公司內 / 一個區域網內的客戶)以訪問非特定的服務;
反向代理,reverse proxy,是服務於非特定用戶(對於公開互聯網服務而言,通常是所有用戶)以訪問特定的服務。


從前,有兩個人,他們分別叫A和B,A稍微笨了點兒,他什麼問題都喜歡問別人,自己從來不思考,但是他有個很厲害的技能就是能把別人說的任何話都用手語表達出來;B呢,是個聾子,他聽不到,但是他特別聰明,特別喜歡思考問題。

有一天,一個瞎子過來問了A一個數學問題,A一聽,好難啊,我不想算了,但是又想著必須得在這個瞎子面前顯擺一番。於是,他跑去B的家裡,用手語給他描述了這個問題,B分分鐘給他算了出來。A拿著答案手舞足蹈的跑去瞎子那裡去炫耀,並告訴他這是他自己算出來的。

這個時候,瞎子是不知道A的答案從哪裡得到的。

也就是說,瞎子問了A一個問題,A把問題甩給了B去想,然後B解答了,A再告訴瞎子。這中間A其實就是在做一個反向代理的事情。對於瞎子來講,這個問題具體是B想出來的還是C想出來的,他根本不會知道,因為他看不見。

如果故事你也看不明白的話, 死神小學生中。 兇手-》毛利-》柯南。他們的關係也是這樣。


我的理解:
代理:在客戶這一端,替客戶收發請求。
反向代理:在伺服器機房這一端,替伺服器收發請求,也就是說請求和響應都先經過反向代理。具有緩存、安全、負載均衡等作用。



我們常說的代理是正向代理。使用正向代理的過程如下:

1,客戶端連接代理。

2,代理連接伺服器。

3,伺服器將結果發給代理。

4,代理將結果發給客戶端。

反向代理的過程如下:

1,客戶端連接伺服器,其實連接的是反向代理伺服器,但是客戶端不知道。

2,反向代理將請求轉發給相應的伺服器。

3,伺服器將結果發給反向代理。

4,方向代理將結果發給客戶端。

流程基本一樣,主要是反向代理是和伺服器部署在一起,如nginx,haproxy,但客戶端不知道反向代理的存在。反向代理知道伺服器集群的情況,知道怎麼轉發請求給具體的伺服器。而正向代理只能轉發給相應的域名對應的伺服器。反向代理因為和伺服器部署在一起,所以可以用來做負載均衡,對客戶端請求進行各種處理(如統計連接數,拒絕連接等)等等。

主要記住,反向代理是和伺服器集群在一起的,並且知道集群的內部情況。


推薦閱讀:

移動互聯網廣告營銷模式,除去 AdMob 類型外,還有哪些可能性?
Linux路由表異常?
甲骨文當年提倡的網路計算機(network computer)和谷歌的chrome os,兩者有什麼不同?
如果中國斷網一周(7天),社會會發生什麼?
怎樣讓自己的 PC 擁有強大的功能和極高的效率?

TAG:互聯網 | 計算機網路 | Nginx | 代理伺服器 | 反向代理 |