Apache HTTP server 和 Tomcat server 整合,一般是希望對(duì)于用戶(hù)只公布 Apache HTTP server 的網(wǎng)址,而 Tomcat 的網(wǎng)址則不公布,扮演一個(gè)幕后英雄的角色。訪(fǎng)問(wèn) Tomcat 的 HTTP 請(qǐng)求,通過(guò) Apache 轉(zhuǎn)發(fā)給 Tomcat,Tomcat 處理完后,將 HTTP 回應(yīng)返回給 Apache,然后 Apache HTTP 回應(yīng)發(fā)回給用戶(hù)端瀏覽器。
Apache HTTP server 和 Tomcat server 直接的 HTTP 數(shù)據(jù)傳輸,有很多種方法。
方法一,使用 mod_jk。很多網(wǎng)站上介紹到 Apache HTTP server 和 Tomcat server 整合的時(shí)候,都是在介紹 mod_jk.so 的使用,這是一種比較老的方法,并且需要額外下載 mod_jk。Apache 和 Tomcat 的默認(rèn)配置文件都需要改動(dòng)。
方法二, URL rewrite,也就是對(duì)于指定格式的 URL,轉(zhuǎn)發(fā)給某個(gè) Tomcat 的網(wǎng)址。這里所說(shuō)的指定格式,是指 Apache 所使用的正則表達(dá)式,通俗地將,是一種類(lèi)似 * 的一種比較高級(jí)通配符。這種方法不需要下在額外的文件,只需要配置 Apache。
方法三,mod_proxy_ajp,僅在 Apache 2.1 ?以后的版本中可用,Apache 自帶的一個(gè)新功能模塊。這時(shí) Apache 使用 Apache JServ Protocol 與 Tomcat 通訊。不需要下在額外的文件,需要改動(dòng)Apache 和 Tomcat 的默認(rèn)配置文件都需要改動(dòng)。
方法四,mod_proxy。其實(shí) mod_proxy 既可以做類(lèi)似于 Wingate 一樣的公司局域網(wǎng)共享上網(wǎng)代理,也可以做反向代理(Reverse proxy)。這里使用的是反向代理功能,用戶(hù)端瀏覽器不需要把代理服務(wù)?改成這里的 Apache 地址。mod_proxy 是 Apache 自帶功能,并且配置比較簡(jiǎn)單。
這篇文章介紹 Apache 反向代理轉(zhuǎn)發(fā) HTTP 請(qǐng)求到 Tomcat 的配置。比較簡(jiǎn)單實(shí)用。
下載 Apache web server 2.2,安裝完成后,修改?裝目錄下的 conf/httpd.conf 文件,將以下兩行前的注釋字符 # 去掉。
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
在這個(gè)配置文件最后,加上
ProxyPass /app1 http://<tomcat_server_address>:port/url1
ProxyPassReverse /app1 http://<tomcat_server_address>:port/url1
保存配置文件后重新啟動(dòng) Apache 就可以了。當(dāng)用戶(hù)訪(fǎng)問(wèn)
http://<apache_server_address>/app1 的時(shí)候,Apache 后臺(tái)自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)給 Tomcat ,用戶(hù)只認(rèn)為 Apache server 就是他所要的應(yīng)用服務(wù)器。
細(xì)心的作者可以看到,Tomcat 那邊沒(méi)有做任何改動(dòng),是不是說(shuō)明,如果 Tomcat 換成 JBoss,或者 IBM Websphere,或者 BEA Weblogic ,也可以用 Apache 來(lái)轉(zhuǎn)發(fā)呢?答案是,確實(shí)如此!!
這里需要解釋的是, Apache 反向代理只做 HTTP 透明轉(zhuǎn)發(fā),因此,Tomcat 那邊,如果使用 servelet API 獲取 request url, server info,等等,都是 Tomcat 的。在Tomcat 上的 JSP 或者 HTML 文件里面,都應(yīng)該是相對(duì)路徑,不應(yīng)該使用絕對(duì)路徑,更不能使用帶 Tomcat 地址的 URL。這應(yīng)該不是太高的要求,對(duì)不?
目前最新版的 Apache 自帶的 cache ,只能配置成 server 或者 virtual host 一級(jí)的,沒(méi)有辦法配置到 URL 一級(jí)。好在一般的 J2EE 應(yīng)用性能問(wèn)題,一般都在動(dòng)態(tài)網(wǎng)頁(yè)部分,靜態(tài)網(wǎng)頁(yè)很好,因此也沒(méi)有太大關(guān)系。