zoukankan      html  css  js  c++  java
  • Apache httpd + tomcat 简单集群

    集群其实很简单,我们就来说一下httpd+tomcat集群都要注意哪些部分:

    首先使用的东西有

    apache-tomcat-8.0.32      下载地址: http://tomcat.apache.org/download-80.cgi

    httpd-2.4.18-x86-vc11-r3/Apache24     下载地址:http://httpd.apache.org/download.cgi        http://apache.opencas.org//httpd/binaries/win32/        http://www.apachehaus.com/cgi-bin/download.plx    

    tomcat-connectors-1.2.40-windows-i386-httpd-2.4.x/mod_jk.so   下载地址:  http://tomcat.apache.org/download-connectors.cgi       http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/  

    (tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x/mod_jk.so)看你是64位系统还是32位系统,当然也要看是windows平台还是linux平台

    1,首先如果你决定使用用集群了, 那么你的web.xml中一定要有<distributable/>

    下边是一个最简单的web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <distributable />

    <display-name>Archetype Created Web Application</display-name>

    <welcome-file-list>
      <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    </web-app>

    2,对tomcat进行配置

    如果你是单机启动多个tomcat的话一定要多注意几个点:

    1)

    <Server port="8006" shutdown="SHUTDOWN"> shutdwon server port,如果你是单机启动多个tomcat的话,这个端口尽量要每个都不一样。

    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

    2)

    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

     注意一下这个协议下和这个端口, 这就是你单机、单个tomcat启动后,访问tomcat的端口。也就是:http://localhost:8081/webapplication/index.jsp.

    redirectPort="8443" 这个可以暂时不用管,tomcat默认不用启动 ssProtocol 协议,如果你启动了话,详细可以找找tomcat配置https ssl tls相关的内容,这个端口也要每个tomcat都各不一样。

    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" />
    -->

     3)

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

    这个地方是一定要注意的,因为 apache Httpd 和tomcat通信链接就是用这个端口,如果你是单机启动多个tomcat,这个端口也要每个都不一样。

    关于ajp/1.3这个可以自己去查一下,记住ajp13。因为后边 apachehttpd 会用到这个,而且mod_jk的配置有个ajp13

    4)

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

    这个要看一下每个tomcat都要不一样,无论单机启动多个,还是多机启动多个。这个名字要记住,这个会和apache httpd mod_jk 中的worker名字对应,必须样一样!

    5)

    <!--
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    -->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    这个地方注释放开,这个使用的tomcat提供的默认的simpleTcpCluster即可,更多详细配置参见:

    http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

    http://tomcat.apache.org/tomcat-8.5-doc/index.html

    到此 tomcat server.xml配置完毕,可以先启多个tomcat试试了tomcat了。

    3,配置apache httpd

    关于httpd的安装不多说了,找到Apache24 目录,

    把开始准备好的mod_jk.so放进Apache24modules目录中,在这个目录中你会看有很多*.so文件,对这些都是链接库文件,就是这个目录,放进去。

    注意的是和版本号,和系统,和多少位的系统,还有和(httpd是x64还是x86)都是紧密相关的,不要选错了mod_jk.so。

    1)配置,首先要修改httpd.conf, 在Apache24conf 目录先回找这个文件(关于Apachehttp的目录结构,可以自己下去多了解)

    在httpd.conf的最后添加一行:

    # Add mod_jk for tomcat load blance
    Include conf/extra/mod_jk.conf   #这个文件现在当然不存在了, 需要你创建的。

    文件部分截图如下: 
    # Secure (SSL/TLS) connections
    # Note: The following must must be present to support
    # starting without SSL on platforms with no /dev/random equivalent
    # but a statically compiled-in mod_ssl.
    #
    <IfModule ssl_module>
    #Include conf/extra/httpd-ssl.conf
    Include conf/extra/httpd-ahssl.conf
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>
    <IfModule http2_module>
    ProtocolsHonorOrder On
    Protocols h2 h2c http/1.1
    </IfModule>

    # Add mod_jk for tomcat load blance
    Include conf/extra/mod_jk.conf

    2)按照目录创建文件: conf/extra/mod_jk.conf

     完整目录: Apache24confextramod_jk.conf

    mod_jk.conf文件里的内容要写些什么呢,下边是最简单的配置可以直接copy使用:

    更多详细配置参考网站: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

    #
    # Load mod_jk for tomcat load blance
    #

    #Load mod_jk module(加载mod_jk.so库)
    LoadModule jk_module modules/mod_jk.so
    #Where to find workers.properties(workers配置文件,这里边就配置了tomcat的集群信息,这个文件现在也不存在,需要自己创建)
    JkWorkersFile conf/workers.properties
    #Where to put jk shared memory(配置内存共享文件)
    JkShmFile logs/httpd/mod_jk.shm
    #Where to put jk logs(配置log文件)
    JkLogFile logs/httpd/mod_jk.log
    #Set the jk log level [debug/error/info](配置log级别,这里log级别开成info即可,有时在window下运行,会有莫名奇妙的问题,比如说权限,不报任何错误,但是运行不成功,所以开一打开debug看看。Windows先一定是run as Adminstator!,要不然你会看到log中有什么...创建shared memory之类的错误)
    JkLogLevel debug
    #Send servlet for context /examples to worker named worker1

    #(配置一些过滤器,类似web中的过滤器,哪些路径文件走哪个worker, 特比要注意 controller,这个名字可以随便起,但是受限制于将要创建的workers.properties文件,要记住这个名字必须和worker.properties中的worker名字一致)
    #JkMount /servlet/* controller
    #JkMount /servlets/* controller
    #Send JSPs for context /examples to worker named worker1
    #JkMount /*.jsp controller
    #JkMount /*.html controller
    #JkMount /*.htm controller
    JkMount /* controller
    #monitor the cluster status(监控集群状态的配置,status同上,可以使用http://localhost/jkstatus监控集群状态)
    JkMount /jkstatus status

    3)创建 conf/workers.properties

    全路径:Apache24confworkers.properties

    workers.properties要写什么呢?tomcat集群的信息:

    详细的配置和说明参考: http://tomcat.apache.org/connectors-doc/reference/workers.html

    示例代码,可以直接copy 使用

    worker.list=controller,status      ####看到没,这个就是那个controller

    worker.maintain=60

    #========tomcat1========
    worker.tomcat1.type=ajp13      ####还记得开始要注意的jvmRoute吗?还记得让记住的ajp13吗?
    worker.tomcat1.host=localhost  ####这个是一个ip地址,如果不是本机的直接给远程机器的IP
    worker.tomcat1.port=8010       ####还记得开始让注意的 protocol="AJP/1.3" 的端口吗,就是它。
    worker.tomcat1.lbfactor=1        ####负载均衡的一个因数,类似权重之类的,做集群负载均衡使用

    #========tomcat2========
    worker.tomcat2.type=ajp13
    worker.tomcat2.host=localhost
    worker.tomcat2.port=8011
    worker.tomcat2.lbfactor=1

    #========tomcat3========
    worker.tomcat3.type=ajp13
    worker.tomcat3.host=localhost
    worker.tomcat3.port=8012
    worker.tomcat3.lbfactor=1

    #========controller,负载均衡控制器========
    worker.controller.type=lb          ####负载均衡控制器,类似一个虚拟的worker,type必须是lb
    worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3      ####负载均衡集群中所有的tomcat都在这里了
    worker.controller.sticky_session=true     #### 多个tomcat之间session的处理,使用不使用sticky的方式
    worker.controller.sticky_session_force=1

    worker.status.type=status        #### 整个配置,包括集群中的tomcat的状态的查看。

    到此所有的配置全部完毕。

    现在可以重启tomcat和apache httpd了,如果你的配置没有问题的话,现在你就可以访问你的单个的tomcat,同时也可以访问你的apache httpd的集群入口。

    下边给出一个session测试的页面,来测试session的情况。当然你必须要做成webapplication,因为需要web.xml 中的 <distributable /> 还记得不?

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.*"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <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" value="submit">
    </form>
    </body>
    </html>

    好了,文章到此应该技术了,关于集群 session 复制,初告一段落。

    其实还有很多要思考的,再想一些websocket的应用,怎么弄, 比如使用websocket+html5在页面上画图,这个集群怎么弄呢?

  • 相关阅读:
    vue学习之router
    vue学习之组件
    xshell操作
    Webstorm快捷操作
    javascript判断节点是否在dom
    影子节点 shadowDOM
    虚拟节点操作——DocumentFragment
    理解浏览器的历史记录
    浏览器渲染
    web请求流程
  • 原文地址:https://www.cnblogs.com/icenter/p/5328383.html
Copyright © 2011-2022 走看看