上一篇關於Nginx的文章介紹了Nginx作為Web服務器的特點以及在Windows系統下搭建Nginx+PHP環境的相關配置。Nginx作為服務器的優點是配置簡單,響應快,所以不少大型網站會使用Nginx作為前排服務器,將請求轉發到后排的Apache、Squid之類的服務器,這時就需要用到"反向代理"這一特點。本文以一個簡單的轉發需求為例,講解搭建反向代理的基本操作。盡管這個例子很簡單,但只要理解了工作和配置原理,就能應對更復雜的需求。
目的:兩個通過路由器連接在同一局域網的系統(本例中為虛擬機)分別安裝Nginx、Apache作服務器軟件,在安裝Nginx的系統上搭建反向代理。
環境:VMWare Workstation 9.0,Win7系統(安裝Nginx),WinXP系統(安裝Apache)
反向代理概念[1]:
先理解正向代理。假設用戶A需要訪問網站C(這個網站正常工作),但通過瀏覽器發現訪問不到(可能是國外網站,被牆了)。又知有一代理服務器B,A可以訪問B,B可以訪問C,所以A可以通過B作代理訪問C了。這時B作中轉站,由A發給C的流量最終從A發向B,B負責轉發到C,由C發給A的流量也一樣道理,事實上A通過跳板B而訪問C;
再看反向代理。假設用戶A訪問服務器B,要從B網站獲取X文件。然而服務器B上沒有X文件。這時B充當反向代理,根據配置條件在另一個指定的服務器C(可以在同一局域網,也可以不在)上把X文件取回來,然后返回給A。B作為一個接口服務器,把背后C服務器(不止一個,有可能上百個Server)隱藏起來。用戶A需要訪問這一群服務器時,統一由B接收請求,根據B的配置從不同的服務器讀取需要的數據。從用戶的角度看,A並不知道實際訪問了哪個服務器,只知道一個服務器B。反向代理通常是基於安全需要,有利於統一化網站。
步驟詳解:
1. 安裝服務器軟件
在虛擬機上安裝好Win7、WinXP系統。在Win7上安裝Nginx[2],在XP上安裝Apache(為了方便,本例使用APMServ軟件[3])。開啟相關服務后(端口均為80),在兩個系統的瀏覽器中訪問127.0.0.1(APMServ中可以將默認網站目錄的phpinfo.php更名為index.php),能夠正常訪問即可。
2. 配置固定IP
反向代理有根據域名和根據路徑兩個情況。為了方便,現在先把兩個系統的IP固定下來,並綁定兩個域名(不需要經過外網DNS,修改hosts文件就可以)。由於兩個虛擬機采用橋接的方式連接路由器,所以在路由器的設置后台頁面中(192.168.1.1),綁定兩個虛擬系統的IP地址(開啟DHCP則在固定IP分配中用MAC綁定IP,關閉則在兩個虛擬系統中使用靜態IP方式連接)。本例中Win7的IP為192.168.1.161,WinXP的IP為192.168.1.160,從DHCP的客戶端列表能看到(KavMors客戶為主機)。使用DHCP時如果虛擬機無法連接到路由器,嘗試先點擊【虛擬機->可移動設備->網絡適配器->斷開連接】斷開虛擬機的網卡,再重新連接上。

在實際系統中,通過瀏覽器訪問192.168.1.160和192.168.1.161,可以看到APMServ和Nginx的主頁


3. 綁定域名
這一步需要把域名和IP綁定起來。域名不需要申請,修改一下hosts文件就可以了。打開hosts文件:C:\Windows\System32\drivers\etc,用記事本打開hosts文件,再結尾的地方把自定義的域名和192.168.1.161對應輸入:

注意兩個域名都要綁定192.168.1.161這個IP。因為本例需要用Nginx作反向代理,無論是vm-xp.com還是xm-win7.com,都要經過Nginx(1.161)。保存修改后,在瀏覽器訪問這兩個域名,都可以訪問到Win7中的Nginx。
4. 基於域名的反向代理配置
現在作以下假設:虛擬機Win7和WinXp在同一局域網中,但與主機不在同一局域網中(實際上是在的),主機不能訪問192.168.1.160但可以通過域名訪問192.168.1.161。這時有以下需求:通過www.vm-win7.com可以訪問Win7的網站目錄,通過www.vm-xp.com可以訪問WinXP的網站目錄。但由於兩個域名都指向Win7的IP,所以要在Win7的Nginx上建反向代理。
在Win7中,從Nginx的目錄打開conf/nginx.conf編輯:
4.1 把#37行改為 server_name localhost www.vm-win7.com,表示當域名為localhost或www.vm-wim7.com時,使用這個server區域的配置;
4.2 在第一個server區域結束后(#80行),加入新的server配置,如下圖:

server_name表示當域名為www.vm-xp.com時使用這個server的配置,proxy_pass是反向代理的配置語句,表示請求映射到192.168.1.160:80。保存后打開cmd,cd命令進入nginx的目錄后,輸入nginx -s reload,重啟nginx。
在瀏覽器中分別訪問兩個域名,可以發現兩個域名已經定向到Win7和WinXP的主頁了。Nginx反向代理把win7.com的的流量交給自己處理,把winxp.com的流量交給192.168.1.160(VM-XP)的80端口處理。雖然兩個域名指向同一IP,但可以訪問不同的主機。
5. 基於路徑的反向代理配置
在第4點中,根據不同域名可從同一IP訪問不同的主機。現在作以下假設:只有一個域名www.vm-win7.com,這個域名綁定到192.168.1.161,192.168.1.160不可被實際主機直接訪問。需配置一反向代理,當訪問www.vm-win7.com/xp/時,訪問vm-xp的網站目錄,其余路徑訪問vm-win7的目錄。
在Win7中,從Nginx的目錄打開conf/nginx.conf編輯:
5.1 在#42行中,插入以下紅色框內的內容:

表示訪問/xp時映射到192.168.1.160(vm-xp)上,下面三個proxy_set_header參數表示傳遞頭信息參數。保存后打開cmd,cd命令進入nginx的目錄后,輸入nginx -s reload,重啟nginx。
當訪問www.vm-win7.com時,可以訪問到vm-win7的Nginx目錄;訪問www.vm-win7.com/xp/時,可以訪問到vm-xp的Apache目錄。
6. 總結
本文講述了Nginx配置反向代理的基本設置。反向代理可基於域名或基於路徑轉發,本質上沒太大區別,但有條件的話,建議使用基於域名的轉發。基於路徑會出現網站根目錄和域名根目錄不對應的情況,如上述例子中,在訪問www.vm-win7.com/xp/時,會發現phpinfo頁面的圖標不能顯示(如下圖)。

通過審查元素可發現圖片被定義到www.vm-win7.com/index.php中,但實際上URL應該是www.vm-win7.com/xp/index.php(改為【src="./index?“】則正常)。而使用基於域名的轉發則不存在這種情況。

實際上反向代理的配置還有很多可選參數,也可以與負載均衡聯系一起使用。有興趣可以自行搜索學習,本文就不詳細講述了。
參考資料及引用:
[1] 反向代理概念: Nginx 反向代理、負載均衡、頁面緩存、URL重寫及讀寫分離詳解.
http://www.360doc.com/content/13/1114/12/7694408_329125489.shtml
[2] Windows下安裝及配置Nginx: Http服務器基本配置[Windows + Nginx + MySQL + phpMyAdmin].
http://www.cnblogs.com/kavmors/p/4295585.html
[3] APMServ官方網站: 張宴的博客. 《APMServ 5.2.6》:一鍵快速搭建Apache+PHP+MySQL+Nginx+Memcached+ASP平台的綠色軟件.
http://zyan.cc/apmserv/
