linux环境下Apache+Tomcat集群配置
写在前面
apache配置多个tomcat,实现请求分流,多个tomcat服务均衡负载,增加服务的可靠性。最近研究了一下,遇到许多问题,记录一下,方便以后查阅,不喜欢apache,nginx也是可以做到的。
准备
版本很重要,我就是由于版本原因,一直报错
linux
使用 #
lsb_release -a查看当前linux系统版本。
本例:CentOS Linux release 7.0.1406 (Core)
jdk
使用 #
java -version查看当前版本,如果没有,先装好。download link
本例:java version “1.7.0_80”
tomcat
查看解压安装位置。download link
本例:apache-tomcat-7.0.69.tar.gz
apache
在linux系统中,apache服务主程序就是httpd,所以名称也是httpd。使用 #
httpd -version查看当前版本。这里是使用yum安装download link
本例:Apache/2.4.6 (CentOS)
tomcat-connectors
tomcat-connectors是用来连接apache和tomcat的插件包,这个版本很重要,就是在找这个上面花了很长时间,主要是为了使用其编译好的mod_jk.so 文件。在Apache 2.2.x 时可以直接下载 mod_jk-1.2.31-httpd-2.2.x.so
官方:mod_jk-1.2.31-httpd-2.2.x.so is for Apache 2.2.x. It has been build against version 2.2.3, but should work with Apache 2.2.0 and later. Rename to mod_jk.so before putting it in your modules directory or adjust your LoadModule statement.,
但是我使用的是Apache 2.4.6,使用yum安装时,会默认安装最新版本,#
yum list httpd查询时只有这一个。
所以这里要去下载新的中间包,并且需要编译。download link
本例:tomcat-connectors-1.2.42-src.tar.gz
安装
将这些软件包,放置在一个文件夹下,我是放在 /home下。这里主要的安装是Apache安装,我这里使用yum安装:
- #
yum list httpd#查看可安装版本列表 - #
yum install httpd#默认安装 httpd -v#安装结束,查看安装版本
如果出现安装错误,可以查看apache包,例如httpd.x86_64yum list|grep httpd
然后删除相关依赖包。注意:删除后你的一些配置还会保留起来。yum erase httpd.x86_64
使用service httpd start启动Apache 服务,默认端口为80,直接访问IP或域名看到页面,说明启动成功,失败查看service httpd status中的异常信息。
apache-tomcat-7.0.69.tar.gz,解压即可
- #
tar zxvf /home/apache-tomcat-7.0.69.tar.gz#解压至当前文件夹 - #
cp /home/apache-tomcat-7.0.69 /usr/local/#拷贝到/usr/local/文件夹下 - #
mv /usr/local/apache-tomcat-7.0.69 tomcat1#修改文件夹名称为tomcat1
本例是多个tomcat配置一个Apache所以上述操作还要做一遍,创建第二个tomcat,命名为tomcat2.
tomcat-connectors编译并获取mod_jk.so文件,
- #
tar zxvf /home/tomcat-connectors-1.2.42-src.tar.gz - #
cd /home/tomcat-connectors-1.2.40-src/native
这里要注意一下,因为编译时需要Apache bin包下的apxs工具,由于是yum按照,所以不会有bin包,这时就需要下载httpd-devel开发包,
- #
rpm -qa|grep httpd#查看httpd安装包列表 - #
yum -y install httpd-devel#如果不存在就直接安装 - #
which apxs#查询该工具位置,我这里是 /usr/sbin/apxs
接tomcat-connectors编译…
[native]# ./configure --with-apxs=/usr/sbin/apxs#=后面的位置就是上面安装apxs位置,注意需要在/home/tomcat-connectors-1.2.40-src/native目录下操作。[native]# make#执行编译
编译成功后,在 /home/tomcat-connectors-1.2.40-src/native/apache-2.0/mod_jk.so 找到 mod_jk.so文件,将其复制到Apache module包下
- #
cp /home/tomcat-connectors-1.2.40-src/native/apache-2.0/mod_jk.so /etc/httpd/modules/
使用了全路径,自己可以简写.
配置
创建两个文件,利用 mod_jk.so插件包将Apache与tomcatx做关联。
进入Apache配置文件
- #
cd /etc/httpd/conf#进入配置文件夹 - #
vi mod_jk.conf#创建文件,shift+: => q => Enter关闭 - #
vi workers.properties#创建文件,shift+: => q => Enter关闭
打开mod_jk.conf文件,并写入
#加载 mod_jk.so 文件,放置在最上
LoadModule jk_module /etc/httpd/modules/mod_jk.so
#加载 tomcat 参数配置文件
JkWorkersFile conf/workers.properties
#日志保存文件
JkLogFile /etc/httpd/logs/mod_jk2.log
#日志等级
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
#######请求拦截, controller负载均衡控制器名称
JkMount /servlet/* controller
JkMount /*.jsp controller
JkMount /*.do controller
############## end #######################
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
打开workers.properties文件,并写入
#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=11009 #端口号与tomcat一致
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=12009 #端口号与tomcat一致
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========controller=负载均衡控制器名称=======
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #多个tomcat以","隔开
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
#worker.controller.sticky_session=1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
将文件关联创建好后,就需要加入Apache配置文件中,打开httpd.conf,增加包含mod_jk.conf文件。
- #
vi /etc/httpd/conf/httpd.conf#打开文件 。 - #
Include /etc/httpd/conf/mod_jk.conf#添加该行,建立关联。 Listen 80同时可以修改它的访问接口,默认80。
做好关联后现在,要修改tomcatx的server.xml 配置文件。部分修改为:
...
<!--
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
maxThreads="768"
minSpareThreads="64"
enableLookups="false"
redirectPort="8443" />
-->
<!-- 将该请求端口号该为 上面workers.properties文件中的一致,包括两台-->
<Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
...
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
测试
为了看一下这个集群配置是否配置成功,需要创建测试的简单页面,将其放在tomcat能够访问了ROOT中。命名为test.jsp
测试页面内容为:
<%@ page contentType="text/html; charset=utf-8" %>
<%@ 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>"); // 如果有新的 Session
属性设置 String dataName=r equest.getParameter( "dataName"); if (dataName !=n
ull && dataName.length()>
0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName,
dataValue); } out.println("
<b>
Session 列表
</b>
<br>
"); System.out.println("============================"); 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="test2.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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
启动Apache
- #
service httpd start - #
service httpd status#查看是否运行正常
启动tomcatx
- #
cd /usr/local/tomcat{x}/bin#打开bin目录 - #
./startup.sh#启动 - #
tail -f ../logs/catalina.out#查看打印console,ctrl + z关闭退出
浏览器访问:http://123.xx.xxx.xx/test.jsp
页面显示:ID 7B8C934D14F3EF669C437E5B1B8123DB.tomcat1
刷新:ID BBED560EC85BF46ABB639883B9DAF754.tomcat2
…
至此就完成了Apache+tomcat负载均衡配置了,还可以通过Apache 的 ApacheBench来简单测试一下并发。
- #
ab -n 4000 -c 1000 http://123.xx.xxx.xx/#4000请求 + 1000并发数 + 请求的地址,自己的服务器。
相关的一些数据就可以体现出来了,也可以先开一个tomcat试一下,在配置多个tomcat,进行对比测试。
总结
其实并不难,只是不够细心,所有软件都是需要配置并作关联,抓住这一点,理清思路,问题解决的方法就很多。
网上资料被翻了个遍,自己以后也要记录一些作为回馈。
相关参考:
- http://www.iteye.com/topic/1017961
- http://www.centoscn.com/CentosServer/www/2015/0417/5204.html
- http://www.ha97.com/4617.html
个人博客: http://www.abina.me/articles/2017/01/19/1484820029888.html
linux环境下Apache+Tomcat集群配置的更多相关文章
- (转)Apache+Tomcat集群配置
本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...
- Apache + Tomcat集群配置详解 (1)
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...
- Linux+Apache+Tomcat集群配置
参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...
- apache server和tomcat集群配置三:水平集群下的tomcat集群配置
在jsp文件中加入以下代码,用来测试是否共享session: SessionID: <%= session.getId() %> 之前尝试在linux中,但是因为模拟环境是虚拟机,虚拟机只 ...
- Centos下Apache+Tomcat集群--搭建记录
一.目的 利用apache的mod_jk模块,实现tomcat集群服务器的负载均衡以及会话复制,这里用到了<Cluster>. 二.环境 1.基础:3台主机,系统Centos6.5,4G内 ...
- Apache+tomcat集群配置
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...
- linux 环境下 apache tomcat 安装jenkins
参考文档: https://blog.51cto.com/12629984/1980034 https://www.cnblogs.com/lxs1314/p/8567652.html https:/ ...
- 【RAC】使用一条“ps”命令获取Linux环境下全部RAC集群进程信息
如何仅使用一条ps命令便能获取到所有与RAC集群进程相关的信息. 从所使用的命令角度上看很简单,仅需使用ps命令结合grep命令便能实现.问题关键是需要确定检索哪些关键字. 1.与RAC集群有关的进 ...
- window xp Apache与Tomcat集群配置--转载
转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...
随机推荐
- Javascript中的prototype和__proto__的联系区别
转载至http://www.cnblogs.com/sinstone/p/5136871.html 一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...
- Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等
实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ...
- SPOJ375 QTREE - Query on a tree
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Http协议与生命周期
一.Http知识: 1.基于socket 浏览器(格式一) web服务器(格式一) MYSQL客户端(格式二) MYSQL服务端(格式三) ...
- review12
使用StringTokenizer对象分解字符串,和split()不同的是,StringTokenizer对象不使用正则表达式作为分隔标记. 当Fenix一个字符串并将字符串分解成可被独立使用的单词时 ...
- python基础3 - 变量的基本使用和命名
4.变量的基本使用 4.1 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值 = 左边是变量名 = 右边是存储在变量中的值 变 ...
- ActiveMQ 的客户端选项
本章重点 怎么使用独占式消费者 消息分组的威力 理解流和二进制大对象 容错传输 计划消息分发 简介 上一章我们介绍了 ActiveMQ 的代理特性,本章我们将学习 ActiveMQ 客户端的一些高级特 ...
- ItemsControl 与 ICollectionView
ItemsControl base class can automatically interact with ICollectionView classes
- 在Android中使用实时调度(real-time)
Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改.但问题是程序是以普通用户启动和运行的 ...
- C++Builder XE5对于C++11的支持真蛋疼
好不容易下载个XE5,安装,破解,准备测试一下C++11中的lambda,写了一个最简单的表达式: [](){}; 居然编译通不过. 查了帮助文档,才晓得它的编译器分为BCC32和BCC64, BCC ...