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