解说Apache+Tomcat+JK实现Tomcat的负载和集群
好长时间没更新博客了,今天终于把Apache与Tomcat的结合研究出来了,不多说了还是把过程写出来吧。
- 实现环境
虚拟机上实现的: 操作系统:Cetnost 5.4 内核:2.6.18-194.el5
server1: ip 192.168.1.107 255.255.255.0
server2:ip 192.168.1.139 255.255.255.0
2. 所用的到软件
httpd-2.2.22.tar.gz
apache-tomcat-6.0.35.tar.gz
tomcat-connectors-1.2.37-src.tar.gz(apache与Tocmat的连接器)
jdk-6u33-linux-i586-rpm.bin
3. 安装前的准备
安装需要的编译程序
# yum -y install gcc gcc-c++ gcc-gfortran ncurses-devel
4. 下面开始准备安装
安装JDK
因为Cetnos系统会自带一个java版本,要把自带的java版本卸掉。
- 查看版本:
- # java -version
- java version "1.6.0_18"
- Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0_18-b02)
- Java HotSpot(TM) Client VM (build 1.6.0_18-b02, mixed mode, sharing)
- 查看JDK软件包名称:
- # rpm -qa | grep jdk
- java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
- 卸载:
- # yum -y remove java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
- # rpm -qa | grep gcj
- libgcj-4.1.2-48.el5
- java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
- # yum -y remove libgcj-4.1.2-48.el5 java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
- 卸载完成
完成之后,再来查看java的版本
# java -version
-bash: java: command not found
说明卸载完成。
下面开始安装JDK
我把有的软件都放在了/setup/这个目录下了,下面来安装吧
- # cd /setup/jdk/
- # chmod +x jdk-6u33-linux-i586-rpm.bin
要执行这个文件要用到root用户
- #./jdk-6u33-linux-i586-rpm.bin
根据所显示的提示信息很顺利就能安装完成。
默认安装在 /usr/java 目录下,我们做一个软连接
- # ln -s /usr/java/jdk1.6.0_33/ /usr/local/java
设置环境变量
- # vi /etc/profile
- 安"i"进入编辑模式
- 在最后加入:
- export JAVA_HOME=/usr/java/jdk1.6.0_33
- export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export PATH=$PATH:$JAVA_HOME/bin
- 保存退出 !
- 使生效: # source /etc/profile
完成后再来查看版本信息
- # java -version
- java version "1.6.0_33"
- Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
- Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
Apache的安装
- # cd /setup/apache
- # tar zxvf httpd-2.2.22.tar.gz
- # cd httpd-2.2.22
- # ./configure --prefix=/usr/local/apache
- # make
- # make install
- 这里的apche只指定了安装目录其他的都是默认。
下面来启动一下
- # /usr/local/apache/bin/apachectl start
接着就要查看80端口是否启动。
Apache与Tomcat的连接器的安装
开始安装apache与Tomcat的连接器 tomcat-connectors-1.2.37-src.tar.gz
- # cd /setup/tomcat
- # tar zxvf tomcat-connectors-1.2.37-src.tar.gz
- # cd tomcat-connectors-1.2.37-src/native/
- # ./configure --with-apxs=/home/fisuser/FIS/apache/bin/apxs
- # make
- # make install
安装完成之后就会在 /usr/local/apache/modules/目录中有一个mod_jk.so
# ls
httpd.exp mod_jk.so
这样Apache与Tomcat的连接器安装成功了。
下面来安装一下Tocmat
这个软件不用编译的,解压后就可以用了。
- # cd /setup/tomcat
- # tar zxvf apache-tomcat-6.0.35.tar.gz
- # mv apache-tomcat-6.0.35 app1
- # echo "JAVA_HOME=/usr/java/jdk1.6.0_33" >> /app1/bin/catalina.sh
接下来,就可以试着启动一下。
- # /setup/tomcat/app1/bin/catalina.sh start
查看端口是否启动起来
- # netstat -tlnp
- tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 26633/java
- tcp 0 0 :::8009 :::* LISTEN 26633/java
- tcp 0 0 :::8080 :::* LISTEN 26633/java
有这三个端口,说明Topmcat启动正常,你可以用浏览器来打开,一定能看到那个“猫”。
在第二台虚拟中只要有个Tomcat就行了,所有要在第二台虚拟中安装上JDK,Tomcat就可以了。
到此,Tomcat JDK Apache JK 安装完成,下面开始核心部分连接Apache与Tomcat,并实现Tomcat的负载和集群。
5. 配置Apache与Tomcat
配置Apache
编辑Apache的httpd.conf文件
所要做工作就是开启虚拟主机,并加上mod_jk.conf这个模块,如下所示:
- # cp httpd.conf httpd.conf.bak (改变之前要备份一下)
- # vim httpd.conf
- 在httpd.conf文件中找到:“Include conf/extra/httpd-vhosts.conf”把前的#号去掉即可。
- 接着在后面加入一行:
- Include conf/mod_jk.conf
完成之后,首来做虚拟主机吧。
- # cd /usr/local/apache/conf/extra
- # vim httpd-vhosts
- 把原有的虚拟主机注释掉,加入如下所示的行:
- <VirtualHost *:80>
- ServerName www.zhou.com
- JkMountFile conf/uriworkermap_app1.properties
- </VirtualHost>
在这里我们看到有两个我们不明白的一个就是mod_jk.conf, 一个就是:
uriworkermap_app1.properties
这两个文件中做什么的,接着看下面:
先来创建mod_jk.conf这个文件,这个文件当然是在/usr/local/apache/conf/这个目录下创建了,在httpd.conf中你指定的目录,我指定的是这个目录,所以我在这个目录下创建。内容如下:
- # vim mod_jk.conf
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile conf/workers.properties
- JkLogFile "logs/mod_jk.log"
- JkLogLevel info
- JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
- JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
- JkRequestLogFormat "%w %V %T"
- JkShmFile logs/jk.shm
- HostnameLookups Off
在这里说明一下文件的内容:
第一句是加载mod_jk.so这个模块的。
第二名是JKWorkersFile 指定负载均衡服务器的配置文件,文件名为相对于apache服务器所在目录的
第三句是JKLogFile 指定JK连接器的日志输出文件,文件为相对于apache服务器所在目录的logs/mod_jk.log文件
第四句:JKLogLevel 是指的日志级别。级别为warn以上的日志将被输出到日志文件中,可选的值级别由低到高分别为:TRACE DEBUG INFO WARN ERROR FATAL
下面的几句我也不知道是什么意思,这个是在网上找的某大神的作品,
好了,下面再来说一下,workers.properties这个文件
同样在/usr/local/apache/conf/目录下创建,内容如下:
- worker.list=tomcat,jkstatus
- #107
- worker.server107.port=8009
- worker.server107.host=192.168.1.107
- worker.server107.type=ajp13
- worker.server107.lbfactor=10
- worker.server107.cachesize=5
- #139
- worker.server139.port=8009
- worker.server139.host=192.168.1.139
- worker.server139.type=ajp13
- worker.server139.lbfactor=10
- worker.server139.cachesize=5
- worker.tomcat.type=lb
- worker.tomcat.balance_workers=server107, server139
- worker.tomcat.sticky_session_force=false
- worker.jkstatus.type=status
- #worker.jkstatus.mount=/admin/jk
- worker.retries=3
解释一下:
worker.list 是定义了两个工作列表:一个是tomcat,一个是jkstatus 。在tomcat列表中定义了两个tomcat_server,一个是:server107,一个是:server139。
worker.server107.port=8009 是定义了端口号,一定是tomcat中server.xml中的8009 。这里我是在两台不同机器上的虚拟机做的,所以端口号没有改变。如果是在一台虚拟上做的两个Tomcat,那么只需要第二个Tomcat的端口号设置的与第一个Tomcat的端口号不同就行了,具体随意,只要能用就行。
worker.server107.host 这个是定义主机。
worker.server107.type=ajp13 JK模块实现负载均衡采用的是AJP协议1.3版本,因此第一台负载均衡服务器的类型配置为ajp13
worker.server107.lbfactor 第一台负载均衡服务器在整个负载均衡系统中所占的权重,这里配置为10,权重越大,越有可能处理更多的请求,建议给性能好的机器配置更高的权重。
worker.s1.cachesize:apache服务器是多线程的,tomcat能够利用这一优势来维持一定数量的连接作为缓存。根据用户的多少来配置一个合适缓存连接数量有助于提高性能。这里配置为5
下面的都相同了,如果有多个Tomcat同样一样的配置,所用的参数自己来调即可。
worker.tomcat.type=lb 这个是配置tomcat的类型为“lb”也就是Load Balance负载均衡。
worker.tomcat.balance_workers=server107,server139 这个是负载均衡的两个tomat的server名称。
worker.tomcat.sticky_session_force=flase
设置负载均衡是否采用粘性会话。如果该属性设置为true,假设一个请求被server107处理了,下次来源于同一个客户端的请求也将被server107处理。直到server107已经达到最大连接数,JK才会将会话切换到其他服务器上。但是如果恰巧一直负责处理该会话的服务器down掉了,则会话将会丢失,明显的故障现象就是关于session的操作会出现莫名其妙的错误(例如你所运行的应用中用户可能已经登录了,但突然在一次访问后莫名其妙地提示没有登录)。这里配置为false,不启用粘性会话,让服务器都有机会处理请求,提高了系统的稳定性。
worker.jk_watcher.type=status 这里配置为status,用于监视各个负载均衡服务器实例的运行状态
worker.jk_watcher.mount=/tomcat/jk 设置名称为“jk_watcher”的worker(负载均衡服务器实例监视器)的挂载路径,这里配置为/tomcat/jk
worker.retries=5 这是worker全局的重试次数。在apache服务器启动后,会最多尝试若干次去连接这些负载均衡服务器,若连接不上就认为是down掉了,这里配置为3
下面再来说一下 uriworkermap_app1.properties 这个文件
这个文件的作用是告诉apache服务器哪些请求由负载均衡服务器处理,文件内容如下:
- /*=tomcat
- /jkstatus=jk_watcher
- !/*.gif=tomcat
- !/*.jpg=tomcat
- !/*.tif=tomcat
- !/*.png=tomcat
说明一下,在配置文件中,以“!”开头的条件表示“不要”,“=”表示交给。
/*=tomcat
其中“/*”表示所有的请求都给tomcat(就是在worker.properties中定义的那个worker.list中的tomcat)
/jkstatus=jk_watcher
!/*.gif=tomcat
!/*.jpg=tomcat
!/*.tif=tomcat
!/*.png=tomcat
这些表示以“.gif”等结尾的不交于tomcat处理。
以上完成了在Apache上的配置,下面先来配置Tocmat中的sever.xml文件来实现简单的负载均衡。
下面来配置tomcat的负载均衡。在server1=192.168.1.107上完成
在apache中完成了配置后,就来配置Tomcat
# cd /setup/tomcat/app1/conf/
编辑server.xml这个文件
所要做的工作是,如果是在同一台机器上做的,就要改端口了,所要改的端口如下:
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
这里显示的是文件中原始的端口,只要改这三个端口就可行了。
下面来配置来实现tomcat的负载,在配置文件中找到:
<Engine name="Catalina" defaultHost="localhost">
改变为:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="server107">
这里说明一下,句主要是jvmRoute这个参数,这个参数配置为server107,这个是在worker.properties定义的一个server.这样完成后,就可以测试一下了,这里有个测试的文件,index.jsp 文件内容如下:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'index.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- This is my JSP page. <br>
- </body>
- </html>
把这个文件放到webapps目录下的test目录当然要先创建这个目录。要两tomcat中都要放入。
下面是测试的结果:
刷新后结果:
结果不同,是因为我放的网页不相同,使得结果更加清楚的显示出来。
这样就简单的实现的Tomcat的负载均衡。
下面来配置集群:
同样是编辑server.xml文件
改变后的文件如下所示:
- <?xml version='1.0' encoding='utf-8'?>
- <Server port="8005" shutdown="SHUTDOWN">
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
- <Listener className="org.apache.catalina.core.JasperListener" />
- <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
- <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
- <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
- <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">
- <Connector port="8080" protocol="HTTP/1.1" minProcessors="10" maxProcessors="1024" enableLookups="false" acceptCount="1024"
- connectionTimeout="20000" useBodyEncodingForURI="true" URIEncoding="utf-8" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
- redirectPort="8443" />
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="utf-8"/>
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="server107">
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
- <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <MemberShip className="org.apache.catalina.tribes.membership.McastService"
- bind="192.168.1.139"
- address="228.0.0.4"
- port="45564"
- frequency="500"
- droptTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="192.168.1.139"
- port="4000"
- autoBind="100"
- selectorTimeout="5000"
- maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
- <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
- resourceName="UserDatabase"/>
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true"
- xmlValidation="false" xmlNamespaceAware="false">
- </Host>
- </Engine>
- </Service>
- </Server>
这个是去掉注释的部分后的文件内容,其中橙色部分是配置集群的部分这些要手动写进去的。其中“bind="192.168.1.139" ”这个server2=192.168.1.139上的集群配置。在107上要写成107的ip地址。如果是在同一台机器上的两个tomcat,这个ip可以一样,只是下面的端口要改变一下。也就是这相要变一下port="45564“
这里的配置还能实现session同享。这里也有个测试的网页。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 = request.getParameter("dataName");
- if (dataName != null && 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="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>
也是放在test那个目录下
测试结果如下:
刷新后的结果:
这样就看的很清楚两个tomcat的负载
下面来看是否session同步
名称和值中输入:1,1、2,2、3,3
结果如下所示:
这样可以清楚的看到session共享成功。
以上就是整个Apache与Tomcat的结合的整个过程,还有许多地方可能不是太正确,希望高人来指定一下。
相关推荐
不好意思,前面的资源缺少一个手动配置的解说文档,这里将其与可执行文档打包一并上传。
本文讲述了 Window XP Apache+MySQL+PHP 配置图解加详细解说的过程,从 Apache 的安装和配置到 PHP 的安装和配置,最后到 MySQL 的安装和配置。通过本文,我们可以了解到 Window XP 下 Apache+MySQL+PHP 的配置过程...
详细的解说了Apache和Tomcat的区别,解答学者心中的疑惑。
本文将详细介绍在 Windows 7 操作系统下如何配置 Apache Tomcat 7.0,通过图文并茂的方式,帮助读者顺利搭建起 Tomcat 服务器。 #### 二、准备工作 在正式配置 Tomcat 之前,确保以下条件已被满足: 1. **JDK 环境*...
图文解说MyEclipse+MySQL+SSH工程开发.pdf
Hadoop-Apache2.7.3和Spark2.0集群搭建涉及众多步骤和技术细节,下面详细阐述这些知识点。 首先,搭建Hadoop-Apache2.7.3和Spark2.0集群之前,需要了解相关硬件和软件的环境要求。在硬件设备方面,单台物理机应至少...
Tomcat是一款广泛使用的开源Java Servlet容器,由Apache软件基金会的Tomcat项目开发并维护。它实现了Java EE的Web部分,特别是Servlet和JSP规范,使得开发者能够在服务器上运行基于Java的Web应用程序。 **一、...
【Tomcat 原理解说】 Tomcat 是一个流行的开源Java Servlet容器,它实现了Java EE中的Web应用程序规范。本文将深入解析Tomcat的启动过程、Web容器的功能以及一些不常用的配置选项。 ### 1. Tomcat 启动过程分析 ...
【XML网站的源代码基于MySQL+Apache】是一个用于构建基于XML技术的在线论坛系统的项目,其核心技术栈包括XML(eXtensible Markup Language)、MySQL数据库系统以及Apache服务器。这个源码包提供了完整的开发和部署...
6. **代码详细解说**:文档中提供的代码详细解说对于理解每个功能的实现至关重要。这通常包括函数的逻辑、变量的作用以及关键代码块的解释,有助于初学者学习和理解项目结构。 7. **版本控制**:虽然未明确提及,但...
本书采用案例源码和解说形式全面介绍 Apache CXF 框架的功能。 本书共 15 章,大致分为三个部分。第一部分介绍关于 SOA 和 Web Services 的初步知识,第二部分介绍Apache CXF 框架的一些基础知识,第三部分重点介绍 ...
### Apache日志Hadoop大数据分析项目:清洗数据核心功能解说及代码实现 #### 一、项目背景 在大数据分析领域,尤其是针对Web服务器的日志分析过程中,原始数据往往杂乱无章,包含大量无关信息。为了提高数据分析的...
zoj上凸包题目,可用作模板,相信您用了之后一定不会后悔的
基于java+OpenCV人脸识别+图片相似度检测+源码+开发文档说明+代码解说(毕业设计&课程设计)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以...
而“爆款电影解说”则是短视频领域中的一个重要分支,它通过简短、精炼且吸引人的文案,将电影的主要情节、亮点和情感传达给观众,让人们在短时间内领略到电影的魅力。下面我们将深入探讨这一主题,讲解如何创作出...
此外,随着物联网(IoT)的发展,嵌入式系统还能实现远程监控和故障诊断,提升系统的可靠性和智能化水平。 在“分享电机”这个压缩包文件中,可能包含了关于电机设计、选型、控制策略以及嵌入式系统实现的相关资料...
这表明影视解说文案生成器可能使用了WebView2技术来显示网页内容或运行Web应用程序,实现部分功能。 2. **影视解说文案生成器.exe**:这是程序的可执行文件,用户可以通过双击运行此文件来启动影视解说文案生成器...