作者: Duncan Lo <
[email protected] > 適用對象: 防火牆或系統管理員. 適用條件: 對 Linux 環境有基礎的管理及操作能力. 文章附注: 本篇文章為自由文件,歡迎非商業性質轉載,並請注明出處! 商業性質轉載請來信告知! 特別注意: 1.本篇文章提供之程序及設定*不一定*符合您的環境, 請依您的系統環境適當地修改程序及設定. 2.在執行任何具破壞性的動作及行為前, 請確認您已作好完整可用的資料備份工作. 3.請把整篇文章看完再發問,謝謝! 本文共分四個單元,第一單元是簡介 R-Proxy 基本觀念,及使用 Apache 架設 R-Proxy 的方法基本設定,第二單元是利用 Apache Rewrite 模塊,使用 R-Proxy 設定 Web 主機的分散負載及主機容錯的功能,第三單元是探討 Apache 1.3 上的 mod_proxy 模塊之安全性問題,第四個單元是由 kefore 網友提供的 Apache 2 上的 R-Proxy 架設 心得. 第一單元: 架設 R-Proxy 一般的 Proxy 主機,是服務內部的 Client 上網用的,通常都是用 Squid 架設, 同時為了存取效率及節省頻寬, Squid 本身也提供 Cache 的功能,所以一般 Proxy主機也稱為 Proxy Cache Server 代理快取服務器. R-Proxy 本身也是一種代理服務器,那個 R 代表的是 Reverse 反向的意思,最主要的用途是反過來代理,替 Internet 的使用者代理存取內部受限制的網站,假如有開啟 Cache 功能,它同樣可以提供 File Cache 的功能,簡單來說 R-Proxy 就像是把 Proxy 的架構及需求,反向過來,使用者角色對調的意思.詳細的介紹可以參考最後面的 Netscape Proxy Server - Reverse Proxy 圖文. R-Proxy 實際應用上多與防火牆整合在一起,代理存取內部的網站,不讓外部使用者直接存取內部受限制及保護之網站,或是將 Web 依目錄結構由數台主機來分散服務,實測上,只要路徑及設定正確,該 R-Proxy 可以支持如Html,PHP,ASP,Java及cgi程序的 Web 環境.而內部的 Web 主機可以設限只有 R-Proxy 的 IP 位置才可來存取,而一般的Internet 使用者不行直接存取,相當於把 R-Proxy 當成一台虛的 Web 主機,相對的, 網站的安全性也提高了. 在使用上, Proxy Cache 需要 Clien t在 IE, Netscape 內設定,或是在 Firewall上設成通透式的Cache方式,才可以使用 Proxy Cache 的功能,但用 R-Proxy, 使用者是完全不用作任何設定,只要 Firewall 或 Web 管理員把 R-Proxy 設好就行了. R-Proxy 的作法有很多種,使用 Apache 架設是目前最容易的方法,請特別注意,以下的教學是以 TurboLinux 7 Server 及 Apache 1.3.20 作示范,你實際的環境可能會需要作一些修改.還有以下的所說的 Proxy 是指一種功能,請不要跟 Squid 這個 作快取代理的軟件弄混了... 首先,你要先確認你的 Apache 有 proxy 這個 modules, 通常在httpd.conf內 會有像下面兩行的 modules 設定: LoadModule proxy_module /usr/libexec/apache/libproxy.so AddModule mod_proxy.c 確定 Apache 有 Proxy 這 modules 後,就可以開始來設定,找到下面這一段: 在裡面加上或把某幾行的#拿掉,內容大概會像這樣: ProxyRequests On Order deny,allow Deny from all Allow from .your_domain.com 把 Allow from 修改成你予許的來源位置.接下要設定你要代理的Web主機位置,把設定加入: ProxyPass / http://192.168.1.7/ 上面那個 / 是指 Web 根目錄,後面的網址是內部的 Web 主機位置. Ok!完成,可以用 Browser 連到你架的 R-Proxy 主機試試,若是 R-Proxy 架在 Firewall 上,可能要把 httpd port 作適度的開放,但不再需要作轉 port 的動作,你會發現,你連到 R-Proxy 主機的網頁內容就是你指定的那台 Web 主機. 你也可以把網頁分散在不同的主機上,因為只有一個 Web 主目錄,所以可以依Web 目錄來分,設定的方法像: ProxyPass / http://192.168.1.3/ ProxyPass /webmail http://192.168.1.2/webmail/ ProxyPass /sales http://192.168.1.7/ ProxyPass /bbs http://192.168.1.10:8888/ 這邊有個重點,就是各主機網頁的目錄結構位置最好也是依循Web主目錄的結構,像上面第 1 跟第 2 行執行應該不會有問題,不過第 3, 4 行,就不一定可行,因為 Web 路徑可能會不對,特別是該目錄有又有次目錄時,因為這 R-Proxy 是作代理存取的動作,而不是作轉址的動作,所以可能需要另外搭配 ProxyPassReverse 的指令.就像這樣: ProxyPass / http://192.168.1.3/ ProxyPass /webmail http://192.168.1.2/webmail/ ProxyPassReverse /webmail http://192.168.1.2/webmail/ ProxyPass /sales http://192.168.1.7/ ProxyPassReverse /sales http://192.168.1.7/ ProxyPass /bbs http://192.168.1.10:8888/ 這樣像 http://192.168.1.2/webmail/images 就會轉到 /webmail/images 去,而不是 /images 這個錯誤路徑,不過還需注意的,就是次目錄的指定在網頁程序內的寫法,還是必須以"相對位置"的方式撰寫,使用"絕對位置"的方式還是有出錯的可能. 我測試的 Apache proxy module 是不提供輪詢的功能,所以假如你的設定是下: ProxyPass / http://192.168.1.3/ ProxyPass / http://192.168.1.2/ 基本上,還是只有第 1 條設定生效,而且也不提供容錯的功能,所以上面設定指的第 1 台主機掛了,網頁還是連不到的,因為它不會自動啟用第 2 條設定,這部份就必須要搭配 Apache的 rewrite 模塊或其它具有錯誤偵測的 r-rproxy 模塊了. 假如你想激活 Cache 功能,可以參考 Apache 設定手冊,增加幾個有關 Cache 的設定, 實際使用上因為 R-Proxy 也許只代理存取內部的 Web 主機, File Cache 的異動及數量不大, 在一些較復雜及中大型的 Web 網站比較適合,你可以自己斟酌要不要使用 Cache 的功能. 相關的設定參數如下: CacheRoot "/var/proxy" CacheSize 5 CacheGcInterval 4 CacheMaxEXPire 24 CacheLastModifiedFactor 0.1 CacheDefaultExpire 1 NoCache a_domain.com another_domain.edu joes.garage_sale.com 使用了 R-Proxy 之後,還有一點不同的地方,就是 httpd log 的內容,原本讓任何使用者直接 存取 Web 主機時, httpd log 內紀錄的是聯機 Client 的 IP 位置,但使用了 R-Proxy 後, log 內紀錄的都將會是 R-Proxy 的 IP 位置,而 Client 的真實存取紀錄則會紀錄在 R-Proxy 內的 httpd log 內,所以要追查聯機問題,則需要多檢查 R-Proxy 的 httpd log 內容. 目前 R-Proxy 主機只有少數中大型網站有架設,但實際應用上, R-Proxy 是可以改善Web 存取效能,增加實體 Web 主機的安全性,我手上的有關 R-Proxy 資料還不完整,商業產品有很多已利用 R-Proxy 的觀念作到多線,異地的負載平衡及容錯存取,而且可以支持非 httpd服務.而在要作到像那些產品的功能可能就要考慮以 Squid 來實作 R-Proxy 功能了... 參考資料: 1.Apache - module mod_proxy http://httpd.apache.org/docs/mod/mod_proxy.html 2.Netscape Proxy Server - Reverse Proxy http://developer.netscape.com/docs/manuals/proxy/adminux/revpxy.htm 3.IBM HTTP Server http://tst.sinica.edu.tw/manual/ibm/index.html 第二單元: R-Proxy 的分散負載及主機容錯 在上一個單元內,可以發現基本的 R-Proxy 只能單純的依網頁目錄分散在不同的主機,而且一個網頁目錄只能連結一台主機,當某台主機當機,該連結的網頁目錄便失效了,這種 單一靜態的分散服務及缺乏容錯機制的功能,並不是較好的 R-Proxy 功能. 在 http://pihl.kumpu.org/mod_curltunnel.html 有提供一個 CrulTunnel 模塊,它 提供類似於 ProxyPass 及 ProxyPassReverse 的指令 CrulTunnelPass 及 CrulTunnelPassReverse, 安裝 CurlTunnel 模塊系統必需要有 http://curl.haxx.se/ 的 libcurl 函數,但實測後發現, CurlTunnel 模塊只是使錯誤連結的 404 錯誤訊息不再出現,還是不提供容錯的功能,所以這也不是我們想要的. 想要解決網頁連結錯誤的問題,必須在 URL 路徑發生問題時, Apache 就要自動辨識錯誤,並導向正確或是錯誤訊息響應的網址,在 Apache 中就有一個提供這樣可以依條件及規則轉換URL 路徑的模塊 - Rewrite, Apache Rewrite 模塊是一個功能強大的 URL 路徑維護模塊,它可以依條件,規則或外部程序,資料來轉換網頁的 URL 路徑. 以下的測試環境,同樣是將 R-Proxy 架設在防火牆上,而防火牆內有數台 Web 主機. 首先,你要先確認在你主機上有 Rewrite 模塊,而且在 httpd.conf 內有類似下面的設定: LoadModule rewrite_module /usr/libexec/apache/mod_rewrite.so