linux 环境下 Apache+Tomcat 集群配置

本贴最后更新于 2866 天前,其中的信息可能已经沧海桑田

[42218349576068127.jpg]

写在前面

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_64
  • yum 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 #######################

打开 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

将文件关联创建好后,就需要加入 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 配置文件。部分修改为:

...
<!--<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"/>

测试

为了看一下这个集群配置是否配置成功,需要创建测试的简单页面,将其放在 tomcat 能够访问了 ROOT 中。命名为 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>"); // 如果有新的 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>

启动 Apache

  • service httpd start
  • service httpd status #查看是否运行正常

启动 tomcatx

  • cd /usr/local/tomcat{x}/bin #打开 bin 目录
  • ./startup.sh #启动
  • tail -f ../log/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,进行对比测试。

总结

其实并不难,只是不够细心,所有软件都是需要配置并作关联,抓住这一点,理清思路,问题解决的方法就很多。
网上资料被翻了个遍,自己以后也要记录一些作为回馈。
相关参考:

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    944 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    关注技术的同学也欢迎到我的小站看看噢。
    http://log4geek.cc
    码农欢迎加入 珠三角码农交流群 479189837