ChinaUnix-Web服務器討論區精華帖
Tomcat 5 + Apache 2 + mod_jk 2 實現虛擬主機
http://www.chinaunix.net 作者:perryhg 發表于:2004-03-17 08:58:21
Tomcat 5 實現了 servlet 2.4 和jsp2.0,在性能上有所提升,尤其是,對我們來說,實現了真正的中文支持,無需添加特別參數就可以直接顯示中文內容,讓java和jsp中文問題成為歷史!
1.首先apache2 ,unix/linux下面就從源代碼編譯安裝,最重要的configure 參數是 --enalbe-modules="so" 其他根據自己需要安裝,windows下面直接安裝編譯好的二進制版本。具體安裝方法很多地方已經有介紹了,這里不贅述,如有需要可以參考 http://httpd.apache.org 或者 chinaunix 的web服務器區精華,唯一一點需要提醒的是,要將 httpd.conf 里面的
[code:1:141851c2a4]#AddDefaultCharset ISO-8859-1[/code:1:141851c2a4]
前面加#注銷掉,很多人提問為什么Apache2顯示中文亂碼,根源就在這里,最簡單的方法就是加一個#就可以正常顯示中文了,無需設置什么GB2312。
2.安裝jdk,tomcat的運行需要j2sdk支持,可以去 http://java.sun.com 下載。windows 的可以下載 offline installation 版本,大概50M左右,下載以后安裝,linux下建議下載 self-extract版本,下載完以后用 chmod +x j2sdk... 加上執行屬性,然后運行下載的文件,會出來一個許可協議,按幾次空格跳過幾頁后,輸入 yes 表示接受協議,然后程序會自動釋放,并建立一個子目錄 j2sdk1.4.2_04。
3.設置環境變量,java的運行需要設置一下環境變量,通常只要設置一個 JAVA_HOME,另外,把java的可執行程序放到path里面去就可以了。在linux下運行
[code:1:141851c2a4]JAVA_HOME=/usr/local/j2sdk1.4.2-04;export $JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin[/code:1:141851c2a4]如果你需要所有的用戶都可以使用java,可以把這段代碼放到 /etc/profile 里面去,這樣你每次登陸的時候就會自動把有關變量設置好了。
windows下面要在“系統屬性”里面->“高級”->點“環境變量”按鈕,如果你希望所有用戶都能用,就建立在“系統變量”里面,點“新建”按鈕,變量名是 “JAVA_HOME”,變量值是你安裝java的路徑,通常是 C:\j2sdk1.4.2-04 ,然后編輯path變量,在變量值最后加上;%JAVA_HOME%\bin
4.安裝tomcat,最簡單是下載binary版本,在linux下面,直接 tar -xzvf jakarta-tomcat-5.0.19 即可。windows下面,直接運行那個exe文件,就會自動安裝了。windows的安裝過程要求設置一個admin用戶和密碼,這個用戶可以在web上管理tomcat服務器的運行和安裝和解除web應用的,還可以創建其他管理用戶,權限很大,所以密碼要小心得取,如果是linux下面,沒有創建這個用戶,則需要到 jakarta-tomcat-5.0.19/conf 下面編輯 tomcat-users.xml 手工添加2個role和1個用戶,最簡單的例子文件如下:
[code:1:141851c2a4]<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="administratorpassword123" roles="admin,manager"/>
</tomcat-users>[/code:1:141851c2a4]
啟動tomcat,tomcat/bin目錄下有startup.sh 用于Linux 和start.bat 用于windows,shutdown.sh 和 shutdown.bat 則用于關閉tomcat,當然,windows下面還有專門的圖形界面的啟動程序,其實效果都是一樣的。
當然,在linux下面也可以用jsvc啟動,并做成啟動腳本隨機器一起啟動。jsvc本來要從 http://jakarta.apache.org 下載 commons-daemon-1.0-Alpha ,不過tomcat 已經自己帶了一個了,在tomcat/bin目錄下有一個jsvc.tar.gz 解壓,編譯:
解壓 tar -xzvf jsvc.tar.gz 然后 cd jsvc-src 然后,運行
[code:1:141851c2a4]sh support/buildconf.sh
./configure
make[/code:1:141851c2a4]
(注意:tomcat-5.0.18版本帶的jsvc源代碼有一個低級錯誤--少一個分號,會導致編譯不成功,可以自己加上這個分號)
tomcat自己帶的jsvc-src/native目錄下還有兩個腳本 Tomcat.sh 和 Tomcat5.sh ,可以用作啟動和停止tomcat的腳本,我把Tomcat5.sh略作修改,文件如下:
[code:1:141851c2a4]#!/bin/sh
#
# Startup Script for Tomcat5
#
# chkconfig: 345 87 13
# description: Tomcat Daemon
# processname: jsvc
# pidfile: /var/run/jsvc.pid
# config:
#
# Source function library.
. /etc/rc.d/init.d/functions
#
prog=tomcat
#
# Small shell script to show how to start/stop Tomcat using jsvc
# If you want to have Tomcat running on port 80 please modify the server.xml
# file:
#
# <!-- Define a non-SSL HTTP/1.1 Connector on port 80 -->
# <Connector className="org.apache.catalina.connector.http.HttpConnector"
# port="80" minProcessors="5" maxProcessors="75"
# enableLookups="true" redirectPort="8443"
# acceptCount="10" debug="0" connectionTimeout="60000"/>
#
# You need a developement version of Tomcat (Apache Tomcat/4.1-dev)
#
# Adapt the following lines to your configuration
#設定自己的參數
JAVA_HOME=/usr/local/j2sdk1.4.2-04
CATALINA_HOME=/usr/local/jakarta-tomcat-5.0.19
DAEMON_HOME=$CATALINA_HOME/bin
#需要在系統中設定一個沒有權限的
#用戶來運行,這樣比較安全
TOMCAT_USER=tomcat5
TMP_DIR=/var/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
start(){
echo -n $"Starting $prog: "
#
# Start Tomcat
#
$DAEMON_HOME/jsvc-src/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$TMP_DIR \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
RETVAL=$?
[ $RETVAL = 0 ] && touch /var/lock/subsys/jsvc
[ $RETVAL = 0 ] && echo_success || echo_failure
echo
return $RETVAL
}
stop(){
echo -n $"Stopping $prog: "
#
# Stop Tomcat
#
PID=`cat /var/run/jsvc.pid`
kill $PID
RETVAL=$?
[ $RETVAL = 0 ] && rm /var/lock/subsys/jsvc
[ $RETVAL = 0 ] && echo_success || echo_failure
echo
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage $0 start/stop"
exit 1;;
esac[/code:1:141851c2a4]
把這段代碼保存為 /etc/rc.d/init.d/tomcat ,然后運行 [code:1:141851c2a4]chkconfig --add tomcat[/code:1:141851c2a4]即可把tomcat 添加為系統服務自動隨系統啟動了。這個腳本會在runlevel 3/4/5三種模式自動啟動。注意這段腳本是為tomcat5創建的,如果你用tomcat4,則需要在另一個tomcat.sh的基礎上修改。
5.編譯和設置mod_jk
windows版本的mod_jk可以直接從 jakarta.apache.org 下載binary版本,linux下只好下載源代碼編譯了。從 http://jakarta.apache.org 下載 jakarta-tomcat-connectors-jk2-src-current.tar.gz 解壓,然后 [code:1:141851c2a4]cd /jakarta-tomcat-connectors-jk2-2.0.2-src/jk/native2
./buildconf.sh[/code:1:141851c2a4]然后運行
[code:1:141851c2a4]./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-java-home=/usr/local/j2sdk1.4.2-04[/code:1:141851c2a4]
(具體路徑按照你實際的調整)
運行
[code:1:141851c2a4]make jk2-build-apxs
cd server/apache2
make -f Makefile.apxs install[/code:1:141851c2a4]
其實這個軟件包本來有ant的配置文件,用ant編譯可能會簡單一些,但是要另外裝ant,而且里面有些模塊不是ant本身native的功能,還要為ant加裝相應的功能模塊,所以這里就略過,下次有時間再發一個ant的應用。
這樣,你的mod_jk總算是裝好了,現在開始進入配置階段,其實,配置很簡單了
6.設置虛擬主機
比如,我現在有虛擬主機 vhosts.vicp.net 希望把jsp和servlet都轉到tomcat去,而其他的文件比如html頁面,圖片等等仍然用apache解析。
Tomcat設置:
修改 tomcat/conf/server.xml,在 <Engine></Engine>里面再增加一個<host/>,
[code:1:141851c2a4]<Host name="vhosts.vicp.net" debug="0"
appBase="/opt/jakarta-tomcat-4.1.12-LE-jdk14/webapps/struts-example"
unpackWARs="true" autoDeploy="true">
<Alias>localhost</Alias>
<Alias>www</Alias>
<Alias>10.0.0.10</Alias>
<Context path="" docBase="" debug="1"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="vhost.vicp.net_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger"
directory="logs" prefix="home_log_" suffix="_app_log.txt"
timestamp="true"/>
</Host>[/code:1:141851c2a4]
調整里面的參數和設置使之適合你的環境,當然,如果你還有其他的<host/>添加在后面。
在 /usr/local/apache/conf 下面創建一個workers2.properties,內容如下:
[code:1:141851c2a4]#---- worker2.properties
[logger.apache2]
level=DEBUG
# Shared memory handling. Needs to be set.
[shm]
file=/usr/local/apache2/logs/shm.file
size=1048576
# Example socket channel, explicitly set port and host.
[channel.socket:localhost:8009]
tomcatId=localhost:8009
port=8009
host=127.0.0.1
# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
#[status:status]
# Uri mapping
#[uri:/jkstatus/*]
#group=status:status
#[uri:/jsp-examples/*]
#group=ajp13:localhost:8009
#[uri:/servlets-examples/*]
#group=ajp13:localhost:8009
#[uri:/javaapp/*]
#group=ajp13:localhost:8009
#[uri:www.home.net/*.jsp]
#worker=ajp13:localhost:8009
#[uri:10.0.0.10/*]
#worker=ajp13:localhost:8009
#---- end of workers2.properties[/code:1:141851c2a4]
當然,你可以刪除其中的注釋符使其中的uri和worker的配置生效,我現在不用這種方式配置是因為找到一個更好的方法:在httpd.conf里面配置:
把下面這段放到VirtualHost之前,可以從全局避免用戶用apache訪問WEB-INF目錄。
[code:1:141851c2a4]<Directory ~ "/WEB-INF/">
Order allow,deny
Deny from all
</Directory>[/code:1:141851c2a4]
典型的VirtualHost配置樣本
[code:1:141851c2a4]<VirtualHost _default_:80>
ServerName vhost.vicp.net
DocumentRoot /home/webapp/public_html/
DirectoryIndex index.htm index.html default.htm index.php index.jsp
<Location ~ "/*.jsp|/*/servlet/*">
JkUriSet worker ajp13:localhost:8009
</Location>
ErrorLog logs/vhosts.vicp.net-err_log
CustomLog logs/vhosts.vicp.net-acc_log common
</VirtualHost>[/code:1:141851c2a4]
這樣就可以為每個不同的虛擬主機分別指定使用或者不使用jsp功能。
好了,可以開始開發和使用你的web應用了!
參考文獻:
1. http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/jk2/vhosthowto.html
2. http://bbs.chinaunix.net/forum/6/20040214/259794.html
3. http://chinaunix.net/jh/6/263220.html