Apache mod_proxy

使用 mod_proxy,可以指定由目前的 Apache 取得它其網站的資訊內容,再回傳給使用者。大部份使用這種這定技巧會有兩種原因:

安全性考量:為了保護真實運作的伺服器,使用者所對應到的是前端的 Web Proxy 主機,而 Web Proxy 再向正確的主機取得資料。若是受到惡意攻擊的話,Web Proxy 在某些情況下可以保障實際運作的主機安全。

IP 數量考量:如果您有許多 Web 服務器(IIS、Apapche、WebSphere ... 等)需要讓外部使用者連接,但是在 IP 數量有限的情況下就可以利用 web_proxy 的特性做代理。

架構

為了以上兩點的考量,可以使用 Reverse Proxy 的服務,首先,先來查看整個運作架構:

當使用用由網際網路連進服務時,使用者永遠只會知道 mod_proxy 的網頁位置。而針對不同的目錄、網址均可使用 mod_proxy 的功能做轉換。

假設,在本例中使用者連進 www.abc.com.tw 的主機時,IP 對應的是 11.22.33.88,透過防火牆進來後真正的 mod_proxy 主機是 192.168.1.1,而因為真正運作 www.abc.com.tw 是由內部 192.168.1.11 的一台 Apache Server 做服務。此使 mod_proxy 會先向內部 192.168.1.11 取得資料後再回應給使用者。

另外使用者輸入 erp.abc.com.tw,這個 erp 系統是由 IIS 所服務,此時只要設定 mod_proxy 向 192.168.1.21 取得資料後再轉傳給使用者即可。

實做

以下,我們就來實做這種 Reverse Proxy 的功能服務。

請注意,您可以使用 Squid 等其它 Proxy 伺服器做 Reverse Proxy 的服務,但這裡討論的是使用 Apache mod_proxy 的模組來完成設定。

確認 httpd 所支援的模組:

0001
steven $ /usr/local/httpd/bin/httpd -l | grep mod_proxy

若沒有 mod_proxy 支援的話,請在編譯的時候加入以下的選項(以下粗體字為所需加入的項目)

0001
0002
0003
0004
0005
root # ./configure --prefix=/usr/local/httpd --with-mpm=worker --enable-cache \
> --enable-file-cache --enable-disk-cache --enable-mem-cache --enable-mime-magic \
> --enable-headers --enable-ssl --enable-http --enable-cgi --enable-rewrite \
> --enable-so --with-suexec-gidmin --with-suexec-logfile \
> --enable-proxy --enable-proxy-http

設定 mod_proxy

依本文一開始的架構來看,這台 Proxy 需要負責向兩個網站取得資料,包含了 www.abc.ocm.tw 與 erp.abc.com.tw,所以在此可以配合使用 Virtual Host 再搭配 mod_proxy 來做不同網站的代理。

設定 www.abc.com.tw

在設定 mod_proxy 之前,請先確認內 DNS 有正確的對應。在本例中,因為真正的 www.abc.com.tw 並不在外部網路,而是在內部的網路裡,因此您可能在內部 DNS 加上一筆記錄。

0001
www    IN A   192.168.1.11

而外部的 DNS 需要對應 Public IP

0001
www    IN A   11.22.33.88

完成之後,請在 httpd.conf 設定一組 www.abc.com.tw 的 Virtual Host,並加入 ProxyPass 選項

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
<VirtualHost *:80>
    ServerAdmin steven@www.abc.com.tw
    DocumentRoot "/usr/local/httpd/htdocs"
    ServerName www.abc.com.tw
    ErrorLog "logs/www.abc.com.tw-error_log"

    <IfModule log_config_module>
        CustomLog "|/usr/local/httpd/bin/rotatelogs /usr/local/httpd/logs/www.abc.com.tw-access_log.%Y-%m-%d 86400" common
    </IfModule>

    <Directory "/usr/local/httpd/htdocs">
        Options -Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    ProxyRequests Off
    ProxyPass / http://www.abc.com.tw

</VirtualHost>

設定 erp.abc.com.tw

一樣的道理,必需要把內外部的 DNS 指向設定完成。

 

廣 告

內部設定:

0001
erp    IN A   192.168.1.21

外部設定

0001
erp    IN A   11.22.33.88

ProxyPass 設定

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
<VirtualHost *:80>
    ServerAdmin steven@abc.com.tw
    DocumentRoot "/usr/local/httpd/htdocs"
    ServerName erp.abc.com.tw
    ErrorLog "logs/www.abc.com.tw-error_log"

    <IfModule log_config_module>
        CustomLog "|/usr/local/httpd/bin/rotatelogs /usr/local/httpd/logs/www.abc.com.tw-access_log.%Y-%m-%d 86400" common
    </IfModule>

    <Directory "/usr/local/httpd/htdocs">
        Options -Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    ProxyRequests Off
    ProxyPass / http://erp.abc.com.tw

</VirtualHost>

正確設定運作主機

若您的 Apache 實際上不只只有一個應用程式,如此必需請您設定好正確的虛擬目錄或是虛擬網站,而虛擬網站的名稱(ServerName)必需要與前端 Proxy 代理主機的 Proxy Pass 設定相乎應。

對於 IIS 來說,最好的方式是在建立時就建立虛擬網站,如此之後在移動或轉移時才能輕鬆又快速。當然了,在建立虛擬網站時,也需要注意網站標示的項目,需與前端 Proxy 代理主機的 Proxy Pass 設定相乎應。IIS 的網站標示如下圖所示:

應用與文件

mod_proxy 的應用範圍很彈性,不只是整個站台可以做代理,連同特定目錄也能做代理服務。

在大陸網站的文章理,較多是用來做企業內多個不同服務同時外對的需求,此時反而比較像是使用 mod_proxy 去“掛載”內部的網站。

更多進階的應用,可參考下例網址:

 

01/19/2009

首頁