通常我們在Internet上使用的代理服務方式是正向代理方式,只用于代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,并將本來要直接發送到Web服務器上的http請求發送到代理服務器中。
在這種情況下,由于外部網絡上的主機并不會配置并使用這個代理服務器,普通代理服務器也被設計為在Internet上搜尋多個不確定的服務器,而不是針對Internet上多個客戶機的請求訪問內部的某一個固定的服務器,因此一般情況下,對Web Server的代理服務都不支持外部對內部網絡的訪問請求。
當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式稱為反向代理服務方式。
此時的代理服務對外就表現為一個Web服務器,外部網絡就可以簡單把它當作一個標準的Web服務器而不需要特定的配置。
不同之處在于,這個服務器沒有保存任何網頁的真實數據,所有的靜態網頁或者CGI程序,都保存在內部的Web服務器上。
一般園區網或校園網有多臺在內網上提供公共服務的Web服務器,一臺配置了公網IP地址的Apache服務器,這些服務器統一采用了VMware vSphere 5下虛擬出的多個Redhat Linux系統的虛擬機,配置了Apache HTTP Server、PHP編譯環境和Oracle10g。
其中,在安裝公網IP地址的Apache服務器時,對Apache HTTP Server的源代碼經行了編譯和和重新配置,當反向代理方式調試成功后,就可以允許外部的互聯網使用者通過透過邊界路由訪問內部園區網上的這些Web服務器。
筆者單位所使用的搭建反向代理的這臺Apache HTTP Server的配置環境是Redhat Linux8.0、Apache 1.3.24,單位的域名假設是AAA.com。比如,單位劃分內網與外網的邊界路由上有e0與e1兩個模塊。
其中e0端口為對外端口,指向反向代理服務器外部公共地址的設為1.2.3.4。e1端口為對應內網的網關,把地址設為192.168.2.1,然后給反向代理Apache HTTP Server再加一個內網地址192.168.2.2。
同時假設內網上使用著 3臺 Web服務器 A、B和C,它們對應的域名分別為A.AAA.com、B.AAA.com 和C.AAA.com,三 臺 Web服 務器配置的內部地址分別為192.168.2.3、192.168.2.3和192.168.2.5。
假設園區網絡中心在公網上注冊的外部IP為1.2.3.4,那么在這個局域網的環境下DNS服務器上配置內部3臺Web服務器域名的IP解析地址就均為1.2.3.4。
這 樣,當 在 外 部Internet上解析A.AAA.com、B.AAA.com 和 C.AAA.com時,均會指向同一IP地址即Apache HTTP Server的公網接口地址1.2.3.4。
從Apache官方網站(http://www.apache.org)下載Apache的版本Apache 1.3.24編譯包到Redhat Linux的root目錄下。
比如,本次安裝采用Apache的下載地址為http://www.apache.org/dist/httpd/apache_1.3.24.tar.gz。
由于Apache默認允許的最多連接數為256,而在一個高并發、大流量的網站上這一連接數量是不能滿足用戶需要的,特別是本文介紹的通過防火墻上的Apache反向代理允許外部用戶訪問多個內部Web服務器的情況。
那么當連接數量多時如何處理呢?這時可以采用更改src/include/httpd.h文件的方法,配置方法如下:
(1)#cd/root切換目錄到/root下
(2)#tar xvfz apache_1.3.24.tar.gz解開apache源文件到/root下
(3)#cd apache_1.3.24進入apache_1.3.24目錄
(4)#vi src/include/httpd.h用vi編輯httpd.h文件
(5)在 輸 入“vi src/include/httpd.h”命令后,繼續輸入“/256”并按“回車”鍵搜索數字256,將其改為1024后保存并退出即可。
如果,要支持最多為1024個客戶的同時請求,不僅需要更改上面提到的源文件,在編譯安裝后還需要設 置/usr/local/apache/conf/httpd.conf文件,將其中的“MaxClients”一行后面的參數更改為“1024”。
#cd apache_1.3.24
#./configure--prefix=/usr/local/apache設置安裝默認目錄
--enable-module=most編譯大多數模塊
--enable-shared=max設置模塊為DSO(動態共享對象)模式
--enable-module=proxy啟動代理模塊
--enable-shared=proxy安裝代理模塊為DSO模式
--enablemodule=rewrite啟動重寫功能模塊
--enableshared=rewrite安裝重寫功能模塊為DSO模式
#make
#make install
安裝所有Apache反向代理方式所需的文件,就都安裝到了/usr/local/apache目錄下。
在/usr/local/apache目錄找到httpd.conf文件,并將下面的內容添加至此文件后。

這一段代碼設置了基于域名的反向代理虛擬主機,這樣當您從外部訪問IP地址為1.2.3.4的主機,且URL地址后面部分的域名為“AAA.com”,Apache就可以把用戶的請求轉發到局域網內部的Web服務器上,并重寫響應數據包去掉代理協議部分。
其 中,“ProxyRequest Off”這一行用來禁止Apache在IP地址為1.2.3.4的主機和端口80上進行代理服務。
在這里Apache作為一個透明的代理服務器來使用,而“RewriteEngine on”這一行用來啟動Apache修改響應數據包的功能,否則下 面 的“RewriteCond”和“RewriteRule”就不會起任何作用。
在上面Apache HTTP Server的重寫規則中,重寫后的URL與您所請求的URL是一樣的,然后我們將下面3個域名放到這臺服務器的/etc/hosts文件中。
這樣這臺Apache HTTP Server就實現了反向代理,將從內部3臺Web服務器獲得內容,并把它返回給外部的請求者,/etc/hosts文件的域名對應記錄如下:
192.168.2.3 A.AAA.com
192.168.2.4 B.AAA.com
192.168.2.5 C.AAA.com
完成反向代理后,當外部用戶訪問http://A.AAA.com時,域名會被翻譯為公網IP地址1.2.3.4,這個請求會被送到單位的邊界路由器上,邊界路由器把它交給監聽Apache反向代理的Apache HTTP Server。
這臺反向代理服務器根據來路內容,向內詢問/etc/hosts文件中定義的記錄地址,將會查找到A.AAA.com對應為內部的192.168.2.3。
然后從IP地址為192.168.2.3的那臺Web服務器上獲取請求內容,并將內容返回給外部用戶,從而完成內部的Web服務器A.AAA.com對外提供訪問的功能。
在對Apache配置完畢后,如果以后還需要增加更多的內部Web服務器來提供外部訪問服務,只需要設置該服務的訪問域名為反向代理服務的公網IP 1.2.3.4。
然后按照以上的方法配置好Apache HTTP Server的反向代理方式,并在/etc/hosts文件中依次增加相對應的解析記錄即可。