nginx反向代理原理简介
From:http://zcnick.blog.51cto.com/1992444/774662
?
1、反向代理的概念
??反向代理(Reverse?Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發(fā)給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。
通常的代理服務器,只用于代理內部網絡對Internet外部網絡的連接請求,客戶機必須指定代理服務器,并將本來要直接發(fā)送到Web服務器上的http請求發(fā)送到代理服務器中。不支持外部網絡對內部網絡的連接請求,因為內部網絡對外部網絡是不可見的。當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式稱為反向代理服務。此時代理服務器對外就表現為一個Web服務器,外部網絡就可以簡單把它當作一個標準的Web服務器而不需要特定的配置。不同之處在于,這個服務器沒有保存任何網頁的真實數據,所有的靜態(tài)網頁或者CGI程序,都保存在內部的Web服務器上。因此對反向代理服務器的***并不會使得網頁信息遭到破壞,這樣就增強了Web服務器的安全性。
反向代理就是通常所說的web服務器加速,它是一種通過在繁忙的web服務器和外部網絡之間增加一個高速的web緩沖服務器來降低實際的web服務器的負載的一種技術。反向代理是針對web服務器提高加速功能,作為代理緩存,它并不是針對瀏覽器用戶,而針對一臺或多臺特定的web服務器,它可以代理外部網絡對內部網絡的訪問請求。
方向代理服務器會強制將外部網絡對要代理的服務器的訪問經過它,這樣反向代理服務器負責接收客戶端的請求,然后到源服務器上獲取內容,把內容返回給用戶,并把內容保存到本地,以便日后再收到同樣的信息請求時,它會把本地緩存里的內容直接發(fā)給用戶,以減少后端web服務器的壓力,提高響應速度。
?
?
2、反向代理服務器與內容服務器
??代理服務器充當服務器的替身,如果您的內容服務器具有必須保持安全的敏感信息,如信用卡號數據庫,可在防火墻外部設置一個代理服務器作為內容服務器的替身。當外部客戶機嘗試訪問內容服務器時,會將其送到代理服務器。實際內容位于內容服務器上,在防火墻內部受到安全保護。代理服務器位于防火墻外部,在客戶機看來就像是內容服務器。
當客戶機向站點提出請求時,請求將轉到代理服務器。然后,代理服務器通過防火墻中的特定通路,將客戶機的請求發(fā)送到內容服務器。內容服務器再通過該通道將結果回傳給代理服務器。代理服務器將檢索到的信息發(fā)送給客戶機,好像代理服務器就是實際的內容服務器。如果內容服務器返回錯誤消息,代理服務器會先行截取該消息并更改標頭中列出的任何URL,然后再將消息發(fā)送給客戶機。如此可防止外部客戶機獲取內部內容服務器的重定向URL。
這樣,代理服務器就在安全數據庫和可能的惡意***之間提供了又一道屏障。與有權訪問整個數據庫的情況相對比,就算是僥幸***成功,作惡者充其量也僅限于訪問單個事務中所涉及的信息。未經授權的用戶無法訪問到真正的內容服務器,因為防火墻通路只允許代理服務器有權進行訪問。
?
?
3、反向代理服務器的工作流程
1)?用戶通過域名發(fā)出訪問web服務器的請求,該域名被DNS服務器解析為反向代理服務器的IP地址;
2)?反向代理服務器接受用戶的請求;
3)?反向代理服務器在本地緩存中查找請求的內容,找到后直接把內容發(fā)送給用戶;
4)?如果本地緩存里沒有用戶所請求的信息內容,反向代理服務器會代替用戶向源服務器請求同樣的信息內容,并把信息內容發(fā)給用戶,如果信息內容是緩存的還會把它保存到緩存中。
?
?
4、反向代理的好處
1)?解決了網站服務器對外可見的問題;
2)?節(jié)約了有限的IP地址資源,企業(yè)內所有的網站共享一個在internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務;
3)?保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上并沒有真實數據,因此,保證了web服務器的資源安全;
4)?加速了對網站訪問速度,減輕web服務器的負擔,反向代理具有緩存網頁的功能,如果用戶需要的內容在緩存中,則可以直接從代理服務其中獲取,減輕了web服務器的負荷,同時也加快了用戶的訪問速度。
?
?
5、Nginx作為反向代理實現負載均衡的示例
我們介紹了nginx這個輕量級的高性能server主要可以干的兩件事情:
直接作為http?server(代替apache,對PHP需要FastCGI處理器支持,這個我們之后介紹);
另外一個功能就是作為反向代理服務器實現負載均衡(如下我們就來舉例說明實際中如何使用nginx實現負載均衡)。
因為nginx在處理并發(fā)方面的優(yōu)勢,現在這個應用非常常見。當然了Apache的mod_proxy和mod_cache結合使用也可以實現對多臺app?server的反向代理和負載均衡,但是在并發(fā)處理方面apache還是沒有nginx擅長。
?
1)環(huán)境:
a.?我們本地是Windows系統,然后使用VirutalBox安裝一個虛擬的Linux系統。在本地的Windows系統上分別安裝nginx(偵聽8080端口)和apache(偵聽80端口)。在虛擬的Linux系統上安裝apache(偵聽80端口)。這樣我們相當于擁有了1臺nginx在前端作為反向代理服務器;后面有2臺apache作為應用程序服務器(可以看作是小型的server?cluster。;-)?);
b.?nginx用來作為反向代理服務器,放置到兩臺apache之前,作為用戶訪問的入口;nginx僅
僅處理靜態(tài)頁面,動態(tài)的頁面(php請求)統統都交付給后臺的兩臺apache來處理。也就是說,可以把我們網站的靜態(tài)頁面或者文件放置到nginx的目錄下;動態(tài)的頁面和數據庫訪問都保留到后臺的apache服務器上。
c.?如下介紹兩種方法實現server?cluster的負載均衡。
我們假設前端nginx(為127.0.0.1:80)僅僅包含一個靜態(tài)頁面index.html;
后臺的兩個apache服務器(分別為localhost:80和158.37.70.143:80),一臺根目錄放置phpMyAdmin文件夾和test.php(里面測試代碼為print?"server1";),另一臺根目錄僅僅放置一個test.php(里面測試代碼為print?"server2";)。
?
2)針對不同請求的負載均衡:
a.?在最簡單地構建反向代理的時候(nginx僅僅處理靜態(tài)不處理動態(tài)內容,動態(tài)內容交給后臺的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?~^?/nagios/?{
?????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目錄下的頁面進行解析,然后將結果發(fā)送給nginx,后者顯示;
如果客戶端訪問URL是http://localhost/test.php?的話,則會被pass到158.37.70.143:80?的
apache進行處理。
因此綜上,我們實現了針對不同請求的負載均衡。
如果用戶訪問靜態(tài)頁面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是為了進行辨認區(qū)別)。
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定義的服務區(qū)機群中,分別由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僅僅用來處理靜態(tài)頁面響應和動態(tài)請求的代理pass,后臺的apache?server作為app?server來對前臺pass過來的動態(tài)頁面進行處理并返回給nginx。
?
?
通過以上的架構,我們可以實現nginx和多臺apache構成的機群cluster的負載均衡。兩種均衡:
1)可以在nginx中定義訪問不同的內容,代理到不同的后臺server;如上例子中的訪問phpMyAdmin目錄代理到第一臺server上;訪問test.php代理到第二臺server上;
2)可以在nginx中定義訪問同一頁面,均衡(當然如果服務器性能不同可以定義權重來均衡)地代理到不同的后臺server上。如上的例子訪問test.php頁面,會均衡地代理到server1或者server2上。
實際應用中,server1和server2上分別保留相同的app程序和數據,需要考慮兩者的數據同步。
轉載于:https://blog.51cto.com/wameide/1607264
總結
以上是生活随笔為你收集整理的nginx反向代理原理简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux上部署hadoop集群 HA-
- 下一篇: pybot --help