整個網絡請求的大概流程圖如下:
我們有講過 客戶端緩存 和DNS緩存,那我們今天主要講反向代理。
一、什么是反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然后將請求轉發給內部網絡上的服務器;並將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。
通常的代理服務器,只用於代理內部網絡對Internet外部網絡的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的 http請求發送到代理服務器中。不支持外部網絡對內部網絡的連接請求,因為內部網絡對外部網絡是不可見的。當一個代理服務器能夠代理外部網絡上的主機, 訪問內部網絡時,這種代理服務的方式稱為反向代理服務。此時代理服務器對外就表現為一個Web服務器,外部網絡就可以簡單把它當作一個標准的Web服務器 而不需要特定的配置。不同之處在於,這個服務器沒有保存任何網頁的真實數據,所有的靜態網頁或者CGI程序,都保存在內部的Web服務器上。因此對反向代 理服務器的攻擊並不會使得網頁信息遭到破壞,這樣就增強了Web服務器的安全性。
反向代理就是通常所說的web服務器加速,它是一種通過在繁忙的web服務器和外部網絡之間增加一個高速的web緩沖服務器來降低實際的web服務 器的負載的一種技術。反向代理是針對web服務器提高加速功能,作為代理緩存,它並不是針對瀏覽器用戶,而針對一台或多台特定的web服務器,它可以代理 外部網絡對內部網絡的訪問請求。
反向代理服務器會強制將外部網絡對要代理的服務器的訪問經過它,這樣反向代理服務器負責接收客戶端的請求,然后到源服務器上獲取內容,把內容返回給 用戶,並把內容保存到本地,以便日后再收到同樣的信息請求時,它會把本地緩存里的內容直接發給用戶,以減少后端web服務器的壓力,提高響應速度。
二 、反向代理服務器的工作原理
反向代理服務器通常有兩種模型,它可以作為內容服務器的替身,也可以作為內容服務器集群的負載均衡器。
1,作內容服務器的替身
如果您的內容服務器具有必須保持安全的敏感信息,如信用卡號數據庫,可在防火牆外部設置一個代理服務器作為內容服務器的替身。當外部客戶機嘗試訪問內容服務器時,會將其送到代理服務器。實際內容位於內容服務器上,在防火牆內部受到安全保護。代理服務器位於防火牆外部,在客戶機看來就像是內容服務器。
當客戶機向站點提出請求時,請求將轉到代理服務器。然后,代理服務器通過防火牆中的特定通路,將客戶機的請求發送到內容服務器。內容服務器再通過該通道將結果回傳給代理服務器。代理服務器將檢索到的信息發送給客戶機,好像代理服務器就是實際的內容服務器(參見圖 2)。如果內容服務器返回錯誤消息,代理服務器會先行截取該消息並更改標頭中列出的任何 URL,然后再將消息發送給客戶機。如此可防止外部客戶機獲取內部內容服務器的重定向 URL。
這樣,代理服務器就在安全數據庫和可能的惡意攻擊之間提供了又一道屏障。與有權訪問整個數據庫的情況相對比,就算是僥幸攻擊成功,作惡者充其量也僅限於訪問單個事務中所涉及的信息。未經授權的用戶無法訪問到真正的內容服務器,因為防火牆通路只允許代理服務器有權進行訪問。
2,作為內容服務器的負載均衡器
可以在一個組織內使用多個代理服務器來平衡各 Web 服務器間的網絡負載。在此模型中,可以利用代理服務器的高速緩存特性,創建一個用於負載平衡的服務器池。此時,代理服務器可以位於防火牆的任意一側。如果 Web 服務器每天都會接收大量的請求,則可以使用代理服務器分擔 Web 服務器的負載並提高網絡訪問效率。
對於客戶機發往真正服務器的請求,代理服務器起着中間調停者的作用。代理服務器會將所請求的文檔存入高速緩存。如果有不止一個代理服務器,DNS 可以采用“循環復用法”選擇其 IP 地址,隨機地為請求選擇路由。客戶機每次都使用同一個 URL,但請求所采取的路由每次都可能經過不同的代理服務器。
可以使用多個代理服務器來處理對一個高用量內容服務器的請求,這樣做的好處是內容服務器可以處理更高的負載,並且比其獨自工作時更有效率。在初始啟動期間,代理服務器首次從內容服務器檢索文檔,此后,對內容服務器的請求數會大大下降。
三、反向代理的好處
1、 解決了網站服務器對外可見的問題;
2、節約了有限的IP地址資源,企業內所有的網站共享一個在internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務;
3、 保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上並沒有真實數據,因此,保證了web服務器的資源安全;
4、 加速了對網站訪問速度,減輕web服務器的負擔,反向代理具有緩存網頁的功能,如果用戶需要的內容在緩存中,則可以直接從代理服務其中獲取,減輕了web服務器的負荷,同時也加快了用戶的訪問速度。
四、Nginx作為反向代理實現負載均衡的示例
因為nginx在處理並發方面的優勢,現在這個應用非常常見。當然了Apache的 mod_proxy和mod_cache結合使用也可以實現對多台app server的反向代理和負載均衡,但是在並發處理方面apache還是沒有nginx擅長。
1)環境:
a. 我們本地是Windows系統,然后使用VirutalBox安裝一個虛擬的Linux系統。在本地的Windows系統上分別安裝nginx(偵聽 8080端口)和apache(偵聽80端口)。在虛擬的Linux系統上安裝apache(偵聽80端口)。這樣我們相當於擁有了1台nginx在前端 作為反向代理服務器;后面有2台apache作為應用程序服務器(可以看作是小型的server cluster。;-) );
b. nginx用來作為反向代理服務器,放置到兩台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. 在最簡單地構建反向代理的時候(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$(表示正則表達式匹配以.php結尾的文件,詳情參看location是如何定義和匹配的http://wiki.nginx.org /NginxHttpCoreModule) ,nginx服務器會自動pass給158.37.70.143的apache服務器了。該服務器下的test.php就會被自動解析,然后將html的 結果頁面返回給nginx,然后nginx進行顯示(如果nginx使用memcached模塊或者squid還可以支持緩存),輸出結果為打印 server2。
如上是最為簡單的使用nginx做為反向代理服務器的例子;
b. 我們現在對如上例子進行擴展,使其支持如上的兩台服務器。
我們設置nginx.conf的server模塊部分,將對應部分修改為:
location ^~ /phpMyAdmin/ { proxy_pass 127.0.0.1:80 ; }location ~ /.php$ { proxy_pass 158.37.70.143:80 ; }
上面第一個部分location ^~ /phpMyAdmin/,表示不使用正則表達式匹配(^~),而是直接匹配,也就是如果客戶端訪問的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的反向代理服務器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/smallrookie/p/5634738.html