一、软件准备
Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本
Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件
注意:由于Apache和Tomcat项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache和Tomcat版本均适用。
二、软件安装
把Apache安装为运行在80端口的Windows服务,安装成功后在系统服务列表中可以看到Apache2.2服务。对于已安装IIS的机器,在启动Apache服务之前必须首先停止IIS Admin服务,不然会因为端口冲突而无法启动。服务启动后在浏览器中输入http://localhost进行测试,如果能看到一个"It works!"的页面就代表Apache已经正常工作了。
解压tomcat zip文件到两个文件夹,分别为t1和t2,以下均以t1和t2代表两个tomcat服务器。配置JAVA_HOME和CLASSPATH系统环境变量,分别启动t1和t2,确保tomcat可用,然后关闭tomcat。
本文仅为讲解配置过程,Apache和tomcat均工作在同一台机器上。实际部署时没有任何限制,Apache和单个tomcat可以分别部署在不同的服务器上。
三、Apache配置
Apache 2.2集成了mod_jk功能,相对于1.3版本,不需要再进行繁琐的worker.properties配置,配置过程大幅简化。
首先,在Apache安装目录下找到conf/httpd.conf文件,以文本编辑器打开。
去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(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
向下拉动文档找到<IfModule dir_module>节点,在DirectoryIndex index.html后加上index.jsp,这一步只是为了待会配置完tomcat后能看到小猫首页,可以不做。
在最下面加上
#虚拟机配置,负载均衡配置
<VirtualHost *:80>
ServerAdmin 418684644@qq.com
ServerName localhost
ServerAlias localhost
#小心,有些地方要有空格,要不然会出错哈哈。
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
#ErrorLog "logs/cluster-error.log"
#CustomLog "logs/cluster-access.log" common
</VirtualHost>
#The ProxyRequests directive should usually be set off when using ProxyPass.
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 smax=5 max=20 ttl=120 retry=300 timeout=15
BalancerMember ajp://10.10.6.117:8009 loadfactor=1 route=jvm1 smax=5 max=20 ttl=120 retry=300 timeout=15
# status=+H为配置热备,当所有机器都over时,才会请求该机器
#BalancerMember http://192.168.1.1:8009 status=+H
ProxySet lbmethod=bytraffic
</proxy>
这里balancer://是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名,可以随意取,两个日志引擎ErrorLog负责记录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取
ProxyRequests Off 是告诉Apache需要使用反向代理(利用Apache进行负载均衡必须使用反向代理,关于更多负载均衡和反向代理详情可以参阅另一篇博客http://zyycaesar.iteye.com/admin/blogs/293839),<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)。
重启Apache服务,如果此时访问http://localhost/将会返回503错误,打开刚才配置的错误日志logs/lbtest-error.log,可以看到错误原因是因为后台服务器没有响应,因为此时tomcat尚未配置和启动。
四、Tomcat配置
如果仅仅为了配置一个可用的集群,Tomcat的配置将会非常简单。分别打开t1和t2的server.xml配置文件,对于t1,尽量采用默认的设置,而对t2作较大改动以避免与t1冲突。如果t2和t1不在同一台服务器上运行,对于端口就不需做改动。
首先是配置关闭端口,找到<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。注意,这里的端口对应Apache
httpd.conf中BalancerMember中配置的ajp连接端口。
继续向下配置引擎,找到<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)。如果仅仅为了获得一个可用的tomcat集群,Cluster只需要这么配置就可以了,对于更多的Cluster配置笔者将另文解释。
server.xml的配置修改完毕,下一步需要对具体的应用进行配置。在webapps目录下新建test目录,在test目录下新建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目录下继续新建WEB-INF目录和web.xml,在<web-app>节点下加入<distributable
/>,这一步非常重要,是为了通知tomcat服务器,当前应用需要在集群中的所有节点间实现Session共享。如果tomcat中的所有应用都需要Session共享,也可以把conf/context.xml中的<Context>改为<Context
distributable="true">,这样就不需对所有应用的web.xml再进行单独配置。
注意这里的sessionid,与平常的sessionid相比多了小数点和后面的部分,这里的jvm1即处理当前请求tomcat服务器的jvmRoute,通过这里可以知道是集群中的哪一个服务器处理了当前请求。在文本框中输入名称和值,点击按钮,信息就保存到了Session中,并且显示到页面上。不断点击按钮,可以发现输入的信息并未丢失,而且sessionid小数点之前的部分保持不变,而小数点后面的字符不停的变化,表明是由不同的tomcat服务器处理了这些请求。这样就实现了负载均衡,并且集群中的不同节点间可以实现会话的共享。此时如果停止一个tomcat服务器t2,Apache将会自动把后续请求转发到集群中的其他服务器即t1。重启t2后,Apache会自动侦测到t2的状态为可用,然后会继续在t1和t2间进行负载均衡。
分享到:
相关推荐
在Java开发领域,Tomcat是一个广泛应用的开源Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范...在实际项目中,还需要根据具体需求和场景进行调整,例如添加缓存策略、负载均衡、集群部署等高级特性。
Solr集群安装是一个复杂的过程,涉及到多个步骤,包括Zookeeper集群的配置和Solr整合Tomcat的部署。这里我们将详细讲解这些步骤。 首先,我们来理解Zookeeper在Solr集群中的角色。Zookeeper是一个分布式协调服务,...
- **Taotao-rest、Taotao-search、Taotao-sso、Taotao-order**:分别提供REST API、搜索服务、单点登录和订单处理等功能。 - **Nginx**:作为反向代理服务器,负责负载均衡以及域名解析等工作。 整个系统涉及8台...
在实际生产环境中,你可能还需要考虑更多高级配置,如集群部署、负载均衡、日志管理、性能优化等。确保定期更新Tomcat和Solr到最新安全版本,并遵循最佳实践,以确保系统的稳定性和安全性。 总之,将Solr 7.7.3集成...
这个"activiti6_war+汉化.rar"压缩包包含了Activiti 6.0的三个WAR包,这些WAR包通常是Web应用程序的归档文件,它们可以直接部署在Servlet容器如Tomcat中运行。汉化的版本使得中文用户能够更方便地理解和使用Activiti...
3. **Kylin OLAP引擎基础框架**:包括元数据引擎、查询引擎、Job引擎及存储引擎等,还包括用于响应客户端请求的REST服务器。 4. **扩展**:支持额外功能和特性的插件。 5. **整合**:与调度系统、ETL、监控等生命...
- **Tomcat集群**:通过配置多个Tomcat实例,实现负载均衡。集群中的session共享问题可以通过以下方式解决: - **Session复制**:每个节点都保存所有用户session,但当节点数量增加时,网络通信成本增加,可能...
跨域调用taotao-rest服务.avi │ 打开必读.txt │ 淘淘商城第五天笔记.docx │ ├─06.第六天 │ 01.内容复习.avi │ 02.课程计划.avi │ 03.cms系统分析.avi │ 04.内容分类列表展示.avi │ 05.添加节点、及课后...
部署时,可能使用Docker容器化技术,配合Kubernetes或Docker Compose进行集群管理,实现高可用和弹性伸缩。 综上所述,该毕业设计项目涉及了现代Web服务开发中的多个关键技术和最佳实践,包括微服务架构、RESTful ...
服务之间的通信可以是同步或异步的,通过RPC、REST或者消息队列(如RabbitMQ、Kafka)实现。 随着服务的拆分,持续集成和持续部署(CI/CD)变得至关重要。工具如Docker用于容器化应用,Jenkins负责自动化构建和部署,...
它是集群的分布式Init.d,能够运行任何Linux二进制发布版本,包括Tomcat、Play等,实现集群的多进程管理和服务发现,通过REST API提供部署、SSL和基础认证、配置约束,并支持通过HAProxy和DNS实现服务发现和负载平衡...
- 对于高并发场景,可能需要负载均衡和集群部署。 9. **监控和调试** - 利用Eclipse的内置工具或者第三方插件,如Tomcat Monitor,监控服务性能和状态。 - 使用日志框架如Log4j记录服务运行情况,便于问题定位。...
部署完成后,开发者可以通过Web界面访问和使用它们,配置相应的服务地址和端口以连接到Dubbox集群。 5. **版本兼容性**:Dubbox 2.8.4与早期版本相比,可能修复了一些已知问题,增加了新的功能,同时也保持了与...
**Zookeeper**是Apache的一个分布式协调服务,它为分布式应用提供了诸如配置管理、命名服务、集群同步、组服务等基础功能。在微服务架构中,Zookeeper通常被用作服务注册与发现中心。服务提供者会在Zookeeper上注册...
- 部署服务:将服务部署到支持Java EE的Web服务器,如Tomcat或Glassfish。 - 创建客户端:利用WSDL生成客户端代码,或者使用JAX-WS的`@WebServiceClient`注解创建客户端代理。 - 测试交互:通过HTTP请求调用服务...
**Diamond Server** 是一个基于Web的服务平台,它通过REST API为客户端提供服务。为了提高开发效率和使用便捷性,Diamond 还提供了一个客户端库(diamond-client)供业务代码直接调用。 ##### 架构设计 Diamond ...
- **Apache Zookeeper**:Solr 使用 Zookeeper 进行集群管理,支持分布式环境下的高可用性和负载均衡。 - **企业级功能**:与 Lucene 不同的是,Solr 提供了更多的企业级功能,如高级全文搜索、模式和无模式配置支持...
例如,在Java开发环境中,一个完整的应用程序通常被打包成一个WAR文件并部署到应用服务器(如Tomcat)上运行。 - **单体架构的困境**:随着业务的增长和技术的发展,单体架构面临着一系列问题,包括但不限于: - ...
JMX/REST管理,展示了如何通过JMX和REST服务管理exo plateform。 7. 集群,解释了使exo plateform能够在集群模式下工作的相关更改。 8. LDAP集成,说明了如何将exo plateform与LDAP(包括OpenLDAP、MS Active ...