一、技術(shù)準備:
Tomcat是Sun和Apache合作開發(fā)的JSP Server,支持Servlet 和JSP,Tomcat本身可以作為WebServer,當(dāng)處理靜態(tài)頁面時,Tomcat不如Apache迅速,不象Apache一樣可配置,強壯。Apache作為最流行的Web服務(wù)器功能強大,高效,但并不支持JSP及Servlet,所以通常的做法是把它們整合起來,讓Apache處理靜態(tài)頁面,而把動態(tài)頁面的請求交給Tomcat處理,發(fā)揮各自的優(yōu)勢. 通過在Apache中加載整合模塊和進行設(shè)置,Apache就能夠根據(jù)URL,把不屬于自己的請求轉(zhuǎn)給Tomcat。
要讓Apache和Tomcat聯(lián)合工作,還必須有一個連接器把它們聯(lián)系起來,Connector對于性能、配置的方便性有很重要的影響,目前大致上有JK1.x,JK2,mod_webapp三種connector可以使用。JK使用比較廣泛,JK2是JK1.x的改進,比較新。這三種Connector的配置方法大相徑庭。
二、軟件準備:
1.服務(wù)器1的功能:
運行Apache前端,直接面向web Client(各種瀏覽器)。
2.服務(wù)器1上的軟件環(huán)境:
操作系統(tǒng):RedHat AdvanceEnterpriseServer3,該系統(tǒng)默認安裝了apache,但是好像功能不全。
IP地址:192.168.1.114
3.服務(wù)器1上需要的軟件:
Apache(版本為2.0.52)源代碼:Apache httpd-2.0.52.tar.gz 可以從http://www.apache.org下載。
Jk2Connector(版本為2.2.0.4)源代碼:jakarta-tomcat-connectors-jk2-src-current.tar.gz可以從http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/下載。
4.服務(wù)器2的功能:
運行tomcat,處理服務(wù)器1轉(zhuǎn)發(fā)來的web Client的頁面請求,并且將回應(yīng)頁面發(fā)送給服務(wù)器1上的Apache,已使Apache將此回應(yīng)轉(zhuǎn)發(fā)給web Client。
5.服務(wù)器2上的軟件環(huán)境:
操作系統(tǒng):Micorsoft Windows2003 Server。
IP地址:192.168.1.111
6.服務(wù)器2上需要的軟件:
Tomcat(版本為4.1以上)的二進制安裝程序:可以從http://www.apache.org/dist/jakarta/tomcat-4/下載,我使用的是Tomcat4.1。
Java開發(fā)包(版本為1.4):可以從http://www.sun.com下載。我安裝的j2dk1.4。
三、安裝Tomcat:
安裝Tomcat之前先要安裝j2dk,并且設(shè)置JAVA_HOME和將$JAVA_HOME\bin放入到Path中。
由于java開發(fā)包和tomcat4.1的安裝在windows下進行,所以整個的安裝過程比較簡單,就不多言了。
四、配置Tomcat:
根據(jù)網(wǎng)上的一些關(guān)于Apache和Tomcat整合的文章,和我自身的經(jīng)驗,配置Tomcat主要需要以下兩個步驟:
1. 修改Tomcat\conf目錄下的jk2.properties文件,修改后的文件內(nèi)容如下:
## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED
## WHEN YOU EDIT THE FILE.
## COMMENTS WILL BE _LOST_
## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.
# Set the desired handler list
# handler.list=apr,request,channelJni
handler.list = channelSocket,request
#
# Override the default port for the socketChannel
# channelSocket.port=8019
channelSocket.port=8009
# Default:
# channelUnix.file=${jkHome}/work/jk2.socket
# Just to check if the the config is working
# shm.file=${jkHome}/work/jk2.shm
# In order to enable jni use any channelJni directive
# channelJni.disabled = 0
# And one of the following directives:
# apr.jniModeSo=/opt/apache2/modules/mod_jk2.so
# If set to inprocess the mod_jk2 will Register natives itself
# This will enable the starting of the Tomcat from mod_jk2
# apr.jniModeSo=inprocess
很明確目的就是定義Tomcat和Apache通訊的端口,我設(shè)置為8009。
2. 修改Tomcat\conf目錄下的server.xml文件,增加一個虛擬主機:
<Host name="192.168.1.111" debug="10" appBase="/webapps/Root/"unpackWARs="true" autoDeploy="true" xmlValidation="false"xmlNamespaceAware="false">;
<Context path="" docBase="" debug="10" reloadable="true" crossContext="true"/>;
<logger className="org.apache.catalina.logger.FileLogger"directory="logs" prefix="localhost2_log." suffix=".txt"timestamp="true"/>;
</Host>;
理所應(yīng)當(dāng),建立這個虛擬主機是必須的,否則Tomcat將無法/webapps/Root/中的頁面。
五、蒙難日到來了!-安裝Apache:
1.初次安裝jk2Connector:
由于RedHat AdvanceEnterprise Server默認安裝了Apache,但是這個Apache中缺少,整合工作過程中所需要的重要部件-mod_jk2.so庫文件,而要得到這個庫文件就要編譯Jk2Connector源代碼。
但是當(dāng)我解開jakarta-tomcat-connectors-jk2-src-current.tar.gz,進入到j(luò)akarta-tomcat-connectors-jk2-2.0.4-src/jk/native2,執(zhí)行./configure時發(fā)生了錯誤1:
[root@sms jk]# cd native2/
[root@sms native2]# ls
aclocal.m4 BUILD.txt common INSTALL.txt scripts
apr build.xml configure jni server
autom4te.cache CHANGES.html configure.in Makefile.in STATUS.txt
buildconf.sh CHANGES.txt include README.txt tomcat
[root@sms native2]# ./configure
checking build system type... i686-redhat-linux-gnu
checking host system type... i686-redhat-linux-gnu
checking target system type... i686-redhat-linux-gnu
…
checking for mkdir... /bin/mkdir
no apxs given
no apxs2 given
checking checking for apache13...... not provided
checking checking for apache20...... not provided
checking checking for iis...... not provided
checking checking for iPlanet...... not provided
checking for tomcat33 location... not provided
checking for tomcat40 location... not provided
checking for tomcat41 location... not provided
configure: error: Cannot find any WebServer
配置被錯誤中斷了,原因好像是要求的apxs或者apxs2沒有提供。apxs或者apxs2是什么?于是我help了一下:
[root@sms native2]# ./configure --help
...
--with-apxs=FILE location of apxs for Apache 1.3
--with-apxs2=FILE location of apxs for Apache 2.0
...
真的需要提供apxs文件的路徑,用locate命令查找一下:
[root@sms httpd]# locate apsx
[root@sms httpd]#
系統(tǒng)中不存在apsx這個文件。這可急壞了我。為什么RedHat在發(fā)布企業(yè)版時不做完整!往往易用的事物都有隱藏的缺陷,這真是至理名言呀!沒辦法,只好自己安裝一個了。
2.安裝Apache2.0.52:
按照linux下安裝程序的三部曲:./configure,make,makeinstall。這個過程對于一般的linux愛好者來講,It’seasy。。JApache2.0.52被安裝在了/usr/local/Apache目錄下,并且那個apxs文件也被自動放在了/usr/local/apache2/bin/apxs。
3.再次編譯安裝jk2Connector:
注意在configure時一定要指定apxs文件的路徑!不然就白安裝Apache2.0.52了。
[root@sms native2]# ./configure --with-apxs2=/usr/local/apache2/bin/apxs
…
[root@sms native2]# make
…
Make完成后,在/home/liudan/jakarta-tomcat-connectors-jk2-2.0.4-src/jk/build/jk2/apache2目錄下生成了許多的文件和一個usr目錄。但是我在makeinstall時發(fā)生了錯誤,只好手動安裝了。L
看看那個usr目錄下有些什么:
[root@sms apache2]# ls usr/local/apache2/modules/
mod_jk2.a mod_jk2.la mod_jk2.so
哦!我要找的mod_jk2.so就在這里,將它拷貝到Apache的modules目錄中。
[root@sms apache2]# cp usr/local/apache2/modules/* /usr/local/apache2/modules/
4.小結(jié):
這樣Apache2.0.52和jk2Connector就安裝好了。
六、撥云見日-配置Apache:
Apache的配置文件放在/usr/local/Apache/conf目錄中。Apache的整個配置由建立或者修改其中的兩個文件組成。
1.建立workers2.properties:
# only at beginnin. In production uncomment it out
[logger.apache2]
level=DEBUG
[shm]
file=/usr/local/apache/logs/shm.file
size=1048576
# Example socket channel, override port and host.
[channel.socket:192.168.1.111]
port=8009
host=192.168.1.111
在/usr/local/Apache/conf目錄中建立這個文件的目的同在配置Tomcat時修改jk.properties文件一樣,是告訴Apache如何連接Tomcat。
2.修改httpd.conf文件,添加LoadModule和增加一個虛擬主機。
…
LoadModule jk2_module "/usr/local/apache2/modules/mod_jk2.so"
…
NameVirtualHost *:80
<VirtualHost 192.168.1.114:80>;
ServerAdmin webmaster@demo
ServerName 192.168.1.114
DirectoryIndex index.jsp index.html
<Location "/">;
JkUriSet worker ajp13:192.168.1.111:8009
</Location>;
</VirtualHost>;
LoadModule描述了jk2模塊的路徑,而虛擬主機則建立了一個使用192.168.1.114的80端口的web服務(wù),此服務(wù)通過jk2Connector連接Tomcat(地址為192.168.1.111)的8009端口的方式與Tomcat進行通訊。
3.啟動Apache服務(wù):
執(zhí)行/usr/local/Apache/bin目錄中的apachectl命令:
[root@sms bin]# ./apachectl start
(9
Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
說明啟動了系統(tǒng)默認安裝的httpd,只要kill掉httpd后再次運行./apachectl start即可。
如果遇到以下錯誤,請檢查httpd.conf中的LoadModule行是否些正確了!
[root@sms bin]# ./apachectl start
Syntax error on line 1053 of /usr/local/apache2/conf/httpd.conf:
Invalid command ‘JkUriSet‘, perhaps mis-spelled or defined by a module not included in the server configuration
七.大結(jié)局-訪問Apache!
如果在訪問Apache時瀏覽器出現(xiàn)以下錯誤的話,請檢查Apache和Tomcat的服務(wù)是否啟動正常,Apache和Tomcat的配置文件是否正確。
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@demo and inform themof the time the error occurred, and anything you might have done thatmay have caused the error.
More information about this error may be available in the server error log.
--------------------------------------------------------------------------------
Apache/2.0.52 (Unix) mod_jk2/2.0.4 Server at 192.168.1.114 Port 80
當(dāng)然也可以看一下日志,尋找錯誤原因:
[root@sms build]# vi /usr/local/apache2/logs/error_log
[Thu Jan 20 15:16:56 2005] [error] uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009
[Thu Jan 20 15:16:56 2005] [error] uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009
[Thu Jan 20 15:16:56 2005] [error] uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009
[Thu Jan 20 15:16:56 2005] [error] uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009
[Thu Jan 20 15:16:56 2005] [error] uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009
[Thu Jan 20 15:16:56 2005] [notice] Apache/2.0.52 (Unix) mod_jk2/2.0.4 configured -- resuming normal operations
[Thu Jan 20 15:22:47 2005] [error] mod_jk2.handle() No worker for /index.jsp
[Thu Jan 20 15:22:47 2005] [error] mod_jk2.handle() No worker for /favicon.ico
[Thu Jan 20 15:22:51 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:22:51 2005] [error] mod_jk2.handle() No worker for /favicon.ico
[Thu Jan 20 15:22:53 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:22:53 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:22:55 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:22:56 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:23:18 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:23:19 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:23:22 2005] [error] mod_jk2.handle() No worker for /
[Thu Jan 20 15:23:22 2005] [error] mod_jk2.handle() No worker for /favicon.ico
~
花了兩天,終于完成了。不干子享,于大家共同分享。