Apache和tomcat整合

Apache和tomcat整合
2012/02/28 by FineReport——web報表技術領跑者 留言板 » .Connector的選擇
選擇合適的Connector對於性能、配置的方便性有很重要的影響,目前大致上有JK1。x, JK2, mod_webapp三種connector可以使用。 JK使用比較廣泛。JK2是JK1.x的改進,比較新。但是不太容易配置,相關的文檔也比較少。此外,JK可以支持其他Web服務器和tomcat的集成。 但mod_webapp不支持。 因此,目前JK1.x是最好的選擇。
獲得JK
使用二進制版本
如果你對手工編譯源代碼心有餘悸,使用二進制版本也許是個明智的選擇。你可以從http://apache。linuxforum。net/dist/jakarta/tomcat-connectors/jk/binaries/下載JK1.x的最新版本。
然而,不幸的是二進制版本的JK和Apache的版本是捆綁在一起的,如果你使用了比較新的Apache(比如httpd-2.0.29)的話,往往很難找到對應的二進制版本的JK。
手工編譯源代碼
對於不同的操作系統和Apache的版本,如果沒有預編譯好的JK,則需要進行手工編譯。除了Linux以外,其他操作系統一般不會安裝編譯環境。這時你還需要安裝編譯器。典型的例子是在Solaris上安裝GCC,或是在Windows上安裝Visual C++。另外,通常Open Source的軟件一般都是用GNU的autoconf、automake生成自動配置腳本和Makefile的,JK也不例外。除了Linux以外的Unix系統中的make不一定能夠兼容這些腳本。 所以如果你碰到這些問題就需要安裝gmake。下面以Solaris8爲例說明如何安裝配置編譯環境:
在Solaris8中系統自帶的make不能兼容automake產生的某些Makefile。
需要的軟件包:
gcc-3.3-sol9-sparc-local.gz
make-3.80-sol8-sparc-local.tar.gz
所有需要的軟件包都可以在www.sunfreeware.com上下載到。
解壓縮:

$gunzip gcc-3.3-sol9-sparc-local.gz

$gunzip make-3.80-sol8-sparc-local.gz

用pkgadd安裝,需要root權限:

#pkgadd -d gcc-3.3-sol9-sparc-local

#pkgadd -d make-3.80-sol8-sparc-local

用pkgadd安裝後,通常gcc, make會被安裝在/usr/local/bin目錄下。這是需要讓gmake
成爲系統默認的make。檢查PATH環境變量,確保/usr/local/bin目錄的位置在Solaris8自帶的make的bin之前:

$which make

/usr/ccs/bin/make

$echo $PATH

/usr/bin:/usr/ccs/bin:/usr/local/bin

如果發現gmake還不是系統默認的make,可以修改/etc/profile調整PATH。但有一種更簡單有效的方法,在/usr/bin目錄下建一個到/usr/local/bin/make的符號連接make,這樣就能使gmake成爲系統默認的make了:

# cd /usr/bin

# ln -s /usr/local/bin/make make

同樣的技巧可以解決一些Perl腳本對perl解釋器可執行文件路徑引用的不正確。如某個perl腳本的頭信息有#!/usr/local/bin/perl -w但Perl在系統上被安裝在/usr/bin/目錄下。這時需要在
/usr/local/bin/下建立一個到/usr/bin/perl的符號連接perl。
編譯完JK後,把它安裝到apache中去,執行:

# make install

如果不成功,可以手工把mod_jk.so拷貝到apache的modules目錄下。
配置
在具體動手配置之前應該考慮一下你集成的目標:僅僅是簡單的把某個subcontext由tomcat處理,還是更高層次的動態/靜態內容整合?是否允許HTTPS的轉發;是否要進行負載平衡?具體配置的複雜度會因你的集成目標不同而大相徑庭。

假定我們的集成目標是:
1. 所有的靜態資源由Apache處理
2. 所有的動態資源由Tomcat處理
配置Tomcat
apache和tomcat整合大致上有三種方式:
1. 在apache進程中運行tomcat來處理動態內容
2. 通過ajp13協議,apache將動態內容的請求轉發給tomcat
3. 使用本地高速Unix domain socket,apache將動態內容的請求轉發給tomcat

方式2可以將apache和tomcat分佈在不同的機器上,從而可以實現負載平衡。方式3速度比較快,當apache和tomcat分佈在相同的機器上時可以考慮使用。
本文以方式2的爲例說明tomcat和apache的集成。
爲了能處理ajp13請求,tomcat需要起一個服務。 這是通過在tomcat的server.xml中定義一個Connector來實現的。 在最新的tomcat4.1.30版本中該Connector默認情況下是啓用的。如果沒有啓用在server.xml加入


port=”8009″ minProcessors=”5″ maxProcessors=”75″

enableLookups=”true” redirectPort=”8443″

acceptCount=”10″ debug=”0″ connectionTimeout=”20000″

useURIValidationHack=”false”


protocolHandlerClassName=”org.apache.jk.server.JkCoyoteHandler”/>;

啓動tomcat, 檢查ajp13服務是否運行
netstat -a | grep 8009
或則查看tomcat標準輸出上是否有類似的輸出:

info: JK2: ajp13 listening on /0.0.0.0:8009


2004-5-22 14:50:35 org.apache.jk.server.JkMain start


info: Jk running ID=0 time=20/200 config=D:\Tomcat4.1\conf\jk2.properties

配置Apache
配置完Tomcat後,進行Apache的配置。首先,我們需要確定整個web應用所在的context,確定了context也就能確定用戶通過什麼樣的URL可以訪問該web應用。比如,網站爲www.example.com, 如果web應用的context爲purchase,那麼用戶可以通過URL http://www.example.com/purchase訪問該應用;如果web應用的context爲/,那麼用戶可以通過URL http://www.example.com訪問該應用。一般而言,將web應用的context設定爲/可以方便用戶。如果存在多個獨立的應用,可以考慮把它們放到不同的子context中去。下面介紹把應用context設爲/情況下如何配置,其他情況類似。將jk的配置放在一個獨立的文件裏,然後在httpd。conf中Include該文件即可。
第一步,讓apache加載mod_jk:

#mod jk for tomcat-apache integration

LoadModule jk_module modules/mod_jk.so

把應用context映射到存放該應用靜態資源的目錄:

# Static files in the examples webapp are served by apache

Alias / /www/tomcat4。1/webapps/ROOT/

同時,因爲現在靜態資源不是由tomcat處理了,所以出於安全考慮和遵守JSP/Servlet規範需要禁止對WEB-INF子目錄的訪問:

# The following line prohibits users from directly access WEB-INF

;

AllowOverride None


deny from all

;

在集成的調試階段可以考慮允許目錄列表功能:

;

AllowOverride FileInfo AuthConfig Limit Indexes


Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

;

接下來一步告訴apache哪些動態內容應該讓tomcat處理,爲了確定動態內容URL的特徵,應該把web.xml中的所有servlet mapping中出現的URL模式在jk.conf中聲明:

JkMount /BaseServlet worker1


JkMount /Servlet/* worker1


JkMount /ProductUploadServlet worker1


JkMount /upload worker1


JkMount /test worker1


JkMount /*.jsp worker1


JkMount /*.do worker1

其它可能需要修改的配置
配置項 說明
JkWorkersFile 指定jk workers.properties的位置,如果是相對路徑,則假定在apache的ServerRoot目錄下
JkLogFile 指定jk log文件的位置,如果是相對路徑,則假定在apache的ServerRoot目錄下
JkLogLevel 指定jk log的級別有效的選項有:debug/error/info
JkLogStampFormat 指定log中的時間格式,使用c函數strftime的格式字符串語法

總結 Tomcat和Apache集成時通常需要一下步驟:
1. 決定使用哪種connector
2. 獲得connector,如果沒有現成的二進制的connector,則需要手工編譯,根據操作系統的不同可能還要設置編譯環境。
3. 配置tomcat
4. 配置apache,確定context,將context對應到應用的頂層目錄。根據web.xml中的servlet映射把所有的動態內容的url模式配置在apache中
5. 測試
附錄
一個完整的配置例子:

#mod jk for tomcat-apache integration


LoadModule jk_module modules/mod_jk.so


JkWorkersFile conf/workers.properties


# Where to put jk logs


JkLogFile logs/mod_jk。log


# Set the jk log level [debug/error/info]


JkLogLevel debug


# Select the log format


JkLogStampFormat ”[%Y-%m-%d %H:%M:%S] ”


# JkOptions indicate to send SSL KEY SIZE,


JkOptions +ForwardKeySize +ForwardURICompat +ForwardURICompatUnparsed -ForwardDirectories


# JkRequestLogFormat set the request format


JkRequestLogFormat ”%w %V %T”


# Static files in the examples webapp are served by apache


Alias / /www/tomcat4。1/webapps/ROOT/


# The following line prohibits users from directly access WEB-INF

;

AllowOverride None


deny from all

;

;

AllowOverride FileInfo AuthConfig Limit Indexes


Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

;

#JkAutoAlias /www/tomcat4.1/webapps/ROOT


JkMount /BaseServlet worker1


JkMount /Servlet/* worker1


JkMount /ProductUploadServlet worker1


JkMount /upload worker1


JkMount /test worker1


JkMount /*.jsp worker1


JkMount /*.do worker1

此外,jk還需要一個workers.properties文件配置jk本身的參數.如過不需要培植負載平衡
可以使用以下配置

# Define 1 real worker using ajp13


worker.list=worker1


# Set properties for worker1 (ajp13)


worker.worker1.type=ajp13


worker.worker1.host=127.0.0.1


worker.worker1.port=8009


worker.worker1.lbfactor=50


worker.worker1.cachesize=10


worker.worker1.cache_timeout=600


worker.worker1.socket_keepalive=1


worker.worker1.socket_timeout=300

要注意的是JkMount所引用的worker的名稱必須是在work.list定義過的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章