<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
1) 下载 apache httpd 和 apache tomcat ,并安装
2) 配置 apache
修改conf/httpd.conf 文件
去掉以下文本前的注释符# ,以便让 Apache 在启动时自动加载
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_http_module modules/mod_proxy_http.so
找到 Include conf/extra/httpd-vhosts.conf 并去掉前面的 #
打开conf/extra/httpd-vhosts.conf ,并添加以下内容
ProxyRequests Off
<proxy balancer://capaacluster>
BalancerMember http://127.0.0.1:8080 loadfactor=1 route=jvm1
BalancerMember http://127.0.0.1:9080 loadfactor=1 route=jvm2
ProxySet stickysession=JSESSIONID
ProxySet lbmethod=bybusyness/byrequests/ bytraffic
</proxy>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.capaa.com
ServerName 172.16.5.22
ServerAlias www.dummy-host.capaa.com
ProxyPass / balancer://capaacluster/
ProxyPassReverse / balancer://capaacluster/
ErrorLog "logs/172.16.5.22-error.log"
# CustomLog "logs/172.16.5.22-access.log" common
CustomLog "logs/172.16.5.22-access.log" "%{JSESSIONID}C %{BALANCER_SESSION_STICKY}e %{BALANCER_SESSION_ROUTE}e %{BALANCER_WORKER_ROUTE}e %{BALANCER_ROUTE_CHANGED}e %{Set-Cookie}o"
</VirtualHost>
保存,apache 配置完毕。并重启 apache
3) 配置 tomcat
解压tomcat ,并复制一份,分别称为 t1, 2
分别修改tomcat1 和 tomcat2 的 server.xml ,使其监听的端口不冲突
找到<Server port="8005" shutdown="SHUTDOWN"> , t1 不变,把 t2 改为 9005
配置Connector 的端口,找到 non-SSL HTTP/1.1 Connector ,即 tomcat 单独工作时的默认 Connector ,保留 t1 默认配置,在 8080 端口侦听,
而把t2 设置为在 9080 端口侦听
AJP 1.3 Connector, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ,
这是tomcat 接收从 Apache 过来的 ajp 连接请求时使用的端口,保留 t1 默认设置,把 t2 端口改为 9009
找到<Engine name="Catalina" defaultHost="localhost"> ,去掉这段或改为注释,把上方紧挨的 <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> 注释符去掉,对于 t2 ,去掉注释符并把 jvm1 改为 jvm2 。这里的 jvmRoute 对应 Apache httpd.conf 中 BalancerMember 中配置的 route 参数
找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> ,打开注释,这里的配置是为了可以在集群中的所有 tomcat 节点间共享会话( Session )
4) 测试 app
分别在t1 和 t2 的 webapp 目录下新增一个 test app ,并新增一个 test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + 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="test.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>
修改此test app 的 web.xml 文件,在 <web-app> 节点下加入 <distributable />
访问http://172.16.5.22/test/test.jsp 页面会显示相应的信息,是哪个 tomcat 处理了请求,当前 session 中的数据等
关键字: java apache load balance
这是 apache 部分的配置
<Proxy balancer://proxy>
BalancerMember ajp://127.0.0.1:8009/ loadfactor=1 route=tomcat1
BalancerMember ajp://127.0.0.1:8010/ loadfactor=1 route=tomcat2
</Proxy>
<VirtualHost *:80>
ServerName www.a.com
ServerAlias www.a.com
ProxyPass / balancer://proxy/ stickysession=JSESSIONID nofailover=On lbmethod=bytraffic
ProxyPassReverse / balancer://proxy/
</VirtualHost>
Server.xml分别是
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
我在两个的ROOT 文件夹下都放一个 test.jsp 分别输出不同的标识 .
但刷新的时候, 就会发现 apache 把请求分别发给 tomcat1 tomcat2. stickysession 失败了 . . 这是为什么呢 ??? 哪位帮忙看看 ...
===========================================
以下为正确配置
<VirtualHost *:80>
ServerName www.a.com
ServerAlias www.a.com
ProxyPass / balancer://proxy/ stickysession=JSESSIONID
ProxyPassReverse / balancer://proxy/
<Proxy balancer://proxy>
BalancerMember http://192.168.1.192:8080/ loadfactor=1 route=tomcat1
BalancerMember http://192.168.1.192:8081/ loadfactor=2 route=tomcat2
</Proxy>
</VirtualHost>