圖解正向代理、反向代理、透明代理

加瓦一枚發表於2019-02-18

內容出自:http://z00w00.blog.51cto.com/515114/1031287

套用古龍武俠小說套路來說,代理服務技術是一門很古老的技術,是在網際網路早期出現就使用的技術。一般實現代理技術的方式就是在伺服器上安裝代理服務軟體,讓其成為一個代理伺服器,從而實現代理技術。常用的代理技術分為正向代理、反向代理和透明代理。本文就是針對這三種代理來講解一些基本原理和具體的適用範圍,便於大家更深入理解代理服務技術。

一、正向代理(Forward Proxy)

一般情況下,如果沒有特別說明,代理技術預設說的是正向代理技術。關於正向代理的概念如下:

正向代理(forward)是一個位於客戶端【使用者A】和原始伺服器(origin server)【伺服器B】之間的伺服器【代理伺服器Z】,為了從原始伺服器取得內容,使用者A向代理伺服器Z傳送一個請求並指定目標(伺服器B),然後代理伺服器Z向伺服器B轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。如下圖1.1

(圖1.1)

從上面的概念中,我們看出,文中所謂的正向代理就是代理伺服器替代訪問方【使用者A】去訪問目標伺服器【伺服器B】

這就是正向代理的意義所在。而為什麼要用代理伺服器去代替訪問方【使用者A】去訪問伺服器B呢?這就要從代理伺服器使用的意義說起。

使用正向代理伺服器作用主要有以下幾點:

1、訪問本無法訪問的伺服器B,如下圖1.2

(圖1.2)

我們拋除複雜的網路路由情節來看圖1.2,假設圖中路由器從左到右命名為R1,R2假設最初使用者A要訪問伺服器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那麼就無法訪問伺服器B了。但是如果使用者A讓代理伺服器Z去代替自己訪問伺服器B,由於代理伺服器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問伺服器B,那麼使用者A就可以得到伺服器B的資料了。現實中的例子就是“FQ”。不過自從VPN技術被廣泛應用外,“FQ”不但使用了傳統的正向代理技術,有的還使用了VPN技術。

2、加速訪問伺服器B

這種說法目前不像以前那麼流行了,主要是頻寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。還是如圖1.2

假設使用者A到伺服器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低頻寬鏈路。而使用者A到代理伺服器Z,從代理伺服器Z到伺服器B都是高頻寬鏈路。那麼很顯然就可以加速訪問伺服器B了。

3、Cache作用

Cache(快取)技術和代理服務技術是緊密聯絡的(不光是正向代理,反向代理也使用了Cache(快取)技術。還如上圖所示,如果在使用者A訪問伺服器B某資料J之前,已經有人通過代理伺服器Z訪問過伺服器B上得資料J,那麼代理伺服器Z會把資料J儲存一段時間,如果有人正好取該資料J,那麼代理伺服器Z不再訪問伺服器B,而把快取的資料J直接發給使用者A。這一技術在Cache中術語就叫Cache命中。如果有更多的像使用者A的使用者來訪問代理伺服器Z,那麼這些使用者都可以直接從代理伺服器Z中取得資料J,而不用千里迢迢的去伺服器B下載資料了。

 

4、客戶端訪問授權

這方面的內容現今使用的還是比較多的,例如一些公司採用ISA SERVER做為正向代理伺服器來授權使用者是否有許可權訪問網際網路,挼下圖1.3

 

 

 

 

(圖1.3)

圖1.3防火牆作為閘道器,用來過濾外網對其的訪問。假設使用者A和使用者B都設定了代理伺服器,使用者A允許訪問網際網路,而使用者B不允許訪問網際網路(這個在代理伺服器Z上做限制)這樣使用者A因為授權,可以通過代理伺服器訪問到伺服器B,而使用者B因為沒有被代理伺服器Z授權,所以訪問伺服器B時,資料包會被直接丟棄。

5、隱藏訪問者的行蹤

如下圖1.4 我們可以看出伺服器B並不知道訪問自己的實際是使用者A,因為代理伺服器Z代替使用者A去直接與伺服器B進行互動。如果代理伺服器Z被使用者A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。

 

(圖1.4)

我們總結一下 正向代理是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程式的埠。

二、反向代理(reverse proxy)

反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。

使用反向代理伺服器的作用如下:

1、  保護和隱藏原始資源伺服器

如下圖2.1

(圖2.1)

使用者A始終認為它訪問的是原始伺服器B而不是代理伺服器Z,但實用際上反向代理伺服器接受使用者A的應答,從原始資源伺服器B中取得使用者A的需求資源,然後傳送給使用者A。由於防火牆的作用,只允許代理伺服器Z訪問原始資源伺服器B。儘管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源伺服器B,但使用者A並不知情。

2、  負載均衡

如下圖2.2

(圖2.2)

 

當反向代理伺服器不止一個的時候,我們甚至可以把它們做成叢集,當更多的使用者訪問資源伺服器B的時候,讓不同的代理伺服器Z(x)去應答不同的使用者,然後傳送不同使用者需要的資源。

當然反向代理伺服器像正向代理伺服器一樣擁有CACHE的作用,它可以快取原始資源伺服器B的資源,而不是每次都要向原始資源伺服器B請求資料,特別是一些靜態的資料,比如圖片和檔案,如果這些反向代理伺服器能夠做到和使用者X來自同一個網路,那麼使用者X訪問反向代理伺服器X,就會得到很高質量的速度。這正是CDN技術的核心。如下圖2.3

 

 (圖2.3)

 

我們並不是講解CDN,所以去掉了CDN最關鍵的核心技術智慧DNS。只是展示CDN技術實際上利用的正是反向代理原理這塊。反向代理結論與正向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。基本上,網上做正反向代理的程式很多,能做正向代理的軟體大部分也可以做反向代理。開源軟體中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端伺服器。另外MS ISA也可以用來在WINDOWS平臺下做正向代理。反向代理中最主要的實踐就是WEB服務,近些年來最火的就是Nginx了。網上有人說NGINX不能做正向代理,其實是不對的。NGINX也可以做正向代理,不過用的人比較少了。

 三、透明代理

如果把正向代理、反向代理和透明代理按照人類血緣關係來劃分的話。那麼正向代理和透明代理是很明顯堂親關係,而正向代理和反向代理就是表親關係了 .透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設定使用代理了。透明代理實踐的例子就是時下很多公司使用的行為管理軟體。如下圖3.1

 

圖3.1

使用者A和使用者B並不知道行為管理裝置充當透明代理行為,當使用者A或使用者B向伺服器A或伺服器B提交請求的時候,透明代理裝置根據自身策略攔截並修改使用者A或B的報文,並作為實際的請求方,向伺服器A或B傳送請求,當接收資訊回傳,透明代理再根據自身的設定把允許的報文發回至使用者A或B,如上圖,如果透明代理設定不允許訪問伺服器B,那麼使用者A或者使用者B就不會得到伺服器B的資料。

延伸說明:

內容來自:http://blog.csdn.net/longxibendi/article/details/6665670

大型網站的負載均衡器、db proxy和db

本文主要分析網站後臺架構中的負載均衡器,企業常用的硬體負載均衡器軟體負載均衡器、資料庫代理伺服器和資料庫。

1.1 負載均衡

在大型網站部署中,負載均衡至少有三層部署。第一層為web server或者快取代理之上的負載均衡,第二層為資料庫之上的負載均衡,第三層為儲存裝置之上的負載均衡。

在第一層部署中,最常使用的是硬體負載均衡器有F5 BIG-IP、Citrix NetScaler、Radware、Cisco CSS、Foundry等產品。這些產品價格不菲,高達幾十萬人民幣。在中國大陸,採用F5Network公司的BIG-IP負載均衡交換機的網站有新浪網、雅虎、百度、搜狐、鳳凰網、央視國際、中華英才網、貓撲、暢遊等。之前淘寶採用 NetScaler作為其硬體負載均衡器。後來用軟體負載均衡器LVS和HAproxy混合使用來代替硬體負載均衡器。硬體負載均衡器可以提供OSI參考模型的第四/七層進行負載均衡。在第七層實現負載均衡的原理是,通過檢查流經的HTTP報頭,根據報頭內的資訊來執行負載均衡任務。在第四層(網路層)實現負載均衡的DR模式的原理是,通過更改請求包的目的MAC地址來進行負載均衡。

在第一層部署中,最常用的軟體負載均衡器為LVS(LinuxVirtual Server)和HAproxy。其中LVS採用基於IP負載均衡技術和基於內容請求分發技術。最常用的LVS負載均衡技術為DR負載均衡。

在第二層部署中,最常用的為MySQL-proxy(後端部署必須為MySQL資料庫),該代理伺服器可以監測、分析或改變客戶端的通訊。最常用途為負載均衡,讀寫分離等。

在第三層部署中,最常用的儲存裝置都要做RAID,其中RAID0便為最基本的儲存層的負載均衡。RAID0通過分帶技術,將資料分割,然後並行的讀寫於各個磁碟上。這樣實現底層儲存一級的負載均衡。

 

1.2 LVS軟體負載均衡器

LVS(LinuxVirtual Server)是由章文嵩博士主導開發的一款開源軟體,可以實現Linux平臺下的基於網路層的負載均衡軟體。典型的基本架構圖如圖6-2-1所示。

圖6-2-1

LVS叢集採用IP負載均衡技術和基於內容請求分發技術。

如圖6-2-1所示,LVS叢集採用基於IP負載均衡技術和基於內容請求分發技術。當客戶端有請求時,首先將請求包傳送到Load Balance,然後Load Balance從後面的Real Servers中按照一定的演算法策略選取一臺Real Server,比如Real Server1,然後把請求包傳送給Real Server1進行處理。對所有使用者而言,面向使用者的伺服器端IP地址,只有一臺,稱之為VirtualIP Address。

1.2.1 LVS叢集中實現的三種IP負載均衡技術

VS/NAT、 VS/TUN 和VS/DR技術是LVS叢集中實現的三種IP負載均衡技術。

1.2.1.1 VS/NAT技術

VS/NAT(VirtualServer via Network Address Translation)技術,主要通過網路地址轉換,將一組伺服器構成一個高效能的、高可用的虛擬伺服器。NAT的工作原理是當內部網路中的主機要訪問Internet或被Internet訪問時,就需要採用網路地址轉換NAT,將內部地址轉化為Internet上可用的外部地址。NAT的工作原理是報文頭(目標地址、源地址和埠等)被正確改寫後,客戶端相信他們連線到了一個IP地址,而不同的IP地址伺服器組也認為他們與客戶直接相連的。由此,可以用NAT方法將不同IP地址的並行網路服務變成一個IP地址上的虛擬服務。VS/NAT的體系結構如圖6-2-1-1所示。

圖6-2-1-1

客戶端訪問伺服器的請求包和響應包變化情況如下所示:

訪問Web服務的報文可能有以下的源地址和目標地址:

SOURCE

202.100.1.2:3456

DEST

202.103.106.5:80

排程器從排程列表中選出一臺伺服器,例如是172.16.0.3:8000。該報文會被改寫為如下地址,並將它傳送給選出的伺服器。

SOURCE

202.100.1.2:3456

DEST

172.16.0.3:8000

從伺服器返回到排程器的響應報文如下:

SOURCE

172.16.0.3:8000

DEST

202.100.1.2:3456

響應報文的源地址會被改寫為虛擬服務的地址,再將報文傳送給客戶:

SOURCE

202.103.106.5:80

DEST

202.100.1.2:3456

這樣,客戶認為是從202.103.106.5:80服務得到正確的響應,而不會知道該請求是伺服器172.16.0.2還是伺服器172.16.0.3處理的。

1.2.1.2 VS/TUN技術

VS/TUN 的工作原理:它的連線排程和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。排程器根據各個伺服器的負載情況,動態地選擇一臺伺服器,將請求報文封裝在另一個IP報文中,再將封裝後的IP報文轉發給選出的伺服器;伺服器收到報文後,先將報文解封獲得原來目標地址為VIP的報文,伺服器發現VIP地址被配置在本地的IP隧道裝置上,所以就處理這個請求,然後根據路由表將響應報文直接返回給客戶。如圖6-2-1-2所示。

 圖6-2-1-2

1.2.1.3 VS/DR技術

在VS/DR中,排程器根據各個伺服器的負載情況,動態地選擇一臺伺服器,不修改也不封裝IP報文,而是將資料幀的MAC地址改為選出伺服器的MAC地址,再將修改後的資料幀在與伺服器組的區域網上傳送。因為資料幀的MAC地址是選出的伺服器,所以伺服器肯定可以收到這個資料幀,從中可以獲得該IP報文。當伺服器發現報文的目標地址VIP是在本地的網路裝置上,伺服器處理這個報文,然後根據路由表將響應報文直接返回給客戶。如圖6-2-1-3所示。

 

圖6-2-1-3

1.2.1.4 LVS的排程演算法

前面幾節,介紹了LVS的三種基於IP的負載均衡技術,下面簡單介紹一下排程演算法。排程演算法的目的是解決如何合理有效的從LVS後端的RealServers中,選擇一個RealServer來對請求包進行處理。在整個LVS專案中,共給出八種排程演算法,主要有:

(1)輪詢排程。主要指按順序從RealServers中選擇一臺RealServers。

(2) 加權輪叫排程。給Real Servers設定一定權值,進行排程。

(3)最小連線排程。按照RealServers的連線情況進行排程。

(4)加權最小連線。根據設定的權值和現有的連線數進行排程。

(5)基於區域性性的最小連線。主要用於增大Cache命中。

(6)代複製的基於區域性性的最小連線。

(7)目標地址雜湊排程。

(8)源地址雜湊排程。

在上述八種排程演算法中,最常用的排程演算法是輪詢排程。

1.3 db proxy

在大型網際網路站的資料庫部署中,部署最多的資料庫為MySQL。隨著MySQL中Innodb儲存引擎對事物的支援,MySQL在網際網路公司部署中,應用量越來越多。典型應用MySQL的公司有Google、Baidu、Taobao等大型網際網路公司。MySQL的優勢在於其高擴充套件性和價格優勢等。實際上,MySQL可以免費應用於企業級的部署中。

在MySQL複製方式部署中,有兩種部署方式:同步複製和非同步複製。同步複製採用NDB 儲存引擎,非同步複製需要使用mysql-proxy結合master-slave實現。

非同步複製主要為了解決讀寫分離的問題。因為使用者對網站的訪問有讀操作多,寫操作少的特點。甚至像taobao.com這樣的網站讀寫比例高達10:1,所以採用MySQL-Proxy結合主從非同步複製實現讀寫分離是非常重要的增快訪問速度的方法。這樣如果有更高的使用者訪問需求,通過增加slave機器,不會對現有系統提供的服務產生影響而實現很好的、很靈活的業務擴充套件。

1.3.1 mysql-proxy

mysql-proxy是一個MySQL的代理伺服器,使用者的請求先發向mysql-proxy,然後mysql-proxy對使用者的資料包進行分析,從下一層的mysql 資料庫中選擇一臺資料庫,將使用者的請求包交給mysql處理。

首先MySQL Proxy 以伺服器的身份接受客戶端的請求,根據相應配置對這些請求進行分析處理,然後以客戶端的身份轉發給相應的後端資料庫伺服器,再接受伺服器的資訊,然後返回給客戶端。所以MySQL Proxy需要同時實現客戶端和伺服器的協議。由於要對客戶端傳送過來的SQL語句進行分析,還需要包含一個SQL解析器。MySQL Proxy通過使用lua指令碼,來實現複雜的連線控制和過濾,從而實現讀寫分離和負載平衡。所以部署MySQL-Proxy需要安裝執行Lua語言的環境。典型的MySQL-Proxy應用為實現讀寫分離,如圖6-3-1所示。

 圖6-3-1

1.3.2 MySQL主從複製(Master-Slave Replication)

MySQL主從複製(Master-Slave Replication)是通過設定在Master MySQL上的binlog(使其處於開啟狀態),Slave MySQL上通過一個I/O執行緒從Master MySQL上讀取binlog,然後傳輸到Slave MySQL的中繼日誌中,然後Slave MySQL的SQL執行緒從中繼日誌中讀取中繼日誌,然後應用到Slave MySQL的資料庫中。這樣實現了資料庫的複製功能。原理如圖6-3-2所示:

圖6-3-2

MySQL主從複製的作用如下:

(1)    可以作為一種備份機制。

(2)    可以用來做讀寫分離。

1.3.3 MySQL主從複製結合MySQL Proxy實現讀寫分離

通過使用MySQL-Proxy來作為代理伺服器,配置MySQL Proxy,將所有的寫操作,分流到master MySQL上,所有的讀操作分流到slave MySQLs。      

這樣就實現了讀寫分離。如果有新的訪問需求,只需新增slave MySQL機器來解決問題。所以這樣的結構擴充套件能力非常好。如圖6-3-3所示。

 圖6-3-3

1.4 本文小結

本文主要論述了負載均衡在大型網站後臺架構中的應用。主要分析了應用層的軟體負載均衡器LVS的三種負載均衡演算法,簡單介紹了LVS的八種排程演算法。詳細分析了MySQL的主從複製和讀寫分離的實現機制。給出了高可用網站後臺的部署中解決負載均衡的方案。

相關文章