基于Apache和多实例Tomcat(独立JVM)的虚拟主机方案
转至:http://lovemjd.blog.51cto.com/1373993/286094 基于Apache和多实例Tomcat(独立JVM)的虚拟主机方案
本文摘至网络,用于个人学习!
本文对Apache和Tomcat服务器软件进行整合,并实现Tomcat多实例独立JVM的虚拟主机。
用虚拟主机方式为二级部门提供网站空间是一般学校的常见做法,这样既能节省服务器设备的投资又减少了管理工作量。Linux环境下,通常使用Apache实现静态HTML和动态PHP网站的虚拟主机,使用Tomcat实现JSP网站的虚拟主机。对于Apache虚拟主机,配合MySQL数据库的WEB管理工具PhpMyAdmin已经有了很成熟的实现;而对于Tomcat虚拟主机来说,当多个网站共享同一个Tomcat服务器实例时,若其中某个网站对Tomcat有一些特殊的需求,就需要服务器管理员对Tomcat进行配置,更多的时候,服务器管理员要经常重启Tomcat,程序不好的网站也可能导致Tomcat无法启动,从而影响其他网站也无法访问。另外一个问题是,同一台服务器上,单独的Apache和Tomcat服务程序端口不能冲突,要同时使用PHP和JSP,就需要使用不同的端口。
1 解决方案
为解决上述问题,本文对Apache与Tomcat进行整合,并实现Tomcat多实例独立JVM的虚拟主机(每个虚拟主机用户拥有独立可管理的Tomcat服务器),用Apache解释HTML和PHP等文件,Tomcat执行JSP程序,整合原理如图1所示。
图1中,Apache接受来自客户端的请求,并根据请求信息进行判断,若被请求的网站是JSP的,则由Apache的模块mod_jk将Servlet或JSP请求转发给Tomcat,mod_jk利用AJP worker通过AJP(Apache Jserv Protocol)协议与Tomcat进程通信,Tomcat检查来自AJP workers的请求,确定与请求相对应的虚拟主机,执行程序,并将执行结果通过AJP connector返回给mod_jk,最终由Apache将执行结果返回给客户端。
2 方案实现
2.1 基本系统安装准备
对所需软件进行准备和基本配置。
2.1.1 安装LAMP服务器软件
本文使用CentOS 5.3操作系统,Apache、Mysql、PHP采用源码方式安装(安装位置:/usr/local),软件版本分别是:Apache 2.2.11,Mysql 5.1.47,PHP 5.2.9。
2.1.2 安装tomcat服务器软件
1) 安装JDK(本文版本:1.6.0_17);
2) 安装Tomcat(本文版本:apache-tomcat-6.0.20),默认情况下Tomcat服务的端口为8080;
3) 在/etc/profile文件中配置JDK与Tomcat的环境变量如下:
2.1 基本系统安装准备
对所需软件进行准备和基本配置。
2.1.1 安装LAMP服务器软件
本文使用CentOS 5.3操作系统,Apache、Mysql、PHP采用源码方式安装(安装位置:/usr/local),软件版本分别是:Apache 2.2.11,Mysql 5.1.47,PHP 5.2.9。
2.1.2 安装tomcat服务器软件
1) 安装JDK(本文版本:1.6.0_17);
2) 安装Tomcat(本文版本:apache-tomcat-6.0.20),默认情况下Tomcat服务的端口为8080;
3) 在/etc/profile文件中配置JDK与Tomcat的环境变量如下:
JAVA_HOME=/usr/local/jdk1.6.0_17
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
CATALINA_HOME=/usr/local/apache-tomcat-6.0.20
BASEDIR=/usr/local/apache-tomcat-6.0.20
export CATALINA_HOME BASEDIR
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
CATALINA_HOME=/usr/local/apache-tomcat-6.0.20
BASEDIR=/usr/local/apache-tomcat-6.0.20
export CATALINA_HOME BASEDIR
确保上述软件正确运行,限于篇幅,软件的安装过程从略,可通过google搜索查阅。
2.1.3 下载Apache连接Tomcat的模块mod_jk
地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.28/
注意,要根据服务器的平台和Apache的版本下载相应的mod_jk.so文件,本文下载使用mod_jk-1.2.28-httpd-2.2.X.so文件。
2.2 Apache虚拟主机配置
2.2.1 配置DNS服务器,添加虚拟主机的域名
这里配置2个虚拟主机,域名分别是site1.lzptc.edu.cn和site2.lzptc.edu.cn,均指向这台服务器。
2.2.2 添加虚拟主机用户
添加虚拟主机用户,为用户设定家目录,如:
2.1.3 下载Apache连接Tomcat的模块mod_jk
地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.28/
注意,要根据服务器的平台和Apache的版本下载相应的mod_jk.so文件,本文下载使用mod_jk-1.2.28-httpd-2.2.X.so文件。
2.2 Apache虚拟主机配置
2.2.1 配置DNS服务器,添加虚拟主机的域名
这里配置2个虚拟主机,域名分别是site1.lzptc.edu.cn和site2.lzptc.edu.cn,均指向这台服务器。
2.2.2 添加虚拟主机用户
添加虚拟主机用户,为用户设定家目录,如:
useradd site1 -d /var/www/html/site1
passwd site1
passwd site1
以虚拟主机用户登陆服务器,在其家目录下建立conf、logs、temp、webapps/ROOT和work目录。
2.2.2 修改Apache配置文件httpd.conf,添加虚拟主机
虚拟主机site1.lzptc.edu.cn的配置如下:
2.2.2 修改Apache配置文件httpd.conf,添加虚拟主机
虚拟主机site1.lzptc.edu.cn的配置如下:
NameVirtualHost *:80
<VirtualHost *:80>
DirectoryIndex index.html index.htm index.jsp index.php
ServerName site1.lzptc.edu.cn
# 虚拟主机用户程序位置
DocumentRoot /var/www/html/site1/webapps/ROOT
ServerAdmin [email protected]
# Apache遇见下列文件后,转给Tomcat
JkMount /*.jsp site1-worker
JkMount /*.do site1-worker
JkMount /servlet/* site1-worker
# 目录访问权限设置
<Location “/var/www/html/site1/webapps/ROOT/WEB-INF/*”>
Options Indexes FollowSymLinks
AllowOverride None
deny from all
</Location>
# 目录访问权限设置
<Location “/var/www/html/site1/webapps/ROOT/META-INF/*”>
AllowOverride None
deny from all
</Location>
</VirtualHost>
<VirtualHost *:80>
DirectoryIndex index.html index.htm index.jsp index.php
ServerName site1.lzptc.edu.cn
# 虚拟主机用户程序位置
DocumentRoot /var/www/html/site1/webapps/ROOT
ServerAdmin [email protected]
# Apache遇见下列文件后,转给Tomcat
JkMount /*.jsp site1-worker
JkMount /*.do site1-worker
JkMount /servlet/* site1-worker
# 目录访问权限设置
<Location “/var/www/html/site1/webapps/ROOT/WEB-INF/*”>
Options Indexes FollowSymLinks
AllowOverride None
deny from all
</Location>
# 目录访问权限设置
<Location “/var/www/html/site1/webapps/ROOT/META-INF/*”>
AllowOverride None
deny from all
</Location>
</VirtualHost>
加入第二个虚拟主机site2.lzptc.edu.cn(用“site2”替换上边配置中的“site1”),更多的虚拟主机同理。
2.3 Apache与Tomcat整合,Tomcat多实例配置
2.3.1 安装配置mod_jk
1) 复制mod_jk-1.2.28-httpd-2.2.X.so文件到Apache的module目录;
2) 修改httpd.conf,添加mod_jk支持:
2.3 Apache与Tomcat整合,Tomcat多实例配置
2.3.1 安装配置mod_jk
1) 复制mod_jk-1.2.28-httpd-2.2.X.so文件到Apache的module目录;
2) 修改httpd.conf,添加mod_jk支持:
# 添加mod_jk支持
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.X.so
# mod_jk worker 配置文件workers.properties的位置:Apache的conf目录
JkWorkersFile conf/workers.properties
# mod_jk 日志文件
JkLogFile logs/mod_jk.log
JkLogLevel error
# 日志时间格式
JkLogStampFormat “[%a %b %d %H:%M:%S:%Y]“
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.X.so
# mod_jk worker 配置文件workers.properties的位置:Apache的conf目录
JkWorkersFile conf/workers.properties
# mod_jk 日志文件
JkLogFile logs/mod_jk.log
JkLogLevel error
# 日志时间格式
JkLogStampFormat “[%a %b %d %H:%M:%S:%Y]“
2.3.2 在Apache的conf目录下建立mod_jk连接Tomcat的配置文件workers.properties:
# 指定Tomcat和JDK的路径
workers.tomcat_home=/usr/local/apache-tomcat-6.0.20
workers.java_home=/usr/local/jdk1.6.0_17
ps=/
#—— DEFAULT worker list ——————————————
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp12, ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr
# 定义转发请求到不同Tomcat的worker列表,此处定义2个,分别对应虚拟主机site1 和site2
worker.list=site1-worker,site2-worker
# 虚拟主机site1.lzptc.edu.cn的worker定义,端口8301随后在用户的server.xml定义
worker.site1-worker.port=8301
worker.site1-worker.host=site1.lzptc.edu.cn
worker.site1-worker.type=ajp13
# 虚拟主机site2.lzptc.edu.cn的worker定义,端口8302随后在用户的server.xml定义
worker.site2-worker.port=8302
worker.site2-worker.host=site2.lzptc.edu.cn
worker.site2-worker.type=ajp13
workers.tomcat_home=/usr/local/apache-tomcat-6.0.20
workers.java_home=/usr/local/jdk1.6.0_17
ps=/
#—— DEFAULT worker list ——————————————
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp12, ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr
# 定义转发请求到不同Tomcat的worker列表,此处定义2个,分别对应虚拟主机site1 和site2
worker.list=site1-worker,site2-worker
# 虚拟主机site1.lzptc.edu.cn的worker定义,端口8301随后在用户的server.xml定义
worker.site1-worker.port=8301
worker.site1-worker.host=site1.lzptc.edu.cn
worker.site1-worker.type=ajp13
# 虚拟主机site2.lzptc.edu.cn的worker定义,端口8302随后在用户的server.xml定义
worker.site2-worker.port=8302
worker.site2-worker.host=site2.lzptc.edu.cn
worker.site2-worker.type=ajp13
2.3.3 复制Tomcat的配置文件server.xml文件到每个虚拟主机用户的conf目录下,对每个用户的server.xml进行端口设定,注意,每个虚拟主机的Tomcat端口是独立的,虚拟主机site1.lzptc.edu.cn的配置文件如下,其中AJP/1.3协议的端口号为8301,这与workers.properties中site1-worker的端口号一致。同理可设定其他虚拟主机的server.xml文件。
<?xml version=’1.0′ encoding=’utf-8′?>
<Server port=”8101″ shutdown=”SHUTDOWN”>
…… <!—此处配置省略 –>
<Service name=”Catalina”>
<Connector port=”8201″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8301″ protocol=”AJP/1.3″ redirectPort=”8443″ />
…… <!—此处配置省略 –>
</Service>
</Server>
<Server port=”8101″ shutdown=”SHUTDOWN”>
…… <!—此处配置省略 –>
<Service name=”Catalina”>
<Connector port=”8201″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8301″ protocol=”AJP/1.3″ redirectPort=”8443″ />
…… <!—此处配置省略 –>
</Service>
</Server>
虚拟主机site2.lzptc.edu.cn的server.xml文件配置如下:
<?xml version=’1.0′ encoding=’utf-8′?>
<Server port=”8102″ shutdown=”SHUTDOWN”>
…… <!—此处配置省略 –>
<Service name=”Catalina”>
<Connector port=”8202″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8302″ protocol=”AJP/1.3″ redirectPort=”8443″ />
…… <!—此处配置省略 –>
</Service>
</Server>
<Server port=”8102″ shutdown=”SHUTDOWN”>
…… <!—此处配置省略 –>
<Service name=”Catalina”>
<Connector port=”8202″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8302″ protocol=”AJP/1.3″ redirectPort=”8443″ />
…… <!—此处配置省略 –>
</Service>
</Server>
2.3.4 独立Tomcat的启动停止
1) 虚拟主机用户自行启动
每个虚拟主机用户启动独立的Tomcat,需要给它们设置独立Tomcat的CATALINA_BASE路径,这里将CATALINA_BASE的值设置为用户的家目录。为方便用户启动停止各自的Tomcat服务器,编写脚本tomcat.sh如下:
1) 虚拟主机用户自行启动
每个虚拟主机用户启动独立的Tomcat,需要给它们设置独立Tomcat的CATALINA_BASE路径,这里将CATALINA_BASE的值设置为用户的家目录。为方便用户启动停止各自的Tomcat服务器,编写脚本tomcat.sh如下:
#!/bin/bash
# description: Start up the Tomcat servlet engine.
# Source function library.
. /etc/init.d/functions
RETVAL=$?
export CATALINA_BASE=”/var/www/html/site1″ # 用户的家目录,可修改
export CATALINA_HOME=”/usr/local/apache-tomcat-6.0.20″
case “$1″ in
start)
if [ -f $CATALINA_HOME/bin/startup.sh ];
then
echo $”Starting Tomcat”
$CATALINA_HOME/bin/startup.sh
fi
;;
stop)
if [ -f $CATALINA_HOME/bin/shutdown.sh ];
then
echo $”Stopping Tomcat”
$CATALINA_HOME/bin/shutdown.sh
fi
;;
*)
echo $”Usage: $0 {start|stop}”
exit 1
;;
esac
exit $RETVAL
# description: Start up the Tomcat servlet engine.
# Source function library.
. /etc/init.d/functions
RETVAL=$?
export CATALINA_BASE=”/var/www/html/site1″ # 用户的家目录,可修改
export CATALINA_HOME=”/usr/local/apache-tomcat-6.0.20″
case “$1″ in
start)
if [ -f $CATALINA_HOME/bin/startup.sh ];
then
echo $”Starting Tomcat”
$CATALINA_HOME/bin/startup.sh
fi
;;
stop)
if [ -f $CATALINA_HOME/bin/shutdown.sh ];
then
echo $”Stopping Tomcat”
$CATALINA_HOME/bin/shutdown.sh
fi
;;
*)
echo $”Usage: $0 {start|stop}”
exit 1
;;
esac
exit $RETVAL
将该脚本文件保存在虚拟主机用户的家目录下,添加执行权限,用户运行tomcat.sh start|stop命令即可启动/定制自己的Tomcat服务器。
2) 服务器管理员统一启动
当服务器重启后,需要服务器的管理员统一对各独立的Tomcat实例进行启动,编写脚本如下,可以将该脚本设置为开机启动。
2) 服务器管理员统一启动
当服务器重启后,需要服务器的管理员统一对各独立的Tomcat实例进行启动,编写脚本如下,可以将该脚本设置为开机启动。
#!/bin/bash
CATALINA_HOME=”/usr/local/apache-tomcat-6.0.20”
SITE_ROOT=”/var/www/html” # 所有的虚拟主机家目录都在此处
SITES=`ls ${SITE_ROOT}`
for x in ${SITES}
do
CATALINA_BASE=${SITE_ROOT}/${x}
echo “Starting server: ${x} with CATALINA_BASE=${CATALINA_BASE}”
export CATALINA_BASE
${CATALINA_HOME}/bin/startup.sh
done
CATALINA_HOME=”/usr/local/apache-tomcat-6.0.20”
SITE_ROOT=”/var/www/html” # 所有的虚拟主机家目录都在此处
SITES=`ls ${SITE_ROOT}`
for x in ${SITES}
do
CATALINA_BASE=${SITE_ROOT}/${x}
echo “Starting server: ${x} with CATALINA_BASE=${CATALINA_BASE}”
export CATALINA_BASE
${CATALINA_HOME}/bin/startup.sh
done
2.4 为每个独立的JVM设定内存限制
增加Tomcat的环境变量JVM_OPTIONS,设置举例如下
增加Tomcat的环境变量JVM_OPTIONS,设置举例如下
JVM_OPTIONS=’-Xms32m –Xmx64m’
export JAVA_OPTS
export JAVA_OPTS
其中“Xms32m –Xmx64m”表示该JVM的初始内存为32MB,设定该JVM能使用的最大内存为64MB。
3 总结
通过对Apache和Tomcat的整合,使客户端能够通过同一端口访问WEB服务器的PHP和JSP程序,并实现Tomcat多实例独立JVM的虚拟主机,方便虚拟主机用户对各自虚拟主机的控制,克服了单个Tomcat运行JSP程序时虚拟主机之间会产生影响的缺点。
通过对Apache和Tomcat的整合,使客户端能够通过同一端口访问WEB服务器的PHP和JSP程序,并实现Tomcat多实例独立JVM的虚拟主机,方便虚拟主机用户对各自虚拟主机的控制,克服了单个Tomcat运行JSP程序时虚拟主机之间会产生影响的缺点。
相关推荐
songshijiazuaa 2020-08-15
Kafka 2020-09-18
Wepe0 2020-10-30
杜倩 2020-10-29
windle 2020-10-29
minerd 2020-10-28
mengzuchao 2020-10-22
Junzizhiai 2020-10-10
bxqybxqy 2020-09-30
风之沙城 2020-09-24
kingszelda 2020-09-22
大唐帝国前营 2020-08-18
yixu0 2020-08-17
TangCuYu 2020-08-15
xiaoboliu00 2020-08-15
xclxcl 2020-08-03
zmzmmf 2020-08-03
newfarhui 2020-08-03
likesyour 2020-08-01