前言
學習 nginx 過程中,了解到反向代理 一詞,以前聽說過很多次,但沒有具體了解到底為什么叫反向代理,那同時應該也有對應的正向代理一說。因此查閱了一下,下面記錄一下學習結果。
先上結論:
- 正向代理代理的是客戶端,隱藏真實客戶端;
- 反向代理代理的是服務端,隱藏真實服務端。
什么是正向代理
知乎上有個很好的例子這里拿來用一下:
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就是性能非常好的反向代理服務器,用來做負載均衡。
反向代理的實現過程
- 需要有一個負載均衡設備來分發用戶請求,將用戶請求分發到空閑的服務器上;
- 服務器返回自己的服務到負載均衡設備;
- 負載均衡將服務器的服務返回用戶。
以上的潛臺詞是:用戶和負載均衡設備直接通信,也意味著用戶做服務器域名解析時,解析得到的IP其實是負載均衡的IP,而不是服務器的IP,這樣有一個好處是,當新加入/移走服務器時,僅僅需要修改負載均衡的服務器列表,而不會影響現有的服務。
正向代理與反向代理的區別
代理其實就是一個中介,A和B本來可以直連,中間插入一個C,C就是中介。
- 正向代理:剛開始的時候,代理多數是幫助內網client訪問外網server用的(比如HTTP代理),從內到外。
- 反向代理:后來出現了反向代理,"反向"這個詞在這兒的意思其實是指方向相反,即代理將來自外網client的請求forward到內網server,從外到內。
- 正向代理中,代理和客戶端同屬一個LAN,對服務端透明;
- 反向代理中,代理和服務端同屬一個LAN,對服務端透明。
實際上不論正/反代理做的事都是代為收發請求和響應。
代理服務器應用的場景
場景一
如果不采用代理,用戶的IP、端口號直接暴露在Internet(盡管地址轉換NAT),外部主機依然可以根據IP、端口號來開采主機安全漏洞,所以在企業網,一般都是采用代理服務器訪問互聯網。同時,如果有安全漏洞,由于代理服務器數量有限,因此相對于修補千千萬萬的用戶主機,修補代理服務器的安全漏洞更方便會計。
場景二
在一個超大型局域網,德高望重的家長覺得小盆友們“幼稚”、“有時還有點單純”,外部的世界是洪水猛獸,為了不讓小盆友們學壞,決定不讓小盆友們訪問一些網站,可小盆友們有強烈的逆反心理,儂越是不讓我看,我越是想看,于是小盆友們使用了代理服務器,這些代理服務器將禁止訪問的網頁打包好,然后再轉交給小盆友,僅此而已。
當然關鍵的關鍵是代理服務器不在禁止名單當中!