一、环境:
linux 虚拟机:centos6.5 jdk1.7.0 apache2.2.15 tomcat6
服务器1:apache +tomcat6
服务器2:tomcat6
二、安装
1)安装apache:
rpm -qa httpd 查询系统是否已经安装
未安装:
yum install httpd -y 安装
chkconfig httpd on
service httpd start 启动apache 如果没有错误 在浏览器中:http://127.0.0.1 则显示apache 自带的页面
2)安装jdk tomcat
三、配置apache tomcat
1、apache 配置
由于apache 2.2.x 集成了mod_jk功能,不能进行worker.properties配置,会出现apache服务无法启动,加载配置文件出错
在 /etc/httpd/conf 目录下找到 http.conf文件,确保自动加载代理(proxy)模块没有被注释掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
在DirectoryIndex index.html后加上index.jsp,用空格隔开
在文档最下方配置虚拟站点
<VirtualHost *:80>
ServerAdmin xxx@126.com
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
ErrorLog "logs/thc-error.log"
CustomLog "logs/thc-access.log" common
</VirtualHost>
说明:这里balancer://是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名(可以随意取),两个日志引擎ErrorLog负 责记录错 误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取。
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
# 如果第二个Tomcat放在另外一台独立服务器上那么就输入对应的ip
BalancerMember ajp://192.168.1.102:8009 loadfactor=1 route=jvm2
</proxy>
说明:ProxyRequests Off 是告诉Apache需要使用反向代理,<proxy balancer://cluster> 用于配置工作在tomcat集群中的所有节点,这里的"cluster"必须与上面的集群名保持一致。Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发。route参数对应后续tomcat配置中的引擎路径(jvmRoute; 以上端口号对应:tomcat下server.xml中<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
2、tomcat 集群配置重启Apache服务,如果此时访问http://localhost/将会返回503错误,打开刚才配置的错误日志logs/thc-error.log,可以看到错误原因是因为后台服务器没有响应,因为此时tomcat尚未配置和启动。
3、测试用例:简单配置:
在两台的tomcat 修改对应的conf/server.xml
如果两台tomcat 在同一个服务器上,则需要修改三个端口号
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Server port="8005" shutdown="SHUTDOWN">
如果不在同一个服务器上,则可以不修改;
修改集群配置;
找到<Engine name="Catalina" defaultHost="localhost">,修改为:
第一台:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
第二台:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
jvmRoute 对应的名称必须与apache httpd.conf配置的名称相同;
找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,打开注释。
打开web.xml,在<web-app>节点下加入<distributable />,这一步非常重要,是为了通知tomcat服务器,当前应用需要在集群中的所有节点间实现Session共享。如果tomcat中的所有应用都需要Session共享,也可以把conf/context.xml中的<Context>改为<Context distributable="true">,这样就不需对所有应用的web.xml再进行单独配置。
在ROOT工程下新建一个页面:index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>Cluster App Test</title>
</head>
<body>
Server Info:
<%
out.println(request.getLocalName() + " : " + request.getLocalPort()
+ "<br>");
%>
<%
out.println("<br> ID " + session.getId() + "<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session 列表</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value = session.getAttribute(name).toString();
out.println(name + " = " + value + "<br>");
System.out.println(name + " = " + value);
}
%>
<form action="index.jsp" method="POST">
名称:
<input type=text size=20 name="dataName">
<br>
值:
<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
启动apache tomcat1 tomcat2 ;查看页现,可实现负载均衡;
如果要实现session 共享还需要进一步对server.xml进行配置;
4、