科技讯息网 – 程序员的那点事!

首页 > 编程资料 > Web服务器 > 正文

Tomcat 5 + Apache 2 + mod_jk 2 实现虚拟主机

浏览次数:次 2004年05月04日 作者:perryhg 字号:

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?里面的
#AddDefaultCharset?ISO-8859-1

前面加#注销掉,很多人提问为什么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下运行
JAVA_HOME=/usr/local/j2sdk1.4.2-04;export?$JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
如果你需要所有的用户都可以使用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个用户,最简单的例子文件如下:
;
;
??;
??;
??;
??;
??;
??;
??;
??;
;

启动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?然后,运行
sh?support/buildconf.sh
./configure
make

(注意:tomcat-5.0.18版本带的jsvc源代码有一个低级错误--少一个分号,会导致编译不成功,可以自己加上这个分号)

tomcat自己带的jsvc-src/native目录下还有两个脚本?Tomcat.sh?和?Tomcat5.sh?,可以用作启动和停止tomcat的脚本,我把Tomcat5.sh略作修改,文件如下:

#!/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:
#
#????;
#????<>
#???????????????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

把这段代码保存为?/etc/rc.d/init.d/tomcat?,然后运行?
chkconfig?--add?tomcat
即可把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?解压,然后?
cd?/jakarta-tomcat-connectors-jk2-2.0.2-src/jk/native2
./buildconf.sh
然后运行
./configure?--with-apxs2=/usr/local/apache2/bin/apxs?--with-java-home=/usr/local/j2sdk1.4.2-04

(具体路径按照你实际的调整)
运行
make?jk2-build-apxs
cd?server/apache2
make?-f?Makefile.apxs?install

其实这个软件包本来有ant的配置文件,用ant编译可能会简单一些,但是要另外装ant,而且里面有些模块不是ant本身native的功能,还要为ant加装相应的功能模块,所以这里就略过,下次有时间再发一个ant的应用。

这样,你的mod_jk总算是装好了,现在开始进入配置阶段,其实,配置很简单了

6.设置虚拟主机
比如,我现在有虚拟主机?vhosts.vicp.net?希望把jsp和servlet都转到tomcat去,而其他的文件比如html页面,图片等等仍然用apache解析。
Tomcat设置:
修改?tomcat/conf/server.xml,在?;;里面再增加一个;,
<>
????appBase="/opt/jakarta-tomcat-4.1.12-LE-jdk14/webapps/struts-example"?
????unpackWARs="true"?autoDeploy="true">;
????;localhost;
????;www;
????;10.0.0.10;
????;
????????<>
????????????directory="logs"??prefix="vhost.vicp.net_access_log."?suffix=".txt"
????????????pattern="common"?resolveHosts="false"/>;
????????<>
?????????????????directory="logs"??prefix="home_log_"?suffix="_app_log.txt"
????????????timestamp="true"/>;
;

调整里面的参数和设置使之适合你的环境,当然,如果你还有其他的;添加在后面。

在?/usr/local/apache/conf?下面创建一个workers2.properties,内容如下:

#----?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


当然,你可以删除其中的注释符使其中的uri和worker的配置生效,我现在不用这种方式配置是因为找到一个更好的方法:在httpd.conf里面配置:

把下面这段放到VirtualHost之前,可以从全局避免用户用apache访问WEB-INF目录。
;
????Order?allow,deny
????Deny?from?all
;


典型的VirtualHost配置样本

;
????????ServerName?vhost.vicp.net
????????DocumentRoot?/home/webapp/public_html/
????????DirectoryIndex?index.htm?index.html?default.htm?index.php?index.jsp
????????;
????????????JkUriSet?worker?ajp13:localhost:8009?
????????;
????????ErrorLog?logs/vhosts.vicp.net-err_log
????????CustomLog?logs/vhosts.vicp.net-acc_log?common
;

这样就可以为每个不同的虚拟主机分别指定使用或者不使用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



?tianyaly 回复于:2004-03-22 16:29:49

有朋友试过了吗!看起来的确是好文档!


?bing65 回复于:2004-04-02 05:57:34

[root@localhost?root]#?/usr/local/apache2/bin/apachectl??start
Syntax?error?on?line?232?of?/usr/local/apache2/conf/httpd.conf:
Cannot?load?/usr/local/apache2/modules/libphp5.so?into?server:?/usr/local/apache2/modules/libphp5.so:?undefined?symbol:?compress

是不是安装PHP的时候的问题呢?


?perryhg 回复于:2004-04-02 08:00:04

Cannot?load?/usr/local/apache2/modules/libphp5.so?into?server:?/usr/local/apache2/modules/libphp5.so:?undefined?symbol:?compress?
不是写得很清楚吗?php5的模块有问题,可能是一些库的link设置不对。


?loess 回复于:2004-04-08 12:01:02

[root@hanwei?native2]#?./buildconf.sh
rm?autom4te.cache
libtoolize?--force?--automake?--copy
./buildconf.sh:?line?7:?libtoolize:?command?not?found
aclocal
./buildconf.sh:?line?9:?aclocal:?command?not?found
automake?--copy?--add-missing
./buildconf.sh:?line?11:?automake:?command?not?found
autoconf
./buildconf.sh:?line?13:?autoconf:?command?not?found
[root@hanwei?native2]#


?blanc 回复于:2004-04-08 18:58:31

php5那么快就用新的啦..


?perryhg 回复于:2004-04-27 07:16:23

你autoconf和automake都没装,运行buildconf.sh需要这两个包。


?fishfree 回复于:2004-04-30 20:57:09

急问:怎么我配置时候说不能加上apxs呢?我的apache是2,locate了一下apxs确实就一条是一个html文件,估计是帮助文件,怎么办呢?谢谢!


?我是笨笨 回复于:2004-04-30 21:52:54

没有Uri的地方,直接显示JSP源码,这个是对的
为什么Uri指向以后,就一直没反映呢?


?perryhg 回复于:2004-05-03 02:43:53

我已经指定了不管在什么地方,只要有?.jsp结尾的文件,就自动转向,所以不应该出现jsp源码被显示的问题。
如果你的jsp页面不能正常被显示,就要看查看日志看看错在什么地方了。


?我是笨笨 回复于:2004-05-03 09:29:46

报告说是404,找不到文件
但如果不指定URI,就可以出来,但是是源代码
指定了以后,就一直没反映了,LOG里是404错误
:wink:


?perryhg 回复于:2004-05-03 18:23:24

看?ERROR_LOG?而不是Access?log


?preyswee1982 回复于:2004-05-03 23:29:53

引用:原帖由?"perryhg"?发表:
5.编译和设置mod_jk
windows版本的mod_jk可以直接从?jakarta.apache.org?下载binary版本,linux下只好下载源代码编译了。



现在有binary版了

for?fedora?core1


?我是笨笨 回复于:2004-05-04 01:27:30

引用:原帖由?"perryhg"]看?ERROR_LOG?而不是Access?log
?发表:

看了,是File?not?found,404错误
怎么回事呢?


?perryhg 回复于:2004-05-04 06:37:39

Error_log?应该是象这样的东西

[Tue?May?04?05:30:17?2004]?[error]?[client?218.22.246.86]?File?does?not?exist:?/home/virtweb/default.ida

而不是404,404?Error是access?log里面显示的,通过Error_log你就应该看到具体发生了什么事情了。另外,看看你的tomcat的log,有没有记录访问,如果没有,说明modjk还是没有设置好。