写点什么

Apache 负载均衡与 Tomcat 集群配置学习 (Windows 环境)

  • 2022 年 4 月 30 日
  • 本文字数:3131 字

    阅读完需:约 10 分钟

注:1、安装 Tomcat 的时候,如果你的 C 盘有如此目录:C:\Program Files\Java\jre*,则 Tomcat 会优先选择此目录作为安装条件,故要留意此种情况;


2、虚拟机中的 JDK 和 Tomcat? 的安装方式类似,本人虚拟机由于安装的时候只有一个盘符 C,故全部都安装在 C 盘中了;


3、采用上述安装方式,不再需要单独配置 Tomcat 的环境变量了。


4、安装 Apache,目标盘符:D:\Program Files\Apache Software Foundation\Apache2.2,默认端口 80。


注:1、有些大牛的文章说,在安装的时候如果 IIS 处于运行状态,则安装可能不会成功,强调关闭 IIS 服务,本人安装过程中,IIS 一直处于运行状态,但是安装成功了,估计可能跟版本有关吧;


2、打开 http:10.10.141.40 进行测试,如果能看到一个"It works!",证明安装成功。


三、Apache+JK+Tomcat 集群配置


1、Apache----2.2.22 版本已经集成了 mod_jk 功能,故不必配置繁琐的 worker.properties 文件什么的,配置过程很方便了。


2、利用编辑器打开 D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.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


3、去掉这些代理块的注释“#”符号,Apache 在启动的过程中将加载上述代理(proxy)。


4、找到 #Include conf/extra/httpd-vhosts.conf 位置,并去掉“#”符号,结束后关闭 httpd.conf 文件。


5、利用编辑器打开 D:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\httpd-vhosts.conf 文件,配置虚拟站点,在文件结束添加


<VirtualHost *:80>?


ServerAdmin 管理员邮箱?


ServerName 域名(没有可用 IP 地址代替)


ServerAlias localhost?


ProxyPass / balancer://cluster/ stickysession=JSESSIONID(大写很重要)?nofailover=On


ProxyPassReverse / balancer://cluster/?


ErrorLog "logs/lbtest-error.log"?


CustomLog "logs/lbtest-access.log" common?


</VirtualHost>


本人的配置实例:


<VirtualHost *:80>?


ServerAdmin?limingzhong1985@gmail.com


ServerName 10.10.141.40?????????????????? ServerAlias localhost?


ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On


ProxyPassReverse / balancer://cluster/?


ErrorLog "log/error.log"?


CustomLog "log/access.log" common?


</VirtualHost>


注:1、balancer://是告诉 Apache 需要进行负载均衡的代理;


2、后面的 cluster 是集群名,可以随意取;


3、两个日志引擎 ErrorLog 负责记 录错误,CustomLog 负责记录所有的 http 访问以及返回状态,日志名可以自己取。


6、再次打开 D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf,文件结束处添加如下代码:


ProxyRequests Off?


<proxy balancer://cluster>?


BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1


BalancerMem 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ber ajp://10.10.141.40:8009 loadfactor=1 route=jvm2?


</proxy>


注:1、ProxyRequests Off 是告诉 Apache 需要使用反向代理;


2、<proxy balancer://cluster>用于配置工作在集群中的节点列表,这里的“cluster”必须与上面的集群名保持一致;


3、Apache 通过 ajp 协议与 tomcat 进行通信,ip 地址和端口唯一确定了 tomcat 节点和配置的 ajp 接受端口;


4、loadfactor 是负载因 子,Apache 会按负载因子的比例向后端 tomcat 节点转发请求,负载因子越大,对应的 tomcat 服务器就会处理越多的请求,如两个 tomcat 都 是 1,Apache 就按 1:1 的比例转发,如果是 2 和 1 就按 2:1 的比例转发;


5、route 参数对应后续 tomcat 配置中的引擎路径 (jvmRoute)。


7、重新启动 Apache 服务,在浏览器中访问:http:10.10.141.40,你会发现得到了一个 503 的错误,内容如下:


Service Temporarily Unavailable


The server is temporarily unable to service your request due to maintenance downtime orcapacityproblems. Please try again later


打开刚刚配置的错误文件,我们会发现如下信息:


.......


[Mon Jun 18 17:59:16 2012] [error] (OS 10061)由于目标机器积极拒绝,无法连接。? : proxy: AJP: attempt to connect to 10.10.141.40:8009 (10.10.141.40) failed


[Mon Jun 18 17:59:16 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.40)


[Mon Jun 18 17:59:16 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.40


[Mon Jun 18 17:59:23 2012] [error] (OS 10060)由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。?


: proxy: AJP: attempt to connect??to?10.10.141.39:8009 (10.10.141.39) failed


[Mon Jun 18 17:59:23 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.39)


[Mon Jun 18 17:59:23 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.39


从上面的信息我们可以知道:连接?10.10.141.40?和?10.10.141.39?两台服务器失败,原因是还没有启动 Tomcat 造成的。


8、配置 Tomcat----server.xml 文件


8.1、如果是 2 个 Tomcat 处于不同的机器上,就不需要修改任何端口;只是需要把<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">注释符放开,同时将<Engine name="Catalina" defaultHost="localhost">注释掉;


8.2、对于 10.10.141.40 的机器,将<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">,怎么知道要改成这样呢,看下面的配置:


ProxyRequests Off?


<proxy balancer://cluster>?


BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1


BalancerMember ajp://10.10.141.40:8009 loadfactor=1 route=jvm2?


</proxy>


在我的配置中,10.10.141.40 对应的是:route=jvm2?;


注:jvmRoute 对应 Apache httpd.conf 中 BalancerMember 中配置的 route 参数。????????8.3、对于 Tomcat 安装在同一台机器上的情况,则需要做端口修改工作,同时上面的配置可以修改为如下情形:


ProxyRequests Off?


<proxy balancer://cluster>?


BalancerMember ajp://localhost:8009loadfactor=1 route=jvm1


BalancerMember ajp://localhost:9009loadfactor=1 route=jvm2?


</proxy>


接下来修改<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,将 jvm2 对应的 Tomcat 配置修改为<Connector port="9009" protocol="AJP/1.3"?redirectPort="8443" />。


注:端口对应 Apache httpd.conf 中 BalancerMember 中配置的 ajp 连接端口。


8.4、将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>的注释放开,目的是可以在集群中的所有 tomcat 节点间共享会话(Session)。


8.5、配置 Connector 的端口,把 jvm2 设置为在 9080 端口侦听,保证 2 个 Tomcat 的监听端口的不同。


8.6、server.xml 文件配置完毕后,我们放入一个简单的 java 项目应用测试,两个目的:


a:测试 session 信息是否丢失,即同一个请求在不同刷新过程中是否改变,如果改变则配置失败,反之配置成功;


b:测试 session 是否在集群中的各个节点中成功复制,复制成功则才能实现集群的目的:负载均衡;?????????????????在此引用一个网络上的测试 session 的例子:


在每个 Tomcat 的 webapps 目录下新建 test 目录,在 test 目录下新建 test.jsp 文件,代码如下:

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Apache负载均衡与Tomcat集群配置学习(Windows环境)_Java_爱好编程进阶_InfoQ写作社区