zoukankan      html  css  js  c++  java
  • Apache + Tomcat + JK 集群

    原文请见http://www.cnblogs.com/dennisit/p/3370220.html

    本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面相应的应用。

    模块介绍

    - Apache作为Webserver。用于处理静态Http请求;

    - Tomcat作为应用server(Servlet容器),处理动态请求;

    - JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的相应。使后端Tomcat负载均衡。

    开发环境

    - Windows 7操作系统

    - Java SE8

    - Apache 2.2.14    (本地安装路径:D:Apache2.2)

    - Tomcat 7.0.42  ( http://tomcat.apache.org/download-70.cgi ),假设在同一台机器上模拟,下载zip版本号. 实例中展示了2个节点

    - mod_jk: 1.2.37:  ( http://tomcat.apache.org/download-connectors.cgi )


    安装步骤:


    1.安装jdk
    2.安装Apache2.2,使用默认设置,而且安装路径中不要空格.
    3.解压tomcat
    4.拷贝mod_jk.so到Apache安装路径的modules目录下


    配置步骤

    改动Apache配置:

    关于改动涉及到的文件httpd.confworkers.properties文件能够下载一份mod_jk的源代码包參看

    1.改动Apache配置文件httpd.conf(笔者路径:D:Apache2.2confhttpd.conf), 在最后一行末尾加入:

    include "D:Apache2.2confmod_jk.conf"

    2. 在httpd.conf 同文件夹下新建mod_jk.conf文件

    #载入mod_jk Module 
    LoadModule jk_module modules/mod_jk.so
    
    #指定 workers.properties文件路径
    JkWorkersFile conf/workers.properties
    
    #指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
    JkMount /* controller

    3.在httpd.conf同文件夹下新建 workers.properties文件

    #这里能够配置随意多个Tomcat。此处配置了2个Tomat服务器.
    #host和port依据自己实际配置.实例配置的是本机两个tomcat,分别使用不同的port.避免冲突
    #假设Tomcat不再同一机器上。不是必需改port的。

    #server 列表 worker.list=controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=9988 #ajp13 port号,在tomcat下server.xml配置,默认8009 worker.tomcat1.host=localhost #tomcat的主机地址。如不为本机。请填写ip地址 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多 #========tomcat2======== worker.tomcat2.port=9999 #ajp13 port号,在tomcat下server.xml配置,默认8009 worker.tomcat2.host=localhost #tomcat的主机地址。如不为本机。请填写ip地址 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多 #========controller,负载均衡控制器======== worker.controller.type=lb #指定此负载平衡器负责的Tomcat应用节点。 worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat #此处指定集群是否须要会话复制,假设设为true,则表明为会话粘性,不进行会话复制。当某用户的请求第一次分发到哪台 #Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理。假设设为false,则表明需求会话复制。 worker.controller.sticky_session=false #设为false,则表明需求会话复制。


    改动Tomcat配置:
    说明,假设改动了tomcat配置文件,最好将文件编码转换成utf-8格式.
    由于实例中我们定义了2tomcat处理分发.所以我们将tomcat的解压版本号(zip)格式复制一份.用来分别担当不同的分发处理角色这里由于在一台机器上,所以我们使用zip版本号的,当然你某个分发处理机器上仅仅一个tomcatserver的话,能够选择安装版本号的.这里推荐使用解压版的.tomcat6的配置方式跟7一致.

    tomcat-node1为实例

    1.改动分发tomcat相应的service.xml文件,保证Apache相应的 workers.properties中的AJP13connectorport.
     <!-- 定义一个AJP 1.3 连接port为9988 ,默认值为8009,这里我们改成我们自定义的9988port -->
        <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

    2.添加jvmRoute的值,保证同workers.properties里边配置的值一致

        <!--添加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点-->
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    
    
    3.去掉默认凝视掉的集群配置

      <!--取消集群结点相关的凝视,该句默认值凝视掉的,我们须要配置集群所以去掉凝视,让其起作用-->
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    假设我们的tomcat结点分布在不同的机器上,那么我们的集群至此已经配置完毕.去掉多余凝视,显示做了改动的部位

    改动前

    <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
        <!-- You should set jvmRoute to support load-balancing via AJP ie :
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
        -->
        <Engine name="Catalina" defaultHost="localhost">
    
        <!--For clustering-->
        <!--
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
        -->

    改动后的tomcat-node1


    <!-- 定义一个AJP 1.3 连接port为9988 ,默认值为8009,这里我们改成我们自定义的9988port -->
        <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />
    
        <!--添加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点-->
        <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat1">
    
        <!--取消集群结点相关的凝视,该句默认值凝视掉的,我们须要配置集群所以去掉凝视,让其起作用-->
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    改动后的tomcat-node2


    <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="9999" protocol="AJP/1.3" redirectPort="8443" />
    
        <!-- You should set jvmRoute to support load-balancing via AJP ie :
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
        -->
        <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat2">
    
        <!--For clustering-->
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    说明:这里的protocol="AJP/1.3",连接以及jvmRoute须要保证同我们在Apacheserver中配置的works.properties一致.改动完后最好将service.xml文件的编码设置为utf-8格式.否则可能tomcat启动会出错.


    4.实例中我们的两个tomcat结点在同一台机器上,所以还须要保证protocol="HTTP/1.1"的port不一致.不然本地的两个tomcat会起冲突

    以下为笔者实例中解决同一台机器上多个tomcatserver之间port冲突做的改动.

    Tomcat--node1

    Tomcat-node2

    <Server port="9995" shutdown="SHUTDOWN">
    ……
     <Connector port="9990" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    ……
    
    

    说明:这里的protocol="HTTP/1.1"配置的相关port之间不能冲突,并且也不能同本机其他应用程序占用的port冲突.否则可能会报错.

    实例測试

    1.在web.xml文件里添加

    <distributable/>
    
    

    2.编写測试jsp代码

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ page import="java.text.SimpleDateFormat"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>Tomcat集群測试</title>
      </head>
      
      <body>
            server信息:
    
        <%
          String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
          System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm);
          out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); 
        %>
        
        session分发:
        <%
            session.setAttribute("name","dennisit");
            System.out.println("[session分发] session id:"+session.getId());
            out.println("<br>[session分发] session id: " + session.getId()+"<br>");
        %>
      </body>
    </html>

    3.測试负载均衡与session分发

    将项目部署到每一个集群结点中,即实例中的tomcat_node1tomcat_node2,依次移动Apachetomcatserver,tomcatserver之间的启动顺序任意.这里Apacheport使用默认的80.


    上面是在FireFox中执行项目后刷新3次执行的效果,能够看到2tomcat分发结点之间轮流负载.并且两台server上的session值是一样的.说明session分发成功.

    附录:

    ApacheTomcat的差别:
    Apache是一个webserver环境程序。能够作为webserver使用。只是仅仅支持静态网页,如(asp,php,cgi,jsp)等动态网页的就显得无能为力。


    假设想让server也能处理动态页面,那么就须要Tomcat

    当处理静态页面时,Tomcat不如Apache迅速。Tomcat不象Apache一样可配置(如:能够作为一个代理server,即loadbalaner)

    Tomcat不象Apache一样强壮。

    基于以上原因,一个现实的站点使用一个Apache作为Webserver,为站点的静态页面请求提供服务。并使用Tomcatserver作为一个Servlet/JSP插件,显示站点的动态页面。

     

    Apache,Tomcat负载均衡和集群

    对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群).
    负载平衡:每台server都是独立的,仅仅是对请求的负载进行平衡,而不正确状态(SESSION)进行复制。
    状态复制(集群):先进行负载平衡,再在各server间复制应用状态。

     

    Apache+Tomcat构建企业级应用

    1.Apache主要用来解析静态文本,htmltomcat也有此功能。但apache能大大提高效率,对于并发数较大的企业级应用,能更好的显示Apache的高效率;  
    2.Tomcat 用来解析jsp,servlet,全部的客户请求首先会发送到apache,假设请求是静态文本则由apache解析,并把结果返回给 client,假设是动态的请求。如jspapache会把解析工作交给tomcat,由tomcat进行解析(这首先要两者现实整合),tomcat解析完 成后。结果仍是通过apache返回给client,这样就能够达到分工合作,实现负载均衡。提高系统的性能!


  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6874911.html
Copyright © 2011-2022 走看看