天天看點

使用Apache 反向代理功能連接配接 Tomcat

    Apache HTTP server 和 Tomcat server 整合,一般是希望對于使用者隻公布 Apache HTTP server 的網址,而 Tomcat 的網址則不公布,扮演一個幕後英雄的角色。通路 Tomcat 的 HTTP 請求,通過 Apache 轉發給 Tomcat,Tomcat 處理完後,将 HTTP 回應傳回給 Apache,然後 Apache  HTTP 回應發回給使用者端浏覽器。

Apache HTTP server 和 Tomcat server 直接的 HTTP 資料傳輸,有很多種方法。

方法一,使用 mod_jk。很多網站上介紹到 Apache HTTP server 和 Tomcat server 整合的時候,都是在介紹  mod_jk.so 的使用,這是一種比較老的方法,并且需要額外下載下傳 mod_jk。Apache 和 Tomcat 的預設配置檔案都需要改動。

方法二, URL rewrite,也就是對于指定格式的 URL,轉發給某個 Tomcat 的網址。這裡所說的指定格式,是指 Apache 所使用的正規表達式,通俗地将,是一種類似 * 的一種比較進階通配符。這種方法不需要下在額外的檔案,隻需要配置 Apache。

方法三,mod_proxy_ajp,僅在 Apache 2.1 及以後的版本中可用,Apache 自帶的一個新功能子產品。這時 Apache 使用 Apache JServ Protocol 與 Tomcat 通訊。不需要下在額外的檔案,需要改動Apache 和 Tomcat 的預設配置檔案都需要改動。

方法四,mod_proxy。其實 mod_proxy 既可以做類似于 Wingate 一樣的公司區域網路共享上網代理,也可以做反向代理(Reverse proxy)。這裡使用的是反向代理功能,使用者端浏覽器不需要把代理伺服器改成這裡的 Apache 位址。mod_proxy 是 Apache 自帶功能,并且配置比較簡單。

這篇文章介紹 Apache 反向代理轉發 HTTP 請求到 Tomcat 的配置。比較簡單實用。

下載下傳 Apache web server  2.2,安裝完成後,修改安裝目錄下的 conf/httpd.conf 檔案,将以下兩行前的注釋字元 # 去掉。

#LoadModule proxy_module modules/mod_proxy.so

#LoadModule proxy_http_module modules/mod_proxy_http.so

在這個配置檔案最後,加上

ProxyPass                  /app1 http://<tomcat_server_address>:port/url1

ProxyPassReverse  /app1 http://<tomcat_server_address>:port/url1

儲存配置檔案後重新啟動 Apache 就可以了。當使用者通路

http://<apache_server_address>/app1 的時候,Apache 背景自動将請求轉發給 Tomcat ,使用者隻認為 Apache server 就是他所要的應用伺服器。

細心的作者可以看到,Tomcat 那邊沒有做任何改動,是不是說明,如果 Tomcat 換成 JBoss,或者 IBM Websphere,或者 BEA Weblogic ,也可以用 Apache 來轉發呢?答案是,确實如此!!

這裡需要解釋的是, Apache 反向代理隻做 HTTP 透明轉發,是以,Tomcat 那邊,如果使用 servelet API 擷取 request url, server info,等等,都是 Tomcat 的。在Tomcat 上的 JSP 或者 HTML 檔案裡面,都應該是相對路徑,不應該使用絕對路徑,更不能使用帶 Tomcat 位址的 URL。這應該不是太高的要求,對不?

目前最新版的 Apache 自帶的 cache ,隻能配置成 server 或者 virtual host 一級的,沒有辦法配置到 URL 一級。好在一般的 J2EE 應用性能問題,一般都在動态網頁部分,靜态網頁很好,是以也沒有太大關系。

對于要求比較高的應用,比如使用者量多的新聞網站或者論壇網站,如果要求是用 Apache 緩沖背景的動态網頁,比如說,我的首頁可以允許緩存一分鐘,則在這一分鐘内,比如有兩千次使用者通路 http://somehost/index.jsp,隻有第一次使用者通路,Apache 會把請求轉發到 Tomcat,其餘的 999 次通路,都是由 Apache 從緩沖中取出這個頁面傳回給使用者看。這樣背景的動态網頁伺服器的負荷會小很多。以目前的 Apache 最新版本來說,使用反向代理達不到這個要求,應該使用 Apaceh 建立一個 virtual host ,換成使用 URL rewrite。這與題目無關,就此打住。