一、技術(shù)準備:
Tomcat是Sun和Apache合作開(kāi)發(fā)的JSP Server,支持Servlet 和JSP,Tomcat本身可以作為WebServer,當處理靜態(tài)頁(yè)面時(shí),Tomcat不如Apache迅速,不象Apache一樣可配置,強壯。Apache作為最流行的Web服務(wù)器功能強大,高效,但并不支持JSP及Servlet,所以通常的做法是把它們整合起來(lái),讓Apache處理靜態(tài)頁(yè)面,而把動(dòng)態(tài)頁(yè)面的請求交給Tomcat處理,發(fā)揮各自的優(yōu)勢. 通過(guò)在A(yíng)pache中加載整合模塊和進(jìn)行設置,Apache就能夠根據URL,把不屬于自己的請求轉給Tomcat。
要讓Apache和Tomcat聯(lián)合工作,還必須有一個(gè)連接器把它們聯(lián)系起來(lái),Connector對于性能、配置的方便性有很重要的影響,目前大致上有JK1.x,JK2,mod_webapp三種connector可以使用。JK使用比較廣泛,JK2是JK1.x的改進(jìn),比較新。這三種Connector的配置方法大相徑庭。
二、軟件準備:
1.服務(wù)器1的功能:
運行Apache前端,直接面向web Client(各種瀏覽器)。
2.服務(wù)器1上的軟件環(huán)境:
操作系統:RedHat AdvanceEnterpriseServer3,該系統默認安裝了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轉發(fā)來(lái)的web Client的頁(yè)面請求,并且將回應頁(yè)面發(fā)送給服務(wù)器1上的Apache,已使Apache將此回應轉發(fā)給web Client。
5.服務(wù)器2上的軟件環(huán)境:
操作系統:Micorsoft Windows2003 Server。
IP地址:192.168.1.111
6.服務(wù)器2上需要的軟件:
Tomcat(版本為4.1以上)的二進(jìn)制安裝程序:可以從http://www.apache.org/dist/jakarta/tomcat-4/下載,我使用的是Tomcat4.1。
Java開(kāi)發(fā)包(版本為1.4):可以從http://www.sun.com下載。我安裝的j2dk1.4。
三、安裝Tomcat:
安裝Tomcat之前先要安裝j2dk,并且設置JAVA_HOME和將$JAVA_HOME\bin放入到Path中。
由于java開(kāi)發(fā)包和tomcat4.1的安裝在windows下進(jìn)行,所以整個(gè)的安裝過(guò)程比較簡(jiǎn)單,就不多言了。
四、配置Tomcat:
根據網(wǎng)上的一些關(guān)于A(yíng)pache和Tomcat整合的文章,和我自身的經(jīng)驗,配置Tomcat主要需要以下兩個(gè)步驟:
1. 修改Tomcat\conf目錄下的jk2.properties文件,修改后的文件內容如下:
## 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通訊的端口,我設置為8009。
2. 修改Tomcat\conf目錄下的server.xml文件,增加一個(gè)虛擬主機:
<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>;
理所應當,建立這個(gè)虛擬主機是必須的,否則Tomcat將無(wú)法/webapps/Root/中的頁(yè)面。
五、蒙難日到來(lái)了!-安裝Apache:
1.初次安裝jk2Connector:
由于RedHat AdvanceEnterprise Server默認安裝了Apache,但是這個(gè)Apache中缺少,整合工作過(guò)程中所需要的重要部件-mod_jk2.so庫文件,而要得到這個(gè)庫文件就要編譯Jk2Connector源代碼。
但是當我解開(kāi)jakarta-tomcat-connectors-jk2-src-current.tar.gz,進(jìn)入到j(luò )akarta-tomcat-connectors-jk2-2.0.4-src/jk/native2,執行./configure時(shí)發(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沒(méi)有提供。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]#
系統中不存在apsx這個(gè)文件。這可急壞了我。為什么RedHat在發(fā)布企業(yè)版時(shí)不做完整!往往易用的事物都有隱藏的缺陷,這真是至理名言呀!沒(méi)辦法,只好自己安裝一個(gè)了。
2.安裝Apache2.0.52:
按照l(shuí)inux下安裝程序的三部曲:./configure,make,makeinstall。這個(gè)過(guò)程對于一般的linux愛(ài)好者來(lái)講,It’seasy。。JApache2.0.52被安裝在了/usr/local/Apache目錄下,并且那個(gè)apxs文件也被自動(dòng)放在了/usr/local/apache2/bin/apxs。
3.再次編譯安裝jk2Connector:
注意在configure時(shí)一定要指定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目錄下生成了許多的文件和一個(gè)usr目錄。但是我在makeinstall時(shí)發(fā)生了錯誤,只好手動(dòng)安裝了。L
看看那個(gè)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.小結:
這樣Apache2.0.52和jk2Connector就安裝好了。
六、撥云見(jiàn)日-配置Apache:
Apache的配置文件放在/usr/local/Apache/conf目錄中。Apache的整個(gè)配置由建立或者修改其中的兩個(gè)文件組成。
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目錄中建立這個(gè)文件的目的同在配置Tomcat時(shí)修改jk.properties文件一樣,是告訴Apache如何連接Tomcat。
2.修改httpd.conf文件,添加LoadModule和增加一個(gè)虛擬主機。
…
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模塊的路徑,而虛擬主機則建立了一個(gè)使用192.168.1.114的80端口的web服務(wù),此服務(wù)通過(guò)jk2Connector連接Tomcat(地址為192.168.1.111)的8009端口的方式與Tomcat進(jìn)行通訊。
3.啟動(dòng)Apache服務(wù):
執行/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
說(shuō)明啟動(dò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
七.大結局-訪(fǎng)問(wèn)Apache!
如果在訪(fǎng)問(wèn)Apache時(shí)瀏覽器出現以下錯誤的話(huà),請檢查Apache和Tomcat的服務(wù)是否啟動(dòng)正常,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
當然也可以看一下日志,尋找錯誤原因:
[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
~
花了兩天,終于完成了。不干子享,于大家共同分享。