Tomcat与Apache集群详细配置过程
所需工具
Linux系统:CentOS操作系统
-
Jdk:版本为jdk1.6.0_45
-
Apache:版本为2.4.12,安装包httpd-2.4.12.tar.gz,http://httpd.apache.org/download.cgi
-
Apache依赖于APR、APR-Util和PCRE,所以需要下载:
-
Apr:版本为1.5.1,安装包apr-1.5.1.tar.gz,http://apr.apache.org/download.cgi
-
Apr-util:版本为1.5.4,安装包apr-util-1.5.4.tar.gz,http://apr.apache.org/download.cgi
-
Pcre:版本为8.36,安装包pcre-8.36.tar.gz,http://sourceforge.net/projects/pcre/files/pcre/
-
mod_jk:版本为1.2.40,安装包:tomcat-connectors-1.2.40-src.tar.gz,http://tomcat.apache.org/download-connectors.cgi
-
Tomcat:版本为7.0.47,安装包apache-tomcat-7.0.47.tar.gz,http://tomcat.apache.org/download-70.cgi
配置过程
1. 安装CentOS虚机,配置Jdk环境。CentOS如自带OpenJDK和Apache服务器则将其删,除此处不做详细说明。
2. 安装APR
-
解压缩APR
-
shell> sudo tar zxvf apr-1.4.6.tar.gz
-
-
安装
-
shell> cd /opt/sources/apr-1.4.6
-
shell>sudo ./configure --prefix=/usr/local/apr
-
shell>sudomake
-
shell>sudomakeinstall
-
4. 安装APR-Util
- 解压缩APR-Util
-
shell> sudo tar zxvf apr-util-1.4.1.tar.gz
-
- 安装
-
shell> cd /opt/sources/apr-util-1.4.1
-
shell>sudo ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
-
shell>sudomake
-
shell>sudomakeinstall
-
-
-
5. 安装PCRE
-
首先请确定系统安装了Perl,Perl在此不再赘述,如有需要请去官网查看安装细则:http://www.cpan.org/src/README.html
-
解压缩PCRE
-
shell> sudo tar zxvf pcre-8.30.tar.gz
-
-
安装PCRE
-
shell> cd /opt/sources/pcre-8.30
-
shell>sudo ./configure --prefix=/usr/local/pcre
-
shell>sudomake
-
shell>sudomake install
-
6. 安装Apache 2.4
-
解压缩Apache 2.4
-
shell> sudo tar zxvf httpd-2.4.2.tar.gz
-
-
安装Apache
-
shell> cd /opt/sources/httpd-2.4.2
-
shell> sudo make
-
shell>sudomake install
-
7. Apache配置及测试
-
安装完毕后,在测试启动apache之前先修改/apache/conf /httpd.conf。
-
如不能使用80端口,可查找Listen,修改监听端口号。
-
查找ServerName,打开注释,将ServerName值改为对应的IP地址,如127.0.0.1:8111。
-
保存httpd.conf文件的修改,启动apache服务。shell> /usr/local/apache/bin/apachectl start
-
查看httpd是否运行 shell >ps -ef | grep httpd
-
浏览器测试apache。在浏览器中访问http://xxx.xxx.xxx.xxx:8111 (apache服务器IP)。页面出现“It's Works!”字样即为成功。
8. Apache的启动和关闭
- 在/usr/local/apache/bin下有可执行程序。
- 启动apache服务:# /usr/local/apache/bin/apachectl start
- 关闭apache服务:# /usr/local/apache/bin/apachectlstop
- 重启apache服务:# /usr/local/apache/bin/apachectl restart
9. Tomcat安装、测试及配置
-
将安装包拷贝到/usr/local目录下
-
解压安装包到当前目录。 shell>tar -zxvf apache-tomcat-7.0.47.tar.gz
-
修改配置文件,增加java的环境变量信息。在/usr/local/apache-tomcat-7.0.47/bin下有文件catalina.sh 在文件头部增加下列信息
-
exportJAVA_HOME=/usr/local//Java/jdk1.7.0_45
-
exportCLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
-
exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
-
JDK目录以实际安装目录为准
-
启动tomcat,shell>/usr/local/apache-tomcat-7.0.47/bin/startup.sh。
-
10. tomcat的启动和关闭
-
启动tomcat服务:
- shell> /usr/local/apache-tomcat-7.0.47/bin/startup.sh
- shell> /usr/local/apache-tomcat-7.0.47/bin/catalina.sh start
- 关闭tomcat服务:
- shell> /usr/local/apache-tomcat-7.0.47/bin/shutdown.sh
- shell> /usr/local/apache-tomcat-7.0.47/bin/catalina.sh stop
11. tomcat的java web项目发布
-
用Eclipse将编译好的Java Web项目导出成war包。
-
将war包放置到linux服务器上的tomcat的webapps目录下。如本次配置放在/usr/local/apache-tomcat-7.0.47/webapps下。
-
启动tomcat后,tomcat会自动将war包解压并运行Java Web项目。
12. Tomcat设置默认访问项目
-
打开/usr/local/apache-tomcat-7.0.47/conf/server.xml,在<Host></Host>标签之间加入下面的语句:<Contextpath="" docBase="test" debug="0"reloadable="false" />。 <Context>标签的docBase值为想要默认访问的项目名称,此处为test。文件修改后如图所示。然后重新启动tomcat,打开浏览器,输入http://127.0.0.1:8080,就可以访问test项目。
13. mod_jk安装
-
mod_jk的作用:连接apache和tomcat集群的中间件。
-
将安装包拷贝到/usr/local目录下。
-
解压安装包到当前目录,shell>tar -zxvf tomcat-connectors-1.2.40-src.tar.gz
-
编译安装mod_jk
-
shell>cd /tomcat-connectors-1. 2.40-src/native
-
shell>chmod 755 buildconf.sh
-
shell>/buildconf.sh
-
shell>/configure --with-apxs=/usr/local/apache/bin/apxs
-
shell>make
-
shell>make install
-
-
如缺少libtool,则可用yum命令安装。
-
最后将/tomcat-connectors-1.2.37/apache-2.0目录下生成的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。shell>cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/
14. 集群负载均衡-tomcat配置
-
修改Tomcat/conf 路径下的server.xml的< Connector>节点配置:
是关于使用ajp连接apache和tomcat时的配置。修改成如下形式:
<!-- Definean AJP 1.3 Connector on port 8009 -->
<Connectorport="8009"protocolhandlerclassname="org.apache.jk.server.jkcoyotehandler"protocol="AJP/1.3" redirectPort="8443" />
注意:如果一台机器上同时运行多个tomcat,一定要将每个tomcat对应的Connector标签的port端口设为不同的值。
-
修改Tomcat/conf 路径下的server.xml的<Engine>的节点配置:
将<Engine>的注释打开,为安装的tomcat命名,即修改jvmRoute的值为“tomcat实例名”(不同的tomcat赋予不同值,此处安装了两个tomcat,分别命名为tomcat1和tomcat2),修改结果如下:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
-
在<Engine>或<Host>元素下添加以下内容均可:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<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.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/><Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
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=""/>
<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>
-
修改待发布项目的web.xml
需要发布的项目放在tomcat的webapps文件夹下,在每个待发布项目的web.xml末尾的</web-app>标签里添加<distributable/>,确保session能够复制。
-
-
15. 集群负载均衡-apache配置
- 修改httpd.conf文件
在apache的conf下,用vi编辑器打开httpd.conf,在该文件末尾加上如下行 (切记/usr/local/apache/conf 和 /etc/httpd/conf 下的httpd.conf里面都要添加):
Include /usr/local/apache/conf/mod_jk.conf
-
配置mod_jk.conf文件
在/usr/local/apache/conf下建立mod_jk.conf文件。配置内容:
#加载mod_jk Module
LoadModule jk_module /usr/local/apache/modules/mod_jk.so#加载集群中的workers
JkWorkersFile /usr/local/apache/conf/workers.properties#加载workers的请求处理分配文件
JkMountFile /usr/local/apache/conf/uriworkermap.properties#指定jk的日志输出文件
JkLogFile /usr/local/apache/logs/mod_jk.log#指定日志级别
JkLogLevel warn#指定日志的格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"#指定哪些请求交给tomcat处理,"controller"为在 workers.propertise里指定的负载分配控制器名
JkMount /*.* controller说明:
JkMount:设置apache分发器,/表示apache将所有文件都由分发器lbcontroller 进行分发,你可以自行设置.jsp,*.do等。-
配置workers.properties文件
在/usr/local/apache/conf下建立workers.properties文件。配置内容:
#server 列表
worker.list=controller,tomcat1,tomcat2========tomcat1========
worker.tomcat1.port=8008 #ajp13 端口号,在tomcat下server.xml配置,默认8009worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多
========tomcat2========
worker.tomcat2.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多
========controller,负载均衡控制器========
worker.controller.type=lb #server名为controller,用于负载均衡worker.retries=3 #重试次数
worker.controller.balance_workers=tomcat1,tomcat2
#粘性Session(默认是打开的) 当该属性值=True(或1)时,代表Session是粘性的,即同一Session在集群中的同一个节点上处理,Session不跨越节点。在集群环境中,一般将该值设置为False
worker.controller.sticky_session=false#设置用于负载均衡的server的session可否共享 有不少文章说设置为1是可以的,也有设置为0才可以的
worker.controller.sticky_session=1
worker.controller.sticky_session_force=1
worker.status.type=status说明:
1、注意上面的worker.tomcat1.port端口是Tomcat server.xml下的
<Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />-
配置uriworkermap.properties文件
在/usr/local/apache/conf下建立uriworkermap.properties文件。配置内容:
#所有请求都由controller这个server处理
/*=controller#所有包含jkstatus请求的都由status这个 server处理
/jkstatus=status
#这里的"!”是“非”的意思。
!/*.gif=controller!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller
16. apache jkstatus JK运行状态管理权限
在已配置完成的 apache 项目中 workers.properties 配置文件中加入 下面两行
worker.list = statusworker.status.type=status
mod_jk.conf 配置文件中加入下面一行
JkMount /jkstatus status
17. 负载均衡集群Session测试
-
17.1 创建测试工程test
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Server Info:
<%
out.print("session Id:"+session.getId());
System.out.println(new Date().toLocaleString() + " ===== session Id>>>>>>>>:"+session.getId());
%><form action="index.jsp" method="post">
key<input type="text" name="key"/>
<br />
value<input type="text"name="value" />
<br />
<input type="submit"value="Submit" />
<br />
</form>
<%
String key =request.getParameter("key");if(key!=null &&key.isEmpty()==false)
{
String value =request.getParameter("value");session.setAttribute(key, value);
Enumeration e =session.getAttributeNames();
while (e.hasMoreElements())
{
String keyStr = (String)e.nextElement();String valueStr = (String)session.getAttribute(sKey);
out.print(keyStr+ " ="+valueStr+"<br>");
}
}
%>
</body>
</html> -
-
17.2 负载均衡集群Session粘贴测试
启动同组tomcat以及apache。浏览器访问apache所在的主机IP地址:http://xxx.xxx.xxx.xxx:8111/, 显示如图一所示页面。从页面显示的session Id可以看出请求访问的是tomcat1。
如图二所示,发现多次刷新或submit后,请求访问的一直是tomcat1,并且session Id一直保持不变,session中的数据也能够保持,说明session粘性良好。
17.3负载均衡集群Session粘贴测试
启动同组tomcat以及apache。浏览器访问apache所在的主机IP地址:http://xxx.xxx.xxx.xxx:8111/,从页面显示的session Id可以看出请求访问的是tomcat1。提交几组session数据,显示结果如图一所示。
此时停掉tomcat1,再次提交session数据,或刷新页面,结果如图二所示,发现请求被转发给tomcat2,页面访问正常。页面颜色改变,但Session Id保持不变,session数据也全部传递给tomcat2,表明session复制良好。
18. linux防火墙
-
需要将tomcat端口添加到linux防火墙中。
-
需要设置linux防火墙的组播,将网卡添加到防火墙信任中。
19.sticky_session和sticky_session_force介绍
sticky_session sticky_session_force 结论
0 0 session无黏性,session会复制
0 1 session无黏性,session会复制
1 0 session有粘性(非强制),session会复制
1 1 session有粘性(强制),session没必要再复制(此处有争议,待深入研究)
-