您的位置:首页 > 运维架构 > Tomcat

tomcat应用及tomcat+apache负载均衡,集群

2012-08-11 14:15 246 查看
一、实验前准备

1.所需软件





2.需要用到的主机

node1:172.16.133.11

node2:172.16.133.12

rs1:172.16.133.1

二、tomcat+apache实战

1.tomcat安装及初步认识

Tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现;但由于遵守apache开源协议,tomcat却又为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss和JOnAS。

尽管Tomcat对Jave EE API的实现并不完整,然而很企业也在渐渐抛弃使用传统的Java EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。这些开源组件如Structs、Spring和Hibernate,而Tomcat能够对这些组件实现完美的支持。

(1).tomcat的初次使用

node1:先安装jdk

rpm -ivh jdk-7u5-linux-i586.rpm

修改环境变量

vim /etc/profile
JAVA_HOME=/usr/java/jdk1.7.0_05
PATH=$JAVA_HOME:$PATH
export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
tar xf apache-tomcat-7.0.29.tar.gz -C /usr/local
cd /usr/local
ln -sv apache-tomcat-7.0.29/ tomcat
cd tomcat/bin
./version.sh






可以查看到,我们当前系统的内核,还有jdk的版本,tomcat的安装路径,tomcat的实例路径等

./catalina.sh configtest检查一下配置文件

./catalina.sh start启动tomcat

从ie中访问http://172.16.133.11:8080,可以进入系统自带的首页





(2).tomcat的第一个小实例

下面我们自己做个简单的jsp页面进行测试

cd
mkdir test
cd test/
mkdir -pv WEB-INF/{lib,classes}
vim index.jsp
<%@ page language="java" %>
<html>
<head>
<title>tomcatqinqin</title>
</head>
<body>
<h2><font color="red">tomcat in www.qinqin.com</font></h2>
<% out.println("hello world!"); %>
</body>
</html>
cd
cp -r test/ /usr/local/tomcat/webapps/
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh configtest
/usr/local/tomcat/bin/catalina.sh start

然后在ie中访问http://172.16.133.11:8080/test





2.tomcat深入

(1).tomcat路径别名使用

tomcat的配置文件server.xml在/usr/local/tomcat/conf中

他的Context组件提供该功能

mkdir /www/webapps -pv
mv /usr/local/tomcat/webapps/test/ /www/webapps/
vim /usr/local/tomcat/conf/server.xml

在host标签中,加入一行,注意不要加到注释行里面了(<!-- -->这样的是注释行)

<Context path="/test" docBase="/www/webapps/test" reloadable="true" />
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh configtest
/usr/local/tomcat/bin/catalina.sh start

(2).tomcat虚拟主机的使用

tomcat的host组件,在server.xml中的host标签

这里我们实验在系统自带的host标签前,新定义一个host标签

vim /usr/local/tomcat/conf/server.xml
<Host name="qinqin.magedu.com" appBase="/www/webapps/jcenter" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/www/webapps/test" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="test_access_log." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh configtest
/usr/local/tomcat/bin/catalina.sh start

然后就可以在网页中访问http://qinqin.magedu.com:8080





(3).tomcat的管理界面

①.manager

在tomcat的主页http://172.16.133.11:8080中,点击 Manager App按钮,会提示输入帐号,密码,然后点击取消

然后在弹出的错误页面中,我们可以看到,manager的详细设置,和所可以使用的角色都是哪些,分别代表着什么





要定义在tomcat-users.xml中的<tomcat-users>标签中

vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui" />
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh configtest
/usr/local/tomcat/bin/catalina.sh start

重新返回到主页面,点击Manager App页面,输入帐号tomcat,密码tomcat,即可进入,可以看到,里面有我们刚定义的test页面









②.host-manager

在tomcat的主页http://172.16.133.11:8080中,点击 Host Manager按钮,会提示输入帐号,密码,然后点击取消





然后在弹出的错误页面中,我们可以看到,host-manager的详细设置,和所可以使用的角色都是哪些,分别代表着什么

vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<user username="redhat" password="redhat" roles="admin-gui" />
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh configtest
/usr/local/tomcat/bin/catalina.sh start

重新返回到主页面,点击Host Manager输入帐号密码,即可进入,这里host-manager和manager的帐号名不能一样





可以看到我们刚才添加的虚拟主机qinqin.magedu.com,也可以从这个web页面添加新的

3.tomcat+apache

apache的安装请见:http://5142926.blog.51cto.com/5132926/921873

不过这里要注意的是,在编译安装httpd时,./configure要在后面添加这几项--enable-proxy --enable-proxy-http --enable-proxy-ajp

即:

./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util  --enable-proxy --enable-proxy-http --enable-proxy-ajp

配置apache加载相应的模块:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

(1).反向代理

node1:

注释掉/etc/httpd/httpd.conf中的DocumentRoot

启动虚拟主机

Include /etc/httpd/extra/httpd-vhosts.conf

①.基于proxy-http

<VirtualHost *:80>
ProxyPass /test http://172.16.133.11:8080/test ProxyPassReverse /test http://172.16.133.11:8080/test ProxyVia On
</VirtualHost>

在网页中打开http://172.16.133.11/test





②.基于基于proxy-ajp

<VirtualHost *:80>
ProxyPass /test ajp://172.16.133.11:8009/test
ProxyPassReverse /test ajp://172.16.133.11:8009/test
ProxyVia On
</VirtualHost>

然后为了防止浏览器缓存,换个浏览器打开http://172.16.133.11/test





(2).负载均衡

node2:配置同node1

修改node2中test的index.jsp的内容为

<%@ page language="java" %>
<html>
<head>
<title>tomcatb</title>
</head>
<body>
<h2><font color="red">tomcat in www.magedu.com</font></h2>
<% out.println("hello world!"); %>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

node1:修改node1中test的index.jsp的内容为

<%@ page language="java" %>
<html>
<head>
<title>tomcata</title>
</head>
<body>
<h2><font color="red">tomcat in www.magedu.com</font></h2>
<% out.println("hello world!"); %>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

①基于mod_proxy

为了以后方便基于mod_proxy和基于mod_jk的切换,这里我们写到虚拟主机的配置文件中

开启Include /etc/httpd/extra/httpd-vhosts.conf

并注释掉DocumentRoot

修改vhost配置文件

vim /etc/httpd/extra/httpd-vhosts.conf
ProxyRequests Off
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.133.11:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://172.16.133.12:8009 loadfactor=1 route=TomcatB
</proxy>
ServerAdmin admin@magedu.com
ServerName qinqin.magedu.com
ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
ProxyPassReverse / balancer://lbcluster1/









②基于mod_jk

配置apache通过mod_jk模块与Tomcat连接

tar xf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/native/
./configure --with-apxs=/usr/local/apache/bin/apxs
make && make install

apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:

vim /etc/httpd/extra/httpd-jk.conf
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/extra/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  TomcatA
JkMount  /status/  stat1

然后在/etc/httpd/httpd.conf中添加(为了方便,最好添加在Include /etc/httpd/extra/httpd-vhosts.conf下面)

Include /etc/httpd/extra/httpd-jk.conf

对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。

workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。

worker.list = < a comma separated list of worker names >

worker. <worker name> .<property> = <property value>

其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:

worker.TomcatA.host=172.16.133.1

编辑/etc/httpd/extra/workers.properties,添加如下内容:

worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.133.11
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.133.12
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker. lbcluster1.type = lb
worker. lbcluster1.sticky_session = 1
worker. lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status

在tomcat的主配置文件中的Engine标签中添加

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

node2:

在tomcat的主配置文件中的Engine标签中添加

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

然后在网页中打开http://qinqin.magedu.com/status





看以查看到两台节点

然后,我们关掉node2的tomcat在看





(3)集群

node1:

在tomcat的主配置文件server.xml中<Engine>标签后添加如下内容

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.50.10.1"   bind="172.16.133.11"   port="45564"
frequency="500"  dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.16.133.11"   port="4000"  autoBind="100"
selectorTimeout="5000"   maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"  watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

同理node2

node1:

然后要注释掉/etc/httpd/httpd.conf中的vhost跟jk,添加一条

Include /etc/httpd/extra/httpd-proxy.conf
vim /etc/httpd/extra/httpd-proxy.conf
ProxyRequests Off
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.133.11:8009 loadfactor=10 route=TomcatA
BalancerMember ajp://172.16.133.12:8009 loadfactor=10 route=TomcatB
ProxySet lbmethod=bytraffic
</proxy>
# ProxyPass / balancer://lbcluster1/ stickysession=jsessionid
ProxyPass /lbmanager !
ProxyPass /status !
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
ProxyStatus full

<Location /lbmanager>
SetHandler balancer-manager
Require all granted
</Location>

<Location /status>
SetHandler server-status
Require all granted
</Location>

重启httpd和tomcat,打开网页访问http://172.16.133.11









可以看到session id是不变的,另外我在proxy.conf中还添加了lbmanager,可以提供对集群的管理





(4).持续会话

①.标准会话管理器(StandardManager)

<Manager className="org.apache.catalina.session.StandardManager" maxInactiveInterval="7200"/>

默认保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。

maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制;

maxInactiveInterval:非活动的会话超时时长,默认为60s;

pathname:会话文件的保存目录;

②.持久会话管理器(PersistentManager)

将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。

<Manager className="org.apache.catalina.session.PersistentManager"

saveOnRestart="true">

<Store className="org.apache.catalina.session.FileStore"

directory="/data/tomcat-sessions"/>

</Manager>

每个用户的会话会被保存至directory指定的目录中的文件中,文件名为<session id>.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。
本文出自 “周钰钦” 博客,请务必保留此出处http://zhouyuqin.blog.51cto.com/5132926/960900
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: