天天看點

Apache和Tomcat整合(一個Apache 不同域名處理多個不同業務)一、簡介二、mod_proxy 和 mod_jk 的比較三、實踐

在項目中,幾乎任何一個項目都包括靜态資源和動态請求兩大部分。特别對于門戶網站這樣的項目,靜态内容資源會更多,我們使用一般的 tomcat 部署時,tomcat 對靜态資源的處理能力比較慢,至少比 apache 要慢很多。

為了提高項目的通路速度,降低伺服器負載提高性能,我們使用apache來處理靜态資源,把動态資源和請求交給 tomcat 處理。

當然,在單純處理并發和靜态資源名額方面,nginx要比apache好,至于nginx和apache的具體差別,以及什麼項目使用nginx、什麼項目适合用apache,異或是使用nginx加apache一起使用…… 這個不是本文要探讨的範圍,這兩個開源項目各有優缺點,大家可以針對自己項目選擇合适的方案。

本文就簡單的對apache和tomcat如何內建,進行實際配置進行說明:

apache與tomcat負載叢集內建方法有3種jk、jk_proxy、http_proxy

那麼什麼時候使用哪一個呢?這依賴于你的架構。如果你已經有了或者需要apache 2.2的功能,那麼你可以再mod_proxy和mod_jk直接選擇。mod_jk在apache2.2上允許得很好。關鍵看你需要什麼樣的功能:

mod_proxy

--------------

優勢:

不需要編譯和維護一個對立的子產品。mod_proxy,mod_proxy_http,mod_proxy_ajp,mod_proxy_balancer已經是apache 2.2+的标準內建部分;

可以使用http、https和ajp協定,即便是在同一個balancer中。

劣勢:

mod_proxy_ajp不支援大于8k的資料包;

隻有最基本的負載均衡器;

不支援域模型叢集(domain model clustering)

mod_jk

先進的負載均衡器;

先進的節點失敗偵察功能;

支援大型ajp 資料包

需要單獨維護一個獨立的子產品;

我個人建議是如果有能力維護mod_jk子產品的二進制版本,盡量使用mod_jk。mod_proxy一直在更新但還缺少一些mod_jk的功能。但是,如果你需要https和一個簡單的負載均衡就是用mod_proxy.

以 mod_jk 為例,使用1個apache 同時支援2個tomcat 不同業務的處理(web和wap)。

     下載下傳連接配接apache和tomcat(mod_jk) 的包 tomcat-connectors-1.2.41-src.tar.gz

     官網下載下傳位址:http://tomcat.apache.org/download-connectors.cgi

1) 配置 mod_jk 子產品

剛剛安裝了mod_jk 子產品,也已經拷貝到apache的子產品目錄中,下面就是讓apache來支援它。

需要在apache的conf目錄下建立配置檔案:

workers.properties #定義tomcat工作的的配置檔案

mod_jk.conf #定義mod_jk 的配置檔案

# cd /usr/local/apache2/conf/

# vi mod_jk.conf

# vi workers.properties

2) 修改 apache 的主配置檔案 httpd.conf 配置多個虛拟主機

a) 找到 include conf/extra/httpd-vhosts.conf 去掉前面的 “#”

b) vi conf/extra/httpd-vhosts.conf

配置檔案中 /svcroot/runtime/webstatic/shanhyweb 和 /svcroot/runtime/webstatic/shanhywap 分别為web和wap的靜态資源目錄

配置檔案中 worker_web 和 worker_wap 為我們2個處理不同業務的 tomcat

我在/app/webserver 目錄下放了2個tomcat,分别是 apache-tomcat-7.0.63-wap 和 apache-tomcat-7.0.63-web

修改 apache-tomcat-7.0.63-wap/conf/server.xml 中的ajp 端口為8109,http端口為 8180,server 端口為8105

在  apache-tomcat-7.0.63-wap/conf/server.xml 的最下面的 </host> 上面一行添加:

<context path="" docbase="/svcroot/runtime/webinterface/shanhywap" reloadable="true" distributable="true"/>

在  apache-tomcat-7.0.63-web/conf/server.xml 的最下面的 </host> 上面一行添加:

<context path="" docbase="/svcroot/runtime/webinterface/shanhyweb" reloadable="true" distributable="true"/>

重新開機apache 服務,并啟動web和wap的tomcat 服務。

修改本機 c:\windows\system32\drivers\etc 目錄下的 hosts 檔案,在最後添加:

192.168.19.130 shanhyweb.example.com

192.168.19.130 shanhywap.example.com

其中 192.168.19.130 為我們上面配置的linux 服務的ip位址。

伺服器上靜态資源檔案:

/svcroot/runtime/webstatic/shanhywap/index.html 内容為 this is my page. shanhywap-static.

/svcroot/runtime/webstatic/shanhyweb/index.html 内容為 this is my page. shanhyweb-static.

伺服器上2個tomcat 配置的項目中的 jsp 測試檔案:

/svcroot/runtime/webinterface/shanhywap/test.jsp 内容為 shanhywap content.

/svcroot/runtime/webinterface/shanhyweb/test.jsp 内容為 shanhyweb content.

通路位址測試:

通路:http://shanhywap.example.com 後網頁顯示 this is my page. shanhywap-static.

通路:http://shanhyweb.example.com 後網頁顯示 this is my page. shanhyweb-static.

通路:http://shanhywap.example.com/test.jsp 後網頁顯示 shanhywap content.

通路:http://shanhywap.example.com/test.jsp 後網頁顯示 shanhyweb content.

最後列出本問整合涉及到的相關檔案目錄位置:

apache 安裝目錄 /usr/local/apache2

apache 相關配置檔案:

/usr/local/apache2/conf/httpd.conf

/usr/local/apache2/conf/mod_jk.conf

/usr/local/apache2/conf/workers.properties

/usr/local/apache2/conf/extra/httpd-vhosts.conf

webserver 的2個tomcat 目錄:

/app/webserver/apache-tomcat-7.0.63-wap

/app/webserver/apache-tomcat-7.0.63-web

webinterface 程式目錄(2個tomcat分别對應的項目工程) :

/svcroot/runtime/webinterface/shanhyweb

-- test.jsp

/svcroot/runtime/webinterface/shanhywap

webstatic 靜态資源目錄

/svcroot/runtime/webstatic/shanhyweb

-- index.html

/svcroot/runtime/webstatic/shanhywap

************************************************************************

題外話說一下我的目錄歸類,我的 /svcroot 目錄目錄結構如下:

/svcroot

-- runtime

   -- standalone(存放java程式)

   -- webinterface(存放tomcat對應的項目工程)

   -- webstatic(存放項目工程的靜态資源)

-- workspace

   -- build(hudson custom 目錄,svn 代碼)

       -- shanhyweb-source

       -- shanhywap-source

       -- shanhyandroid-source

   -- dist(build編譯後的檔案目錄,待釋出)

-- logs(項目相關logs)

--------------------------

(完)