Environmental information
Operating System: Windows7 Professional
Tomcat version: Tomcat 8.0.33
Apache version: httpd-2.2.25-win32-x86-openssl-0.9.8y
1. Install Apache
1.1 Download Apache for Windows
Apache download address: http://httpd.apache.org/download.cgi
Select "Binaries" on the download page (whichever version of "Binaries" is available)
Then select "win32/"
Download "httpd-2.2.25-win32-x86-openssl-0.9.8y" (Apache has two versions "no_ssl" and "openssl", that is, does not support ssl and supports ssl. The "openssl" version is selected because of learning ssl later will use "openssl")
1.2 Install Apache
Double click on "httpd-2.2.25-win32-x86-openssl-0.9.8y.msi"
Fill in the server information casually
Select Custom to customize the installation path of Apache
The installation is complete
At this point, you can see the Apache icon in the lower right corner of Windows
Right-click this icon and select "Open Apache Monitor" to see the Apache Service Monitor interface
Enter http://localhost in the browser and see "It works", indicating that the Apache installation is successful
1.3 Modify the startup type of Apache
Apache is automatically started by default, you can go to "Services" to modify its startup type
Right-click Computer - Administration - Services and Applications - Services and find Apache2.2. Right-click Apache2.2, select Properties, and modify the startup type.
1.4 Uninstall Apache
打开”控制面板”,选择”卸载程序”,右键”Apache HTTP Server 2.2.25”,选择”卸载”
2. 部署 Tomcat 集群
2.1 创建 Tomcat-Cluster 目录
在 D 盘下新建 Tomcat-Cluster 文件夹,在 Tomcat-Cluster 下新建两个文件夹Tomcat1,Tomcat2
2.2 配置 Tomcat1
2.2.1 将 Tomcat ( Tomcat 8.0.3文件夹) 下的文件拷贝到 Tomcat1
2.2.2 创建测试项目 TestCluster
在 D:\ Tomcat-Cluster\Tomcat1\webapps 下,创建 TestCluster 文件夹,然后将ROOT 文件夹下的 WEB-INF 文件夹拷贝到 TestCluster 下
打开 TestCluster\WEB-INF\web.xml
在 </web-app> 上面添加 <distributable/>
(设置<distributable/>,即表明集群下某一节点生成或改变的 Session ,将广播到该集群的其它节点)
在 TestCluster 文件夹下 新建 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.text.SimpleDateFormat"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>TestCluster</title> </head> <body> Server Info: <% String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm); out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); %> Session Info: <% session.setAttribute("name","dennisit"); System.out.println("[Session Info] Session ID:"+session.getId()); out.println("<br>[Session Info] Session ID:" + session.getId()+"<br>"); %> </body> </html>
2.2.3 修改 Tomcat1 的 Server.xml(Tomcat1\conf\Server.xml)
a. 将 Server 标签下的 8005 端口改为 7005 , Connector 标签下 8080,8009 端口改为 7080,7009 (为了避免端口冲突)
b .在 Engine 标签内添加 jvmRoute属性,将其设置为” Tomcat1”
c .将 Cluster标签的注释打开
修改后的server.xml ( 为了看起来简洁,删掉了 Tomcat 自带的注释 )
<?xml version='1.0' encoding='utf-8'?> <!--将端口号由8005改为7005 --> <Server port="7005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!--将端口号由8080改为7080 --> <Connector port="7080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!--将端口号由8009改为7009 --> <Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <!--在Engine标签添加jvmRoute属性--> <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat1"> <!--将Cluster标签的注释去掉--> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
2.3 配置 Tomcat2
将Tomcat1 下的文件拷贝到 Tomcat2
修改Tomcat2 的 Server.xml
a.将端口7005,7080,7009 改为 9005,9080,9009
b. Engine 标签内 的jvmRoute改为” Tomcat2”
2.4 启动 Tomcat 集群
( 如果之前配置过 Tomcat 的环境变量,要先将 Tomcat 的环境变量删除 )
双击Tomcat1\bin\startup.bat 、 Tomcat2\bin\startup.bat
在浏览器下输入:http://localhost:7080/TestCluster/index.jsp ,即可访问集群下Tomcat1 节点的 TestCluster
在浏览器下输入: http://localhost:9080/TestCluster/index.jsp ,即可访问集群下Tomcat2 节点 的 TestCluster
可以看到 Tomcat1、Tomcat2 两个节点的 Session 一样
3. 整合 Apache 与 Tomcat 集群
整合 Apache 与 Tomcat 集群 可以使用 mod_proxy_balancer也可以使用mod_jk
3.1 使用 mod_proxy_balancer
a. 在 D:\Program Files\Apache 2.2\conf 下新建 mod_proxy_balancer.conf
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 <Proxy balancer://TestCluster> BalancerMember ajp://127.0.0.1:7009 loadfactor=1 BalancerMember ajp://127.0.0.1:9009 loadfactor=1 #BalancerMember http://127.0.0.1:7080 loadfactor=1 #BalancerMember http://127.0.0.1:9080 loadfactor=1 </Proxy> ProxyPass / balancer://TestCluster/
LoadModule-加载模块
Proxy-负责定义代理,该代理下可以包含多个处理请求的节点
BalancerMember-处理请求的节点 ( 设置 ajp、http 均可 )
loadfactor-权重。某一节点的权重越大,分配到该节点的请求越多
ProxyPass -Apache 向 Proxy 转发请求的条件(ProxyPass /*.jsp balancer://TestCluster/ ,表明 Apache 将 http://localhost/ 下的所有jsp 请求转发给 balancer://TestCluster/ 处理 )
b. 修改httpd.conf
打开httpd.conf(Apache 2.2\conf\httpd.conf),在 尾部添加一行代码
include conf/mod_proxy_balancer.conf
同时把下面代码前面注释去掉:
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
d. 测试
重启 Apache ,然后在浏览器下输入 http://localhost/TestCluster/index.jsp ,可看到如下页面
刷新之后,看到如下页面
两次请求,分别转发到了Tomcat1节点、Tomcat2节点,并且两个节点的Session一样
3.2 使用mod_jk
a. 下载 Windows 版 mod_jk.so
Windows 版 mod_jk.so 下载地址: http://tomcat.apache.org/download-connectors.cgi
点击页面的” Binary Releases ”,然后点击” windows /”
下载 ” tomcat-connectors-1.2.39-windows-i386-httpd-2.2.x.zip ”
解压该文件,可得到” mod_jk.so ”。将” mod_jk.so ”拷到 Apache 2.2\modules 目录下
b. 在 Apache 2.2\conf 下新建 workers.properties
worker.list=controller,Tomcat1,Tomcat2 #========Tomcat1======== worker.Tomcat1.port=7009 worker.Tomcat1.host=localhost worker.Tomcat1.type=ajp13 worker.Tomcat1.lbfactor=1 #========Tomcat2======== worker.Tomcat2.port=9009 worker.Tomcat2.host=localhost worker.Tomcat2.type=ajp13 worker.Tomcat2.lbfactor=1 #========controller======== worker.controller.type=lb worker.controller.balanced_workers=Tomcat1,Tomcat2 worker.controller.sticky_session=false
( 如果 worker.controller.sticky_session 设为 true ,则同一用户的同一 session 始终和一个 Tomcat 节点交互 )
c. 在 Apache 2.2\conf 下新建 mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkMount /* controller
JkWorkersFile-workers.properties 的位置
JkMount-Apache将 http://localhost/ 下的所有请求转发给 controller 处理
d. 修改 httpd.conf
打开 httpd.conf(Apache 2.2\conf\httpd.conf), 将尾部的include conf/mod_proxy_balancer.conf 注释掉,并添加一行代码
include conf/mod_jk.conf
e. 测试
重启 Apache ,然后在浏览器下输入 http://localhost/TestCluster/index.jsp ,可看到如下页面
刷新之后,看到如下页面
两次请求,分别转发到了Tomcat1节点、Tomcat2节点,并且两个节点的Session一样
Apache 和 Tomcat 集群 整合后, Apache 是接收请求的入口,它根据设置的转发请求条件,决定将哪些请求转发个 Tomcat 处理
通常的应用场景为: Apache 作为 Web Server ,它只负责处理静态页面,而动态页面会交给 Tomcat(App Server) 处理