Linux平台上搭建apache+tomcat负载均衡集群[一台服务器多tomcat集群模式]

传统的Java Web项目是通过tomcat来运行和发布的。但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的。tomcat 处理能力低,效率低,承受并发小(1000左右)。当用户请求较少时,单一的tomcat能够快速响应用户请求,但如果访问量一大,tomcat处理能力跟不上,无法及时响应请求,就会造成用户等待;如果访问量过大,超出tomcat的承受能力,还可能导致tomcat超载故障。

apache 是一个 web 服务器环境程序,可以作为web 服务器使用。Apache对并发请求的处理能力较tomcat强,对静态页面(如asp,php,cgi,jsp等)的处理上比tomcat更为迅速,但apache不支持动态网页(需借助tomcat)。

因此实际应用中可以搭建apache+tomcat负载均衡集群,一个apache 作为 Web 服务器,为网站的静态页面请求提供服务;并使用tomcat 服务器作为一个 Servlet/JSP 插件,用于处理网站的动态页面。当用户通过浏览器发出请求时,客户请求首先会发送到 apache,如果请求是静态文本则由 apache 解析,并把结果返回给客户端;如果是动态的请求,如 jsp,apache 会把解析工作交给 tomcat,由 tomcat 进行解析(这首先要两者现实整合),tomcat 解析完成后,结果仍是通过 apache 返回给客户端。这样就可以达到分工合作,实现负载均衡,提高系统的性能!

工具/原料
Linux系统:选用Redhat的开源版本CentOS操作系统(这里用CentOS 5.5版本)
JDK:选用版本为jdk1.7.0_45,安装包jdk-7u45-linux-i586.tar.gz
Apache:选用版本2.4.7,安装包httpd-2.4.7.tar.gz
Tomcat:选用版本7.0.47,安装包apache-tomcat-7.0.47.tar.gz
JK:选用版本1.2.37,安装包:tomcat-connectors-1.2.37-src.tar.gz

方法/步骤

1、找一台计算机做linux服务器,在上面安装CentOS操作系统。

2、在linux服务器上安装CentOS之后,事先将所有软件的安装包上传到linux服务器上,并放置在/software目录下。

3、JDK安装(1):因为CentOS自带有open jdk,需要将其删除,再重新安装oracle jdk。但如果直接在centOS的“应用程序–添加/删除软件–基本系统–java”中,删除java,与之相关的openoffice等软件,也会自动随之删除,因此,在进行原有的jdk删除之前,最好先安装配置好新的jdk及相应的环境。

4、JDK安装(2):安装下载的oracle jdk。
(1)在/usr/local目录下新建Java文件夹,并将安装包从/software目录拷贝到/usr/local/Java目录下(图形界面下直接“复制”-“粘贴”即可)。

      #cp /software/jdk-7u45-linux-i586.tar.gz/usr/local/Java

(2)定位到文件夹/usr/local/Java。

    #cd /usr/local

(3)解压安装包到当前目录。

   #tar -zxvf jdk-7u45-linux-i586.tar.gz

(4)配置java的环境变量。

 export JAVA_HOME=/usr/local/Java/jdk1.7.0_45
 export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jren

(5)修改完成以后,logout再重新登陆,或#source /etc/profile,使文件立即生效。

5、JDK安装(3):查看与系统自带open jdk有关的包。
在终端中输入“rpm -qa|grep gcj”,查看gcj的版本号,在这里得到的结果如图所示:
5

6、JDK安装(4):卸载系统自带open jdk。
在终端中输入“yum -y remove javajava-1.4.2-gcj-compat-1.4.2.0-40jpp.115”,然后等待,等待系统卸载完自带的jdk。最终在终端中显示“Complete!”,卸载完成。

7、JDK安装(5):卸载系统自带open jdk时出现问题及解决方案。
【问题】使用yum安装或卸载软件,出现如图所示的提示错误。
原因是系统进程已经有一个yum的update进程在运行了。可用ps -ef | grep update查看进程。解决办法是在命令行输入下面两条命令:

#rm -rf /var/run/yum.pid /sbin/service
#yum -updatesdrestart

新执行yum的删除命令即可。
7

8、JDK安装(6):查看jdk版本。
在命令行中输入java -version命令可查看安装的jdk版本。如果显示出jdk安装的版本信息则说明jdk安装成功。
如果出现如图所示的错误信息,则是因为系统的selinux的设置问题,即开启了selinux服务。解决办法如下:
(1)打开/etc/selinux/config;
(2)把selinux=enforcing改为selinux=disabled;
(3)重启linux。
8

9、Apache安装(1):使用# rpm -qa|grep httpd,查看与httpd相关软件包。发现CentOS自带有apache,版本为2.2.3。因此在安装我们需要的apache之前,需要卸载CentOS自带的apache。

10、Apache安装(2):卸载CentOS自带Apache。
上一步我们已经查看了与httpd相关的软件包,这一步要删除删除httpd。在命令行中使用:# rpm -e httpd。
如果出现如图所示错误,说明还有一个相关的软件包没有删除,清除之,即:# rpm -e gnome-user-share。
10

11、Apache安装(3):再次删除httpd:# rpm -e httpd
可以使用参数–nodeps的意思就是不管各个程序包间的依赖关系。

#rpm -e --nodeps httpd //这样不需要删除gnome-user-share了。

12、Apache安装(4):重新安装自己下载的Apache
(1)将安装包从/software目录拷贝到/usr/local目录下。

 #cp /software/httpd-2.4.7.tar.gz /usr/local

(2)定位到文件夹/usr/local。

 #cd /usr/local

(3)解压安装包到当前目录。

 #tar -zxvf httpd-2.4.7.tar.gz 

(4)定位到文件夹/usr/local /httpd-2.4.7。

 #cd httpd-2.4.7

(5)设置安装路径和需要编译的模块。

# ./configure–prefix=/usr/local/apache –enable-so -enable-proxy -enable-proxy_http=shared–enable-module=so –enable-mods-shared=all –enable-proxy-ajp=shared –enable-proxy-balancer -with-mpm=worker
//备注:prefix定义apache的安装路径编译通过,继续安装apache。
#make && makeinstall

13、Apache安装(5):apache安装的check过程中出错,如图所示:APR not found 。原因是没有安装apr。
在/usr/local目录下安装apr:

#tar -zxvf apr-1.5.0.tar.gz
#cd apr-1.5.0
#./configure –prefix=/usr/local/apr
#make
#make install

安装完成后再来configure apache。
13

14、Apache安装(6):apache安装的check过程中出错,如图所示:APR-util not found。原因是没有安装apr-util。
在/usr/local目录下安装apr-util:

#tar -zxvf apr-util-1.5.3.tar.gz
#cd apr-util-1.5.3
#./configure–prefix=/usr/local/apr-util –with-apr=/usr/local/apr
#make
#make install

安装完成后,在apache的./configure 最后增加--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util,重新configure apache
这里写图片描述

15、Apache安装(7):apache安装的check过程中出错,如图所示,原因是没有安装pcre。
在/usr/local目录下安装pcre:

# tar -zxvf pcre-8.32.tar.gz
#cd pcre-8.32
#./configure–prefix=/usr/local/pcre
#make
#make install

安装完成后,在apache的./configure 最后增加./configure 时加上参数 –with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/--with-pcre=/usr/local/pcre,重新configure apache。

15

16、Apache安装(8):编译通过,继续安装apache。
#make && makeinstall 。

17、Apache配置及测试(1):安装完毕后,在测试启动apache之前先修改/apache/conf /httpd.conf。
(1)查找ServerName,打开注释,将ServerName值改为对应的IP地址。
(2)在DirectoryIndex中添加 index.jsp。
(3)以下2个注释去掉:

   #Include conf/extra/httpd-mpm.conf
   #Include conf/extra/httpd-default.conf

18、Apache配置及测试(2):保存httpd.conf文件的修改,启动apache服务。

# /usr/local/apache/bin/apachectl start

浏览器访问http://127.0.0.1,提示无法连接。说明apache没有成功启动。查看错误日志(/apache/logs/error_log),发现如图错误信息。原因是httpd.conf里面的mod_slotmem_shm.so没有加载。将httpd.conf 文件中的
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so”前的“#”去掉即可。

这里写图片描述

19、Apache配置及测试(3):
(1)重新启动apache并查看httpd是否运行。

 # /usr/local/apache/bin/apachectl start
 # ps -ef | grep httpd

(2)浏览器测试apache。在浏览器中访问http://127.0.0.1 。页面出现“It's Works!”字样即为成功。

20、Apache的启动和关闭:
在/usr/local/apache/bin下有可执行程序。
(1)启动apache服务:# /usr/local/apache/bin/apachectl start
(2)关闭apache服务:# /usr/local/apache/bin/apachectlstop
(3)重启apache服务:# /usr/local/apache/bin/apachectl restart

21、Tomcat安装、测试及配置(1):安装tomcat
(1)将安装包从/software目录拷贝到/usr/local目录下(图形界面下直接“复制”-“粘贴”即可)。

 #cp /software/apache-tomcat-7.0.47.tar.gz/usr/local

(2)定位到文件夹/usr/local/。

 #cd /usr/local

(3)解压安装包到当前目录。

 #tar -zxvf apache-tomcat-7.0.47.tar.gz

(4)修改配置文件,增加java的环境变量信息。在/usr/local/apache-tomcat-7.0.47/bin下有文件catalina.sh 在文件头部增加下列信息:

 export JAVA_HOME=/usr/local//Java/jdk1.7.0_45
 exportCLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
 exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

(5)启动tomcat

 #/usr/local/apache-tomcat-7.0.47/bin/startup.sh

22、Tomcat安装、测试及配置(2):浏览器测试tomcat是否启动
测试tomcat。打开浏览器访问http://127.0.0.1:8080,可以看到tomcat的启动欢迎页面,证明tomcat配置正确。

23、Tomcat安装、测试及配置(3):tomcat的启动和关闭
在/usr/local/apache-tomcat-7.0.47/bin下有可执行程序。
(1)启动tomcat服务:

 # /usr/local/apache-tomcat-7.0.47/bin/startup.sh
 # /usr/local/apache-tomcat-7.0.47/bin/catalina.sh start

(2)关闭tomcat服务:

 # /usr/local/apache-tomcat-7.0.47/bin/shutdown.sh
 # /usr/local/apache-tomcat-7.0.47/bin/catalina.sh stop

24、Tomcat安装、测试及配置(4):java web项目发布
(1)用eclipse将编译好的Java Web项目导出成war包。
(2)将war包放置到linux服务器上的tomcat的webapps目录下。如本次配置放在/usr/local/apache-tomcat-7.0.47/webapps下。
(3)启动tomcat后,tomcat会自动将war包解压并运行Java Web项目。
(4)打开浏览器,输入http://127.0.0.1:8080/SessionTest(项目名),就可以访问项目。

25、Tomcat安装、测试及配置(5):设置Tomcat默认访问项目
打开/usr/local/apache-tomcat-7.0.47/conf/server.xml,在<Host></Host>标签之间加入下面的语句


docBase值为想要默认访问的项目名称,此处为SessionTest。文件修改后如图所示。然后重新启动tomcat,打开浏览器,输入http://127.0.0.1:8080,就可以访问SessionTest项目。

26、mod_jk安装:
mod_jk的作用:连接apache和tomcat集群的中间件。
mod_jk的安装包:tomcat-connectors-1.2.37-src.tar.gz。
安装步骤如下:
(1)将安装包从/software目录拷贝到/usr/local目录下(图形界面下直接“复制”-“粘贴”即可)。

 #cp /software/tomcat-connectors-1.2.37-src.tar.gz /usr/local

(2)定位到文件夹/usr/local/。

 #cd /usr/local

(3)解压安装包到当前目录。

 # tar -zxvf tomcat-connectors-1.2.37-src.tar.gz

(4)编译安装mod_jk。

 #cd /tomcat-connectors-1. 2.37-src/native
 # chmod 755buildconf.sh
 # ./buildconf.sh
 # ./configure--with-apxs=/usr/local/apache/bin/apxs
 # make
 # make install

(5)将/tomcat-connectors-1.2.37/apache-2.0下的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。

 # cp ./apache-2.0/mod_jk.so/usr/local/apache/modules/

27、负载均衡集群配置(1):修改Tomcat/conf 路径下的server.xml。
修改< Connector>节点值,是关于使用ajp连接apache和tomcat时的配置。修改成如下形式

注意:如果一台机器上同时运行多个tomcat,一定要将每个tomcat对应的Connector标签的port端口设为不同的值

28、负载均衡集群配置(2):修改Tomcat/conf 路径下的server.xml。
修改<Engine>的配置。将<Engine>的注释打开,为安装的tomcat命名,即修改jvmRoute的值为“tomcat实例名”(不同的tomcat赋予不同值,此处安装了两个tomcat,分别命名为tomcat1和tomcat2),修改结果参见下图:
28

29、负载均衡集群配置(3):修改Tomcat/conf 路径下的server.xml。
<Engine><Host>元素下添加以下内容均可:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
         channelSendOptions="6">

    <Manager className="org.apache.catalina.ha.session.BackupManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"
                       mapSendOptions="6"/>

    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
             <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.0.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"
                          port="5000"
                          selectorTimeout="100"
                          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"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
    </Channel>

    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
           filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

    <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
               tempDir="/tmp/war-temp/"
                deployDir="/tmp/war-deploy/"
                watchDir="/tmp/war-listen/"
                watchEnabled="false"/>

    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

30、负载均衡集群配置(4):修改Tomcat/conf 路径下的server.xml。
修改<Cluster>节点信息。

<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
      bind="127.0.0.1"  <!—如果主机有vpn-虚拟专用网络,需要要bind下。如果没有的话可以不用加bind,否则会导致session无法复制-->
      address="228.0.1.99"  #广播地址,同一组tomcat集群一样
      port="45564"   #同一组tomcat集群一样
      frequency="500"
      dropTime="3000"/>
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
      address="172.**.***.201"    #修改为本机IP地址
      port="5000"   #(tomcat默认可以检测到4000~4100之间的端口)
<!-- 如果是在同一台电脑上配置负载,要修改这个端口,否则会因为端口冲突不起作用的。-->
      selectorTimeout="100"
      maxThreads="6"/>

31、负载均衡集群配置(5):修改待发布项目的web.xml
需要发布的项目放在tomcat的webapps文件夹下,在每个待发布项目的web.xml末尾的</web-app>标签里添加<distributable/>,确保session能够复制。如下图所示。

32、负载均衡集群配置(6):Apache配置——修改 httpd.conf
在apache的conf下的httpd.conf 文件尾部追加以下内容:

  #加载mod_jk Module
   LoadModule jk_module modules/mod_jk.so
   <Ifmodule mod_jk.c>
       #指定workers.properties文件路径
       JkWorkersFile/usr/local/apache/conf/workers.properties
       #指定jk logs文件存放位置
       JkLogFile/usr/local/apache/logs/mod_jk.log
       #Set the jk log level [debug/error/info]
       JkLogLevel info
       #Select the log format
       JkLogStampFormat "[%a %b %d%H:%M:%S %Y]"
       #JkOptions indicate to send SSL KEYSIZE,
         JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
       #JkRequestLogFormat set the requestformat
       JkRequestLogFormat "%w %V %T %q %U%R"
       #JkShmFile to put logs
       JkShmFile/usr/local/apache/logs/mod_jk.shm
   </IfModule>

   #指定哪些请求交给tomcat处理,哪些请求交给apache处理
   #注意:" loadbalancer "为在workers.propertise里指定的负载分配控制器
   JkMount /*.jsp loadbalancer  #所有的jsp都交给tomcat处理

33、负载均衡集群配置(7):Apache配置——创建workers.properties
httpd.conf的最后添加的配置中workers.properties文件是不存在的,需要我们自己在apache/conf路径下创建。workers.properties文件用于对负载均衡的负载器worker
(即tomcat)进行具体的登记,此处的2个tomcat就作为2个worker被登记在这个文件中。
workers.properties具体配置如下:

#workers.properties
#
# in unix, weuse forward slashes:
ps=/
# workers 列表 
#server 列表 要与http.conf文件中JkMount后第二个参数(loadbalancer)一致 貌似 #Tomcat1实例配置 这里要和Tomcat配置文件Service.xml的jvmRoute保持一致
worker.list=tomcat1,tomcat2, loadbalancer, status
#--------------------------------------------------------------------
# 第一个tomcat
#--------------------------------------------------------------------
worker.tomcat1.port=8009   #对应tomcat的server.xml中配置的ajp13端口号
worker.tomcat1.host=127.0.0.1  #tomcat1的主机地址,如不为本机,请填写IP地址
worker.tomcat1.type=ajp13  #定向包协议
worker.tomcat1.lbfactor=1  #server的负载分配权重,值越高,分得的请求越多
#以下为非必要配置,这部分配置tomcat2的配置同tomcat1
#worker.tomcat1.cachesize=1000  #配置tomcat的jk连接缓存大小 (非必要)
#worker.tomcat1.cachesize_timeout=600  # (非必要)
#worker.tomcat1.reclycle_timeout=300  # (非必要)
#worker.tomcat1.socket_keepalive=1  #防止防火墙切断未激活的网络连接(非必要)
#worker.tomcat1.socket_timeout=300   #(非必要)
#worker.tomcat1.local_worker=1  # (非必要)
#worker.tomcat1.retries=3  # (非必要) 
#----------------------------------------------------------------------
# 第二个tomcat
#----------------------------------------------------------------------
worker.tomcat2.port=8009
worker.tomcat2.host=172.**.***.202  #tomcat2的主机IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#----------------------------------------------------------------------
# load balancerworker -负载均衡控制器
# ---------------------------------------------------------------------
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2  #指定分担请求的tomcat
worker.loadbalancer.sticky_session=1    #设置为粘性session
worker.loadbalancer.sticky_session_force=0  #设置当多次请求未响应,请求将转发
worker.status.type=status
#
# end workers.properties

34、负载均衡集群配置(8):Apache配置——设置apache对项目的访问路径
修改/apache/conf/目录下的httpd.conf文件中的DocumentRoot和Directory值,将文件访问路径定位到tomcat的webapps文件夹,即待发布项目的存放位置,修改结果如下:

DocumentRoot "/usr/local/apache-tomcat-7.0.47/webapps"
<Directory "/usr/local/apache-tomcat-7.0.47/webapps">
   Require all granted
    Orderallow,deny
   Allow from all
</Directory>

如此对apache的修改完成,加之tomcat设置了默认访问项目,此时就可以实现直接通过apache所在主机的IP地址来访问项目。(实际配置中,是否实现IP地址直接访问以实际需求为准)
35、负载均衡集群Session测试(1):创建测试工程SessionTest
① 新建一个Java Web工程SessionTest,在工程下新建index.jsp,文件内容如下:

<%@ pageimport="java.util.*" %>
<html>
<head>
    <title> Session Test</title>
</head>
<body bgcolor="red">
<%
    out.print("session Id:"+session.getId());
%>
<formaction="index.jsp" method="post">
    key<input type="text" name="key"/>
    <br />
    value<input type="text"name="value" />
    <br />
    <input type="submit"value="Submit" />
    <br />
</form>
<%
    String key =request.getParameter("key");
    if(key!=null &&key.isEmpty()==false)
    {
        String value =request.getParameter("value");
        session.setAttribute(key, value);
        Enumeration e =session.getAttributeNames();
        while (e.hasMoreElements())
        {
            String sKey = (String)e.nextElement();
            String sValue = (String)session.getAttribute(sKey);
            out.print(sKey+ " ="+sValue+"<br>");
        }
    }
%>
</body>
</html>

② 修改SessionTest的web.xml,在web.xml末尾的</web-app>标签里添加<distributable/>
③ 将该项目放入同一组的tomcat的webapps下,并且使同一组的每个tomcat的项目中index.jsp的<bodybgcolor="red"> 颜色选用不同的颜色。(此处tomcat1为red,tomcat2为green)

36、负载均衡集群Session测试(2):session粘性测试
启动同组tomcat以及apache。浏览器访问apache所在的主机IP地址:http://172.18.145.201/, 显示如图一所示页面。从页面显示的session Id可以看出请求访问的是tomcat1。
多次刷新或submit后,请求访问的一直是tomcat1,并且session Id一直保持不变,session中的数据也能够保持,说明session粘性良好。

37、负载均衡集群Session测试(3):session复制测试
启动同组tomcat以及apache。浏览器访问apache所在的主机IP地址:http://172.18.145.201/,从页面显示的session Id可以看出请求访问的是tomcat1。提交几组session数据,显示结果如图一所示。
此时停掉tomcat1,再次提交session数据,或刷新页面,发现请求被转发给tomcat2,页面访问正常。页面颜色改变,但Session Id保持不变,session数据也全部传递给tomcat2,表明session复制良好。

38、 至此,apache+tomcat的负载均衡集群就全部配置完成了。如果想实现开机时负载集群服务自启动的话,可将如下内容添加至/etc/rc.d/rc.local文件末尾:

 /usr/local/apache-tomcat-7.0.47/bin/catalina.shstart
 /usr/local/apache/bin/apachectlstart
posted @ 2016-09-02 16:04  lllini  阅读(208)  评论(0编辑  收藏  举报