轉:反向 Proxy伺服器的工作原理

來源:互聯網
上載者:User

標籤:

一、什麼是反向 Proxy

   反向 Proxy(Reverse Proxy)方式是指以Proxy 伺服器來接受Internet上的串連請求,然後將請求轉寄給內部網路上的伺服器;並將從伺服器上得到的結果返回給Internet上請求串連的用戶端,此時Proxy 伺服器對外就表現為一個伺服器。

  通常的Proxy 伺服器,只用於代理內部網路對Internet外部網路的串連請求,客戶機必須指定Proxy 伺服器,並將本來要直接發送到Web伺服器上的 http請求發送到Proxy 伺服器中。不支援外部網路對內部網路的串連請求,因為內部網路對外部網路是不可見的。當一個Proxy 伺服器能夠代理外部網路上的主機, 訪問內部網路時,這種代理服務的方式稱為反向 Proxy服務。此時Proxy 伺服器對外就表現為一個Web伺服器,外部網路就可以簡單把它當作一個標準的Web伺服器 而不需要特定的配置。不同之處在於,這個伺服器沒有儲存任何網頁的真實資料,所有的靜態網頁或者CGI程式,都儲存在內部的Web伺服器上。因此對反向代 理伺服器的攻擊並不會使得網頁資訊遭到破壞,這樣就增強了Web伺服器的安全性。

  反向 Proxy就是通常所說的web伺服器加速,它是一種通過在繁忙的web伺服器和外部網路之間增加一個高速的web緩衝伺服器來降低實際的web服務 器的負載的一種技術。反向 Proxy是針對web伺服器提高加速功能,作為代理緩衝,它並不是針對瀏覽器使用者,而針對一台或多台特定的web伺服器,它可以代理 外部網路對內部網路的訪問請求。

  反向 Proxy伺服器會強制將外部網路對要代理的伺服器的訪問經過它,這樣反向 Proxy伺服器負責接收用戶端的請求,然後到原始伺服器上擷取內容,把內容返回給 使用者,並把內容儲存到本地,以便日後再收到同樣的資訊請求時,它會把本機快取裡的內容直接發給使用者,以減少後端web伺服器的壓力,提高響應速度。

二 、反向 Proxy伺服器的工作原理

  反向 Proxy伺服器通常有兩種模型,它可以作為內容伺服器的替身,也可以作為內容伺服器叢集的負載平衡器。

   1,作內容伺服器的替身                     

  如果您的內容伺服器具有必須保持安全的敏感資訊,如信用卡號資料庫,可在防火牆外部設定一個Proxy 伺服器作為內容伺服器的替身。當外部客戶機嘗試訪問內容伺服器時,會將其送到Proxy 伺服器。實際內容位於內容伺服器上,在防火牆內部受到安全保護。Proxy 伺服器位於防火牆外部,在客戶機看來就像是內容伺服器。

  當客戶機向網站提出請求時,請求將轉到Proxy 伺服器。然後,Proxy 伺服器通過防火牆中的特定通路,將客戶機的請求發送到內容伺服器。內容伺服器再通過該通道將結果回傳給Proxy 伺服器。Proxy 伺服器將檢索到的資訊發送給客戶機,好像Proxy 伺服器就是實際的內容伺服器(參見圖 2)。如果內容伺服器返回錯誤訊息,Proxy 伺服器會先行截取該訊息並更改標題中列出的任何 URL,然後再將訊息發送給客戶機。如此可防止外部客戶機擷取內部內容伺服器的重新導向 URL。

  這樣,Proxy 伺服器就在安全資料庫和可能的惡意攻擊之間提供了又一道屏障。與有權訪問整個資料庫的情況相對比,就算是僥倖攻擊成功,作惡者充其量也僅限於訪問單個事務中所涉及的資訊。未經授權的使用者無法訪問到真正的內容伺服器,因為防火牆通路只允許Proxy 伺服器有權進行訪問。

    2,作為內容伺服器的負載平衡器

  可以在一個組織內使用多個Proxy 伺服器來平衡各 Web 服務器間的網路負載。在此模型中,可以利用Proxy 伺服器的快取特性,建立一個用於Server Load Balancer的伺服器集區。此時,Proxy 伺服器可以位於防火牆的任意一側。如果 Web 服務器每天都會接收大量的請求,則可以使用Proxy 伺服器分擔 Web 服務器的負載並提高網路訪問效率。

  對於客戶機發往真正伺服器的請求,Proxy 伺服器起著中間調停者的作用。Proxy 伺服器會將所請求的文檔存入快取。如果有不止一個Proxy 伺服器,DNS 可以採用“迴圈複用法”選擇其 IP 位址,隨機地為請求選擇路由。客戶機每次都使用同一個 URL,但請求所採取的路由每次都可能經過不同的Proxy 伺服器。

  可以使用多個Proxy 伺服器來處理對一個高用量內容伺服器的請求,這樣做的好處是內容伺服器可以處理更高的負載,並且比其獨自工作時更有效率。在初始啟動期間,Proxy 伺服器首次從內容伺服器檢索文檔,此後,對內容伺服器的請求數會大大下降。

三、反向 Proxy的好處

1、 解決了網站伺服器對外可見的問題;

2、節約了有限的IP地址資源,企業內所有的網站共用一個在internet中註冊的IP地址,這些伺服器分配私人地址,採用虛擬機器主機的方式對外提供服務;

3、 保護了真實的web伺服器,web伺服器對外不可見,外網只能看到反向 Proxy伺服器,而反向 Proxy伺服器上並沒有真實資料,因此,保證了web伺服器的資源安全;

4、 加速了對網站訪問速度,減輕web伺服器的負擔,反向 Proxy具有緩衝網頁的功能,如果使用者需要的內容在緩衝中,則可以直接從代理服務其中擷取,減輕了web伺服器的負荷,同時也加快了使用者的訪問速度。

 

四、Nginx作為反向 Proxy實現負載平衡的樣本

因為nginx在處理並發方面的優勢,現在這個應用非常常見。當然了Apache的 mod_proxy和mod_cache結合使用也可以實現對多台app server的反向 Proxy和負載平衡,但是在並發處理方面apache還是沒有nginx擅長。

1)環境:

  a. 我們本地是Windows系統,然後使用VirutalBox安裝一個虛擬Linux系統。在本地的Windows系統上分別安裝nginx(偵聽 8080連接埠)和apache(偵聽80連接埠)。在虛擬Linux系統上安裝apache(偵聽80連接埠)。這樣我們相當於擁有了1台nginx在前端 作為反向 Proxy伺服器;後面有2台apache作為應用程式伺服器(可以看作是小型的server cluster。;-) );

  b. nginx用來作為反向 Proxy伺服器,放置到兩台apache之前,作為使用者訪問的入口;nginx僅僅處理靜態頁面,動態頁面(php請求)統統都交付給背景兩台apache來處理。也就是說,可以把我們網站的靜態頁面或者檔案放置到nginx的目錄下;動態頁面和資料庫訪問都保留到背景apache伺服器上。

  c. 如下介紹兩種方法實現server cluster的負載平衡。

  我們假設前端nginx(為127.0.0.1:80)僅僅包含一個靜態頁面index.html;背景兩個apache伺服器(分別為localhost:80和158.37.70.143:80),一台根目錄放置phpMyAdmin檔案夾 和test.php(裡面測試代碼為print "server1";),另一台根目錄僅僅放置一個test.php(裡面測試代碼為print "server2";)。

2)針對不同請求的負載平衡:

  a. 在最簡單地構建反向 Proxy的時候(nginx僅僅處理靜態不處理動態內容,動態內容交給背景apache server來處理),我們具體的設定為:在nginx.conf中修改: location ~ /.php$ { proxy_pass 158.37.70.143:80 ; }

  這樣當用戶端訪問localhost:8080/index.html的時候,前端的nginx會自動進行響應;

  當使用者訪問localhost:8080/test.php的時候(這個時候nginx目錄下根本就沒有該檔案),但是通過上面的設定 location ~ /.php$(表示Regex匹配以.php結尾的檔案,詳情參看location是如何定義和匹配的http://wiki.nginx.org /NginxHttpCoreModule) ,nginx伺服器會自動pass給158.37.70.143的apache伺服器了。該伺服器下的test.php就會被自動解析,然後將html的 結果頁面返回給nginx,然後nginx進行顯示(如果nginx使用memcached模組或者squid還可以支援緩衝),輸出結果為列印 server2。

  如上是最為簡單的使用nginx做為反向 Proxy伺服器的例子;

  b. 我們現在對如上例子進行擴充,使其支援如上的兩台伺服器。

  我們設定nginx.conf的server模組部分,將對應部分修改為:

  location ^~ /phpMyAdmin/ { proxy_pass 127.0.0.1:80 ; }location ~ /.php$ { proxy_pass 158.37.70.143:80 ; }

  上面第一個部分location ^~ /phpMyAdmin/,表示不使用Regex匹配(^~),而是直接匹配,也就是如果用戶端訪問的URL是以http: //localhost:8080/phpMyAdmin/ 開頭的話(本地的nginx目錄下根本沒有phpMyAdmin目錄),nginx會自動pass到127.0.0.1:80 的Apache伺服器,該伺服器對phpMyAdmin目錄下的頁面進行解析,然後將結果發送給nginx,後者顯示;

  如果用戶端訪問URL是http://localhost/test.php 的話,則會被pass到158.37.70.143:80 的apache進行處理。

  因此綜上,我們實現了針對不同請求的負載平衡。

  如果使用者訪問靜態頁面index.html,最前端的nginx直接進行響應;

  如果使用者訪問test.php頁面的話,158.37.70.143:80 的Apache進行響應;

  如果使用者訪問目錄phpMyAdmin下的頁面的話,127.0.0.1:80 的Apache進行響應;

3)訪問同一頁面的負載平衡:

  即使用者訪問http://localhost:8080/test.php 這個同一頁面的時候,我們實現兩台伺服器的負載平衡(實際情況中,這兩個伺服器上的資料要求同步一致,這裡我們分別定義了列印server1和server2是為了進行辨認區別)。

  a. 現在我們的情況是在windows下nginx是localhost偵聽8080連接埠;

  兩台apache,一台是127.0.0.1:80(包含test.php頁面但是列印server1),另一台是虛擬機器的158.37.70.143:80(包含test.php頁面但是列印server2)。

  b. 因此重新設定nginx.conf為:

  首先在nginx的設定檔nginx.conf的http模組中添加,伺服器叢集server cluster(我們這裡是兩台)的定義: upstream myCluster { server 127.0.0.1:80 ; server 158.37.70.143:80 ; }表示這個server cluster包含2台伺服器>然後在server模組中定義,負載平衡: location ~ /.php$ { proxy_pass http://myCluster ; #這裡的名字和上面的cluster的名字相同proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }這樣的話,如果訪問http://localhost:8080/test.php 頁面的話,nginx目錄下根本沒有該檔案,但是它會自動將其pass到myCluster定義的服務區機群中,分別由127.0.0.1:80;或者 158.37.70.143:80;來做處理。上面在定義upstream的時候每個server之後沒有定義權重,表示兩者均衡;如果希望某個更多響應 的話例如: upstream myCluster { server 127.0.0.1:80 weight=5;server 158.37.70.143:80 ; }這樣表示5/6的幾率訪問第一個server,1/6訪問第二個。另外還可以定義max_fails和fail_timeout等參數。

 

  綜上,我們使用nginx的反向 Proxy伺服器reverse proxy server的功能,將其布置到多台apache server的前端。

  nginx僅僅用來處理靜態頁面響應和動態請求的代理pass,背景apache server作為app server來對前台pass過來的動態網頁面進行處理並返回給nginx。

  通過以上的架構,我們可以實現nginx和多台apache構成的機群cluster的負載平衡。兩種均衡:

  1)可以在nginx中定義訪問不同的內容,代理到不同的後台server;如上例子中的訪問phpMyAdmin目錄代理到第一台server上;訪問test.php代理到第二台server上;

  2)可以在nginx中定義訪問同一頁面,均衡(當然如果伺服器效能不同可以定義權重來均衡)地代理到不同的後台server上。如上的例子訪問test.php頁面,會均衡地代理到server1或者server2上。

  實際應用中,server1和server2上分別保留相同的app程式和資料,需要考慮兩者的資料同步。

 

 

 

文章轉自: http://www.cnblogs.com/heluo/p/3922770.html

      http://blog.csdn.net/keyeagle/article/details/6723408

 

 

  

 

轉:反向 Proxy伺服器的工作原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.