反向代理服務器(轉)

反向代理及Nginx示例

1 反向代理的概念

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個服務器。php

一般的代理服務器,只用於代理內部網絡對Internet外部網絡的鏈接請求,客戶機必須指定代理服務器,並將原本要直接發送到Web服務器上的 http請求發送到代理服務器中。不支持外部網絡對內部網絡的鏈接請求,由於內部網絡對外部網絡是不可見的。當一個代理服務器可以代理外部網絡上的主機, 訪問內部網絡時,這種代理服務的方式稱爲反向代理服務。此時代理服務器對外就表現爲一個Web服務器,外部網絡就能夠簡單把它看成一個標準的Web服務器 而不須要特定的配置。不一樣之處在於,這個服務器沒有保存任何網頁的真實數據,全部的靜態網頁或者CGI程序,都保存在內部的Web服務器上。所以對反向代 理服務器的攻擊並不會使得網頁信息遭到破壞,這樣就加強了Web服務器的安全性。html

反向代理就是一般所說的web服務器加速,它是一種經過在繁忙的web服務器和外部網絡之間增長一個高速的web緩衝服務器來下降實際的web服務 器的負載的一種技術。反向代理是針對web服務器提升加速功能,做爲代理緩存,它並非針對瀏覽器用戶,而針對一臺或多臺特定的web服務器,它能夠代理 外部網絡對內部網絡的訪問請求。前端

方向代理服務器會強制將外部網絡對要代理的服務器的訪問通過它,這樣反向代理服務器負責接收客戶端的請求,而後到源服務器上獲取內容,把內容返回給 用戶,並把內容保存到本地,以便往後再收到一樣的信息請求時,它會把本地緩存裏的內容直接發給用戶,以減小後端web服務器的壓力,提升響應速度。nginx

2 反向代理服務器與內容服務器

代理服務器充當服務器的替身,若是您的內容服務器具備必須保持安全的敏感信息,如信用卡號數據庫,可在防火牆外部設置一個代理服務器做爲內容服務器 的替身。當外部客戶機嘗試訪問內容服務器時,會將其送到代理服務器。實際內容位於內容服務器上,在防火牆內部受到安全保護。代理服務器位於防火牆外部,在 客戶機看來就像是內容服務器。web

當客戶機向站點提出請求時,請求將轉到代理服務器。而後,代理服務器經過防火牆中的特定通路,將客戶機的請求發送到內容服務器。內容服務器再經過該 通道將結果回傳給代理服務器。代理服務器將檢索到的信息發送給客戶機,好像代理服務器就是實際的內容服務器。若是內容服務器返回錯誤消息,代理服務器會先 行截取該消息並更改標頭中列出的任何URL,而後再將消息發送給客戶機。如此可防止外部客戶機獲取內部內容服務器的重定向URL。正則表達式

這樣,代理服務器就在安全數據庫和可能的惡意攻擊之間提供了又一道屏障。文章來源:一塊兒遛書網www.176book.com。與有權訪問整個數據 庫的狀況相對比,就算是僥倖攻擊成功,做惡者充其量也僅限於訪問單個事務中所涉及的信息。未經受權的用戶沒法訪問到真正的內容服務器,由於防火牆通路只允 許代理服務器有權進行訪問。數據庫

3 反向代理服務器的工做流程

1) 用戶經過域名發出訪問web服務器的請求,該域名被DNS服務器解析爲反向代理服務器的IP地址;apache

2) 反向代理服務器接受用戶的請求;windows

3) 反向代理服務器在本地緩存中查找請求的內容,找到後直接把內容發送給用戶;後端

4) 若是本地緩存裏沒有用戶所請求的信息內容,反向代理服務器會代替用戶向源服務器請求一樣的信息內容,並把信息內容發給用戶,若是信息內容是緩存的還會把它保存到緩存中。

4 反向代理的好處

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

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

3) 保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上並無真實數據,所以,保證了web服務器的資源安全;

4) 加速了對網站訪問速度,減輕web服務器的負擔,反向代理具備緩存網頁的功能,若是用戶須要的內容在緩存中,則能夠直接從代理服務其中獲取,減輕了web服務器的負荷,同時也加快了用戶的訪問速度。

5 Nginx做爲反向代理實現負載均衡的示例

咱們介紹了nginx這個輕量級的高性能server主要能夠乾的兩件事情:

直接做爲http server(代替apache,對PHP須要FastCGI處理器支持,這個咱們以後介紹);

另一個功能就是做爲反向代理服務器實現負載均衡(以下咱們就來舉例說明實際中如何使用nginx實現負載均衡)。

由於nginx在處理併發方面的優點,如今這個應用很是常見。文章來源:一塊兒遛書網www.176book.com。固然了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://blog.csdn.net/xuqianghit/article/details/6576621

相關文章
相關標籤/搜索