精华内容
下载资源
问答
  • 主要介绍了Linux 单个tomcat多实例部署shell脚本详解的相关资料,需要的朋友可以参考下
  • Tomcat 多实例部署

    2019-04-27 12:26:51
    Tomcat实例部署前言一、Tomcat部署的基本概念二、多实例部署时间 前言 以前总是采用很 Low 的方式在同一台服务器上部署多个 Web应用,步骤是这样的:Copy Tomcat 目录 ——> 更改conf/server.xml 三个端口号 ...

    前言

    以前总是采用很 Low 的方式在同一台服务器上部署多个 Web应用,步骤是这样的:Copy Tomcat 目录 ——> 更改conf/server.xml 三个端口号 ——> 部署war 包 ——> 分别启动访问。

    这样是最简单的方式,但事实上是不推荐的,因为如果服务器资源有限,需要部署的应用数目一旦增加,会给服务器带来负担,我们可以充分利用 Tomcat 服务器的性能,减少资源浪费。具体的做法就是采用 “Tomcat多实例” 部署多应用:创建 Tomcat 多实例 ——> 更改 conf/server.xml 三个端口号 ——> 编写启动/关闭脚本 ——>分别启动实例并访问。在动手实践之前,需要对一些基本概念清楚,比如 CATALINA_HOME与 CATALINA_BASE分别指?webapps 下的 example、docs、ROOT目录能删除吗?

    参考资料《Tomcat架构解析》

    一、Tomcat部署的基本概念

    1. CATALINA_HOME与CATALINA_BASE分别指什么?

    CATALINA_HOME 指的是 Tomcat 的安装目录,在Windows下Tomcat的安装目录如下:

    在这里插入图片描述
    bin:Tomcat一些脚本存放目录,比如启动脚本startup.bat/startup.sh等

    conf:Tomcat配置文件所在目录,最主要的就是server.xml与web.xml

    lib:主要存放Tomcat依赖包

    logs:Tomcat日志所在目录。以为catalina、host-manager等开头日志

    temp:存放Tomcat运行时的临时文件,通常放一些缓存文件,一般不要删除

    webapps:应用部署所在目录,就是在这里存放我们需要部署的文件目录、WAR包

    work:存放由JSP文件生成的Servlet

    RUNNING.txt:运行说明,必需的一些环境信息

    NOTICE:通知信息,软件的版权信息等

    RELEASE-NOTES:发布说明,比如版本升级的功能说明

    LICENSE:版权许可证,软件版权信息

    CATALINA_BASE指的是Tomcat的实例所在目录,Tomcat的实例由除了bin、lib外的目录组成

    两者的对比图如下一目了然,那么接下来 配置多实例,也只需要 Copy 相应的目录组成新的 Tomcat 实例即可。

    在这里插入图片描述

    2. conf 目录下的配置文件具体来做什么?

    在这里插入图片描述
    Tomcat 的配置需要分为 : JVM 配置、服务器配置、Web应用配置、Tomcat 管理配置四个方面 (其中 JVM 的配置一般在 catalina.sh/catalina.bat中配置,这里不做介绍),这里只做简单的介绍,不会具体介绍 Tomcat 配置

    1) 服务器配置

    服务器配置主要集中于 $CATALINA_HOME/conf下的catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml文件。

    2)Web应用配置
    web.xml 是Web应用的部署描述文件,它支持的元素及属性来自于 Servlet 规范定义。在Tomcat中,Web 应用的部署描述信息包括 $CATALINA_BASE/conf/web.xml 中的默认配置。

    Tomcat 的默认配置比Web 应用定制配置复杂很多,如果是完全基于JSP 的 Web 应用不需要添加任何定制配置。主要包括 ServletContext 的初始化参数、会话配置、Filter 定义与映射等

    3)Tomcat 管理配置

    主要是针对 host-manager 与 manager 两个功能进行配置,在 Timcat 中我们可以针对虚拟主机进行配置,也可以对我们的Web应用进行管理。

    3. webapps 下的目录哪些可以删除?
    Windows下查看webapps下的,包括docs、ROOT、manager、host-manager、examples。webapps不一定是Tomcat部署web应用唯一的地方,可以在任何一处,但只需要做好映射即可(context.xml描述文件或者Host的appBase属性可以做到)
    在这里插入图片描述
    事实上,全部都可以删除。为什么呢?这是因为

    1)ROOT:Tomcat 本身默认的访问 http://{ip}:{port},也就是访问 http://127.0.0.1:8080 标志性的Tomcat首页所在之处

    2)manager:访问http://{ip}:{port}/manager/html,可以管理部署应用(当然需要配置tomcat-users.xml文件)。一般部署Web应用往往是不需要的
    在这里插入图片描述

    3)host-manager:访问http://{ip}:{port}/host-manager/html,可以管理配置Host虚拟主机。一般简单web应用部署也不会用到

    在这里插入图片描述

    4)examples:Servlet、JSP、WebSocket示例,展示在Tomcat下如何使用等,访问http://{ip}:{port}/examples/index.html即可进入。也是不需要的,可以删除

    在这里插入图片描述

    5)docs:Tomcat HTML文档中心,不影响应用部署,可以删除

    4. Tomcat 为了避免端口冲突需要更改哪些端口?

    1) Server Port:该端口用于监听关闭 Tomcat 的shutdown命令,默认为 8005

    <Server port="8006" shutdown="SHUTDOWN">
    

    2) Connector Port:该端口用于监听 HTTP 的请求,默认为 8080

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

    3)AJP Port : 该端口用于监听 AJP (Apache JServ Protocol)协议上的请求,通常用于整合 Apache Server 等其他HTTP 服务器,默认为 8009.实际上可以不用管,因为 AJP 基本用不到,特别是Nginx 与 Tomcat 集成时(nginx 没有响应的支持 AJP ,模块,只有第三方模块支持 AJP 协议)

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    

    4) Redirect Port:重定向端口,出现在Connectot 配置中,如果该 Connector 仅支持 非 SSL 的普通的 http 请求,那么端口会把 https 的请求转发到这个 Redirect Port 指定的端口,默认为 8443;

    简单的应用部署为避免端口冲突,实际上只需要更改 SHUTDOWN 监听端口 与 Connector 链接器监听端口即可。

    5. Tomcat 部署应用的方式有哪几种?

    1) Context 描述文件部署
    Tomcat 支持通过一个独立的 Context 描述文件配置并启动Web 应用,该文件的存储路径由 Host 中 xmlBase 属性指定,若不指定,则默认 CATALINA_BASE/conf/<Engine名称>/<Host名称>对于 Tomcat 默认的就是CLATALINA_BASE/conf/Catalina/localhost,其实也就是conf/context.xml文件:Tomcat启动时即会自动部署该Web应用

    2) Web部署
    即是以目录形式发布部署 Web 应用,赋值到 Host 指定 appBase 目录下即可完成部署。

    3)WAR 包部署
    xxx.war 包解压诚睦路形式而已。

    二、多实例部署时间

    主要以 apache-tomcat-9-0-14 为例 , 下载 tar 压缩包。

    1. 部署安装 Tomcat

    在已经由JDK环境的CentOS 下解压 tomcat 包即可

    在这里插入图片描述

    解压命令如下:

    tar -zxvf apache-tomcat-9.0.14.tar.gz
    

    2. 创建多实例

    创建 tomcat-instance 存放 tomcat_1、tomcat_2 与 tomcat_bin 目录

    在这里插入图片描述

    创建tomcat_1与tomcat_2实例,将conf webapps等文件copy到实例下的命令:

    mkdir tomcat_instance tomcat_instance/tomcat_1 tomcat_instance/tomcat_2 tomcat_instance/tomcat_bin
    cd apache-tomcat-9.0.14
    mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat_1
    mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat_2
    

    3. 更改端口
    进入tomcat_1/conf 与 tomcat_2/conf 下更改 server.xml 端口的SHUTDOWN 命令监听端口与 Connector 链接器监听端口

    tomcat_1/conf/server.xml:
    在这里插入图片描述

    tomcat_2/conf/server.xml:
    在这里插入图片描述

    4.编写脚本
    创建启动、关闭脚本(也可以重启脚本),进入 tomcat_bin/ 分别创建 startup.shshutdown.sh
    在这里插入图片描述

    startup.sh的shell脚本代码如下:

    # 指定CATALINA_HOME
    export CATALINA_HOME=/home/tomcat/apache-tomcat-9.0.14
    # 通过参数的形式输入tomcat实例路径
    export CATALINA_BASE=${1%/}
    
    echo $CATALINA_BASE
    
    # 找到tomcat实例的进程ID
    TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`
    
    
    if [ -n "$TOMCAT_ID" ] ; then
    echo "tomcat(${TOMCAT_ITOMCAT_ID}) is running now , please shutdown it!";
        exit 2;
    fi
    
    TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`
    
    
    if [ "$?" = "0" ]; then
        echo "$0 ${1%/} start succeed"
    else
        echo "$0 ${1%/} start failed"
        echo $TOMCAT_START_LOG
    fi
    

    shutdown.sh的脚本代码如下:

    export CATALINA_HOME=/home/tomcat/apache-tomcat-9.0.14
    export CATALINA_BASE=${1%/}
    
    echo $CATALINA_BASE
    
    TOMCAT_ID=`ps aux |grep "java"|grep "[D]catalina.base=$CATALINA_BASE "|awk '{ print $2}'`
    
    if [ -n "$TOMCAT_ID" ] ; then
    TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
    else
      echo "Tomcat instance not found : ${1%/}"
      exit
    fi
    
    if [ "$?" = "0" ]; then
        echo "$0 ${1%/} stop succeed"
    else
        echo "$0 ${1%/} stop failed"
        echo $TOMCAT_STOP_LOG
    fi
    

    5. 部署应用

    部署应用就跟平常一样在 webapps 下部署,或者 Context.xml 描述文件映射等,我们现在为了测试,简单引入html文件到 ROOT 目录下面,启动之后分别访问 http://{ip}:8081、http://{ip}:8082

    tomcat实例1 index.jsp首页

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Tomcat 多实例测试</title>
    </head>
    <body>
       <h1>Tomcat Instance 1</h1>
    </body>
    </html>
    

    tomcat实例2 index.jsp首页

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Tomcat 多实例测试</title>
    </head>
    <body>
       <h1>Tomcat Instance 2</h1>
    </body>
    </html>
    

    6. 启动应用

    启动脚本,传入正确实例路径,启动两个 tomcat 实例。

    启动tomcat实例1
    在这里插入图片描述
    启动tomcat实例2
    在这里插入图片描述

    7. 访问应用

    访问http://{ip}:8081
    在这里插入图片描述
    访问http://{ip}:8082
    在这里插入图片描述

    展开全文
  • tomcat多实例部署

    千次阅读 2018-10-14 20:15:21
    [root@dell710 ~]# bash /usr/local/tomcat/bin/shutdown.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JR...

    关闭主站

    [root@dell710 ~]# bash /usr/local/tomcat/bin/shutdown.sh
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr/local/javaUsing CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

     

    准备多实例主目录

    [root@dell710 ~]# mkdir  /usr/local/tomcat/instance{1..3}

    制作实例工作目录

    [root@dell710 ~]# cp -r /usr/local/tomcat/{conf,logs,temp,work} /usr/local/tomcat/instance1/
    [root@dell710 ~]# cp -r /usr/local/tomcat/{conf,logs,temp,work} /usr/local/tomcat/instance2/
    [root@dell710 ~]# cp -r /usr/local/tomcat/{conf,logs,temp,work} /usr/local/tomcat/instance3/

    查看目录结构

    [root@dell710 ~]#  tree -d -L 2 /usr/local/tomcat/
    /usr/local/tomcat/
    ├── bin
    ├── conf
    │   └── Catalina
    ├── instance1
    │   ├── conf
    │   ├── logs
    │   ├── temp
    │   └── work
    ├── instance2
    │   ├── conf
    │   ├── logs
    │   ├── temp
    │   └── work
    ├── instance3
    │   ├── conf
    │   ├── logs
    │   ├── temp
    │   └── work
    ├── lib
    ├── logs
    ├── temp
    ├── webapps
    │   ├── docs
    │   ├── examples
    │   ├── host-manager
    │   ├── manager
    │   └── ROOT
    └── work
        └── Catalina
    
    29 directories

     

    修改端口

    将web配置文件拷贝三份。分别修改为不同端口

    [root@dell710 ~]# vim /usr/local/tomcat/instance1/conf/server.xml

    1)

         <!--   <Connector port="8080" protocol="HTTP/1.1"

                   connectionTimeout="20000"

                   redirectPort="8443" />        -->

     

        服务端口 8080 替换成 8081

        <Connector port="8081" protocol="HTTP/1.1"

                   connectionTimeout="20000"

                   redirectPort="8443" />

    2)

        <!-- <Server port="8005" shutdown="SHUTDOWN"> -->

        程序工作端口:8005替换成 8091

        <Server port="8091" shutdown="SHUTDOWN">

    3)

        appBase="webapps"

        网站目录:webapps 替换成 另一个目录

        appBase="/webapps"

    [root@dell710 ~]# cp /usr/local/tomcat/instance1/conf/server.xml  /usr/local/tomcat/instance2/conf/
    cp: overwrite ‘/usr/local/tomcat/instance2/conf/server.xml’? y
    [root@dell710 ~]# vim /usr/local/tomcat/instance2/conf/server.xml 

    1)

        <Connector port="8081" protocol="HTTP/1.1"  

        服务端口  替换成 8082

        <Connector port="8082" protocol="HTTP/1.1"  

    2)

        <Server port="8091" shutdown="SHUTDOWN">

        程序工作端口  替换成 8092

        <Server port="8092" shutdown="SHUTDOWN">

    [root@dell710 ~]# cp /usr/local/tomcat/instance1/conf/server.xml  /usr/local/tomcat/instance3/conf/
    cp: overwrite ‘/usr/local/tomcat/instance3/conf/server.xml’? y
    [root@dell710 ~]# vim /usr/local/tomcat/instance3/conf/server.xml

    1)

        <Connector port="8081" protocol="HTTP/1.1"  

        替换成

        <Connector port="8083" protocol="HTTP/1.1"  

    2)

        <Server port="8091" shutdown="SHUTDOWN">

        替换成

        <Server port="8093" shutdown="SHUTDOWN">

     

    启动脚本

    [root@dell710 ~]# vim /usr/local/tomcat/instance1/ins1.sh
    [root@dell710 ~]# cat /usr/local/tomcat/instance1/ins1.sh
    #!/bin/bash
    #instance1
    . /etc/init.d/functions
    export CATALINA_BASE="/usr/local/tomcat/instance1"
    
    case "$1" in
    start)
            $CATALINA_HOME/bin/startup.sh
            ;;
    stop)
            $CATALINA_HOME/bin/shutdown.sh
            ;;
    restart)
            $CATALINA_HOME/bin/shutdown.sh
            sleep 5
            $CATALINA_HOME/bin/startup.sh
            ;;
    esac
    export JAVA_OPTS='-Xms64m -Xmx128m'
    [root@dell710 ~]# cp /usr/local/tomcat/instance1/ins1.sh /usr/local/tomcat/instance2/ins2.sh
    [root@dell710 ~]# vim /usr/local/tomcat/instance2/ins2.sh
    [root@dell710 ~]# cat /usr/local/tomcat/instance2/ins2.sh
    #!/bin/bash
    #instance2              
    . /etc/init.d/functions
    export CATALINA_BASE="/usr/local/tomcat/instance2"   
    
    case "$1" in
    start)
            $CATALINA_HOME/bin/startup.sh
            ;;
    stop)
            $CATALINA_HOME/bin/shutdown.sh
            ;;
    restart)
            $CATALINA_HOME/bin/shutdown.sh
            sleep 5
            $CATALINA_HOME/bin/startup.sh
            ;;
    esac
    export JAVA_OPTS='-Xms64m -Xmx128m'
    
    [root@dell710 ~]# cp /usr/local/tomcat/instance1/ins1.sh /usr/local/tomcat/instance3/ins3.sh
    [root@dell710 ~]# vim /usr/local/tomcat/instance3/ins3.sh
    [root@dell710 ~]# cat /usr/local/tomcat/instance3/ins3.sh
    #!/bin/bash
    #instance3
    . /etc/init.d/functions
    export CATALINA_BASE="/usr/local/tomcat/instance3"
    
    case "$1" in
    start)
            $CATALINA_HOME/bin/startup.sh
            ;;
    stop)
            $CATALINA_HOME/bin/shutdown.sh
            ;;
    restart)
            $CATALINA_HOME/bin/shutdown.sh
            sleep 5
            $CATALINA_HOME/bin/startup.sh
            ;;
    esac
    export JAVA_OPTS='-Xms64m -Xmx128m'

    赋权

    [root@dell710 ~]# chmod +x /usr/local/tomcat/instance1/ins1.sh 
    [root@dell710 ~]# chmod +x /usr/local/tomcat/instance2/ins2.sh 
    [root@dell710 ~]# chmod +x /usr/local/tomcat/instance3/ins3.sh 

    网站源码

    [root@dell710 ~]# mkdir /webapps
    [root@dell710 ~]# cp -r /usr/local/tomcat/webapps/ROOT/ /webapps/
    

    启动

    [root@dell710 ~]# /usr/local/tomcat/instance1/ins1.sh start
    Using CATALINA_BASE:   /usr/local/tomcat/instance1
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/instance1/temp
    Using JRE_HOME:        /usr/local/java
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    
    [root@dell710 ~]# /usr/local/tomcat/instance2/ins2.sh start
    Using CATALINA_BASE:   /usr/local/tomcat/instance2
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/instance2/temp
    Using JRE_HOME:        /usr/local/java
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    
    [root@dell710 ~]# /usr/local/tomcat/instance3/ins3.sh start
    Using CATALINA_BASE:   /usr/local/tomcat/instance3
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/instance3/temp
    Using JRE_HOME:        /usr/local/java
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.

    测试

    [root@dell710 ~]# ss -nutpl |egrep "8081|8082|8083|8091|8092|8093"
    tcp    LISTEN     0      100      :::8081                 :::*                   users:(("java",pid=8388,fd=48))
    tcp    LISTEN     0      100      :::8082                 :::*                   users:(("java",pid=8516,fd=48))
    tcp    LISTEN     0      100      :::8083                 :::*                   users:(("java",pid=8695,fd=48))
    tcp    LISTEN     0      1      ::ffff:127.0.0.1:8091                 :::*                   users:(("java",pid=8388,fd=72))
    tcp    LISTEN     0      1      ::ffff:127.0.0.1:8092                 :::*                   users:(("java",pid=8516,fd=62))
    tcp    LISTEN     0      1      ::ffff:127.0.0.1:8093                 :::*                   users:(("java",pid=8695,fd=62))
    

    浏览器访问

    http://10.18.45.133:8081

    http://10.18.45.133:8082

    http://10.18.45.133:8083

     

     

    展开全文
  • Tomcat多实例部署

    万次阅读 2012-06-30 12:06:44
    Tomcat多实例部署  前言 一般我们使用tomcat时,如果是实例的情况都会拷贝tomcat,但实际上tomcat还可以建立类似于weblogic的domain,以实现多实例部署。 Weblogic多实例部署回顾 讲tomcat多实例部署前我们先...

    Tomcat多实例部署

     前言

    一般我们使用tomcat时,如果是多实例的情况都会拷贝多个tomcat,但实际上tomcat还可以建立类似于weblogicdomain,以实现多实例部署。

    Weblogic多实例部署回顾

    tomcat多实例部署前我们先回顾一下weblogic的多实例。以weblogic10为例,安装完weblogic后,会在c:\bea10生成weblogicHome目录,里面放置的是jdkweblogic的管理目录等:

                                 

    使用的时候我们会建立一个独立的domain,可以放置到任何目录。每个独立的domain包含自己的bin目录,在bin目录中启动domain时会设置两个环境变量,一个是weblogic home的位置,一个是domain的位置,如下:

    setDomainEnv.cmd中设置的是weblogichome的位置

     

    startWebLogic.cmd中设置的是domain的位置

     

    Weblogic建立domain时,通过自动设置了这两个参数,使得安装一个weblogic可以自动创建多个domain,并分别启动(每个domain应该设置不同的端口)。

    Tomcat多实例实现

    各种应用服务器的思路其实大同小异,下面看tomcat的多实例部署。以下我把tomcat的实例称作instance。并通过tomcat7进行讲解(tomcat5的文件夹略有不同)。总的结构如下:

     

    首先,我们建立tomcat主目录,如下:

             

    对于tomcat主目录,从apache上下载解压以后,删除复制出来binlib和根目录的文件几个。

    然后,我们建立instance。如下我在tomcat目录建立了一个主目录,然后创建了nstc-instances用于放置各种实例:

     

     

    而对于每个实例,其实需要的内容也很少,必须的是conf文件夹和里面的文件。Logstempwork创建实例时可以不设置(实例启动时会自动生成),而对于webapps目录可以在conf的文件中指定。最完整的实例如下:

     

    Startup.bat是我手动创建的

     

    对于tomcat也存在两个变量CATALINA_HOMECATALINA_BASE,其中CATALINA_HOME指定的是tomcat主目录,CATALINA_BASE指定的是instance的目录,因为CATALINA_BASE默认和主目录相同,所以一般不用单独建立instance。如上图设置了实例的目录,然后因为导航到了tomcat主目录启动,所以不需要单独设置CATALINA_HOME了。

    实际使用时webapps也可以单独设置,例如在conf\Catalina\localhost\WST.xml文件中,可以指定应用的目录就是程序编译后的目录,这样程序编译后就不用再拷贝到webapps中了。

     

    最后,注意每个实例需要设置不同的端口。

    结尾

    至此,我们非常快速的了解了如果对tomcat建立多个instance,同时我们也了解到了其实tomcat的主目录只需要binlib文件夹中的内容就可以了。

    通过对tomcat的了解,未来可以在产品中嵌入tomcat(不是使用tomcat的嵌入模式),让应用变成自启动程序。也可以通过程序控制建立多个tomcat实例。

     

     

    关注微信公众号,获取更多内容

    展开全文
  • 昨天在跟群友做技术交流的时候,了解到,有很大公司都是采用了高可用的,分布式的,实例沉余1+台。但是在小公司的同学也很,他们反映并不是所有公司都有那样的资源来供你调度。往往公司只会给你一台机器,因为...

    导读:
    昨天在跟群友做技术交流的时候,了解到,有很多大公司都是采用了高可用的,分布式的,实例沉余1+台。但是在小公司的同学也很多,他们反映并不是所有公司都有那样的资源来供你调度。往往公司只会给你一台机器,因为有些应用挂了公司也不会有损失的,我们往往一台机器就可以搞定。
    但是,我们也要为我们做出来的应用负责,毕竟东西做出来是为了给人用的,如果做出来的东西经常挂了,谈何使用,在前期,如果公司资源紧张的情况下,可以不可以做高可用,多机器的沉余部署。但是至少是在但机上有2个进程在跑。so,在这里我们就说说这个,如何做单机多实例的部署。
    在这里谈谈,在只有单机的资源下,如何把单机的资源压榨出来,用好单机。

    自家的主页: http://jbeacon.top/2016/11/19/yunwei/1/


    1、Tomcat部署的场景分析

    通常,我们对tomcat单机部署需求可以分为几种:

    • 单实例单应用 (一个tomcat 一个web应用)
    • 单实例多应用 (一个tomcat多个应用)
    • 多实例单应用 (多个tomcat都部署一个应用)
    • 多实例多应用 (多个tomcat部署多个不同的应用)

    第一种场景:这是我们开发中经常用到的,如果不要求周期性地维护tomcat版本,一般的做法是把打好的war包丢到webapps目录下,然后执行startup.sh脚本,并且可以在浏览器里访问就行了。
    第二种场景:是把多个应用程序的war包放在同一个tomcat的webapps目录,这样一来,关闭和启动tomca,或tomcat挂掉会影响所有项目。
    第三种场景: 各个tomcat都运行同一个应用程序,对应地需要修改不同的监听端口,这种方式通常会和apache httpd或者nginx整合使用,做一些负载均衡的处理。
    第四种场景: 相当于第一种场景的复数形式,除了修改不同的监听端口,没有本质区别。

    一般来说,多实例部署tomcat,可以充分利用系统资源,不过这种方式,也有几个方面需要考虑:
    多实例tomcat的更新维护,例如对tomcat进行升级等操作,我们需要考虑如何能“优雅”地对所有实例进行升级
    尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装目录隔离
    对于单应用来说,如果将war包分别置于各个tomcat的webapps目录,那么在发布新版本的war时,可能会出现某个实例更新失败,导致用户在访问时可能会访问到不同版本的web app,因此,比较好的方式就是所有tomcat实例都统一指向同一个应用程序,这样做,就可以多个tomcat用一份应用源码,简单部署,单机高可用也能实现(要配合nginx).
    本文重点阐述多实例应用的部署方案,但是为了解决上述几个问题,我们需要先来了解一下tomcat的一些基本情况。

    2、我们的目标

    tomcat架构


    3、tomcat架构

    整体架构图

    tomcat架构

    这里有一台服务器,3台tomcat服务,以及一台tomcat的解构图。

    分离目录

    目录 作用
    bin主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本
    conf主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml
    lib主要存放tomcat运行所依赖的包
    logs主要存放运行时产生的日志文件,例如catalina.{date}.log等
    temp存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件
    webapps部署web应用程序的默认目录
    work主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件)

    再介绍两个tomcat中比较重要的概念(通常也是两个系统变量)——CATALINA_HOMECATALINA_BASE

    CATALINA_HOME:即指向Tomcat安装路径的系统变量
    CATALINA_BASE:即指向活跃配置路径的系统变量通过设置这两个变量,就可以将tomcat的安装目录和工作目录分离,从而实现tomcat多实例的部署。
    Tomcat官方文档指出,CATALINA_HOME路径的路径下只需要包含bin和lib目录,这也就是支持tomcat软件运行的目录,而CATALINA_BASE设置的路径可以包括上述所有目录,不过其中bin和lib目录并不是必需的,缺省时会使用CATALINA_HOME中的bin和conf。如此,我们就可以使用一个tomcat安装目录部署多个tomcat实例,这样的好处在于方便升级,就可以在不影响tomcat实例的前提下,替换掉CATALINA_HOME指定的tomcat安装目录。

    tomcat架构

    tomcat serve.xml 配置结构
    Container容器子容器间关系图

    tomcat架构

    交互图

    tomcat架构

    对比下Tomcat serve.xml 的配置

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
              
    <? xml version = "1.0" encoding = "UTF-8" ?>
    <Server port = "8005" shutdown = "SHUTDOWN" >
    <Listener className = "org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
    <Listener className = "org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className = "org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <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"
    connectionTimeout = "20000"
    redirectPort = "8443" />
    <Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
    <Engine name = "Catalina" defaultHost = "localhost" >
    <Realm className = "org.apache.catalina.realm.LockOutRealm" >
    <Realm className = "org.apache.catalina.realm.UserDatabaseRealm"
    resourceName = "UserDatabase" />
    </Realm>
    <Host name = "localhost" appBase = "webapps"
    unpackWARs = "true" autoDeploy = "true" >
    <Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs"
    prefix = "localhost_access_log" suffix = ".txt"
    pattern = "%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
    </Engine>
    </Service>
    </Server>


    4、实战

    端口配置

    修改server.xml

    在server.xml中配置了四个监听端口,分别是:
    Server Port:该端口用于监听关闭tomcat的shutdown命令,默认为8005.
    Connector Port:该端口用于监听HTTP的请求,默认为8080.
    AJP Port:该端口用于监听AJP( Apache JServ Protocol )协议上的请求,通常用于整合Apache Server等其他HTTP服务器,默认为8009
    Redirect Port:重定向端口,出现在Connector配置中,如果该Connector仅支持非SSL的普通http请求,那么该端口会把https的请求转发到这个Redirect Port指定的端口,默认为8443

    虚拟主机配置
    再来说Host配置,Host就是所谓的虚拟主机,对应包含了一个或者多个web应用程序,默认的Host配置如下

              
    1
              
    <Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" >

    其中:
    name: 虚拟主机的名称,一台主机表示了完全限定的域名或IP地址,默认为localhost,同时也是唯一的host,进入tomcat的所有http请求都会映射到该主机上
    appBase:web应用程序目录的路径,可以是CATALINA_HOME的相对路径,也可以写成绝对路径,默认情况下为$CATALINA_HOME/webappsunpackWARs: 表示是否自动解压war包
    autoDeploy:所谓的热部署,即在tomcat正在运行的情况下,如果有新的war加入,则会立即执行部署操作
    另外再介绍一个Host中的属性—deployOnStartup:表示tomcat启动时是否自动部署appBase目录下所有的Web应用程序,默认为true。这个属性和autoDeploy会产生两次部署的“副作用”:一次是tomcat启动时就开始部署,第二次就是autoDeploy引起的热部署。因此最好将autoDeploy置为false
    在部署多实例单应用的时候,默认的$CATALINA/webapps会因为tomcat安装目录升级产生不必要的麻烦,我们考虑将appBase的目录统一到另外的路径下。

    Context的配置
    最后再说明一下Context的配置,它出现在Host配置内,一个Context的配置就代表了一个web应用程序,如果配置多应用程序,就需要在Host下配置多个Context,一个简单的Context配置如下

              
    1
              
    <Context path = "/some" docBase = "someapp.war" >

    path:表示访问入口,例如,path=”/abc”,则访问localhost:8080/abc时,就可以访问该Context对应的应用程序。如果path=””,则直接用localhost:8080就可以访问
    docBase:表示应用程序的解包目录或者war文件路径,是Host的appBase配置目录的相对路径,也可以是直接写成绝对路径,但是不要将appBase的值,作为docBase配置路径的前缀,例如appBase=”somedir”,docBase=”somedir-someapp.war”,这样的配置会导致部署错误
    通过配置Host的appBase和Context的docBase两个属性,可以将应用程序的文件和tomcat相关的目录进行分离,这样webapps目录也就没有作用了。

    跟我来实施该方案

    • 现在假设我们有一台已经配置好Java环境的服务器:(我用的是阿里云)
    • 我已经有一个已经完成的shop.war 应用程序

    步骤1:
    下载并解压tomcat

    tomcat架构

    步骤2:
    对Tomcat目录作以下调整:
    在tomcat安装目录下创建a.ttlsa.com、b.ttlsa.com,并且将conf、logs、webapp、temp、work目录拷贝到这两个目录,然后tomcat安装目录只需要留下bin、a.ttlsa.com、b.ttlsa.com、lib这4个目录即可。配置后的目录结构如下:

    tomcat架构

    如果要度tomcat 进行升级,我们只是需要对tomcat的lib 和 bin 目录进行升级即可。

    步骤3:
    配置站点server.xml
    配置a.ttlsa.com 

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
              
    <? xml version = "1.0" encoding = "UTF-8" ?>
    <!-- 8005 改为8005 -->
    <Server port = "8005" shutdown = "SHUTDOWN" >
    <Listener className = "org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
    <Listener className = "org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className = "org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <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 = "8081" protocol = "HTTP/1.1"
    connectionTimeout = "20000"
    redirectPort = "8443" />
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
    <Engine name = "Catalina" defaultHost = "localhost" >
    <Realm className = "org.apache.catalina.realm.LockOutRealm" >
    <Realm className = "org.apache.catalina.realm.UserDatabaseRealm"
    resourceName = "UserDatabase" />
    </Realm>
    <!--
    <Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
    -->
    <Host name = "localhost" appBase = "F:\data\www\a.ttlsa.com"
    unpackWARs = "true" autoDeploy = "true"
    xmlValidation = "false" xmlNamespaceAware = "false" >
    <Context path = "" docBase = "" reloadable = "true" >
    <valve className = "org.apache.catalina.valves.RemoteAddrValve" />
    </Context>
    </Host>
    </Engine>
    </Service>
    </Server>

    配置b.ttlsa.com

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
              
    <? xml version = "1.0" encoding = "UTF-8" ?>
    <!-- 8005 改为8006 -->
    <Server port = "8002" shutdown = "SHUTDOWN" >
    <Listener className = "org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
    <Listener className = "org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className = "org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <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 = "8082" protocol = "HTTP/1.1"
    connectionTimeout = "20000"
    redirectPort = "8443" />
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
    <Engine name = "Catalina" defaultHost = "localhost" >
    <Realm className = "org.apache.catalina.realm.LockOutRealm" >
    <Realm className = "org.apache.catalina.realm.UserDatabaseRealm"
    resourceName = "UserDatabase" />
    </Realm>
    <!--
    <Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
    -->
    <Host name = "localhost" appBase = "F:\data\www\a.ttlsa.com"
    unpackWARs = "true" autoDeploy = "true"
    xmlValidation = "false" xmlNamespaceAware = "false" >
    <Context path = "" docBase = "" reloadable = "true" >
    <valve className = "org.apache.catalina.valves.RemoteAddrValve" />
    </Context>
    </Host>
    </Engine>
    </Service>
    </Server>

    创建多实例启动脚本

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
              
    # description: 启动tomcat多实例.#
    . /etc/init.d/functions
    RETVAL=$?
    # tomcat实例目录
    export CATALINA_BASE="$PWD"
    # tomcat安装目录
    export CATALINA_HOME="/usr/local/tomcat-7.0.50"
    # 可选
    export JVM_OPTIONS="-Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"
    case "$1" in
    start)
    if [ -f $CATALINA_HOME/bin/startup.sh ];then
    echo $"Start Tomcat"
    $CATALINA_HOME/bin/startup.sh
    fi
    ;;
    stop)
    if [ -f $CATALINA_HOME/bin/shutdown.sh ];then
    echo $"Stop Tomcat"
    $CATALINA_HOME/bin/shutdown.sh
    fi
    ;;
    *)
    echo $"Usage: $0 {start|stop}"
    exit 1
    ;;
    esac
    exit $RETVAL

    这段shell 脚本比较简单,主要是设置环境变量,接受命令参数 RETVAL=?RETVAL=start/stopexportCATALINABASE=?,来执行不同的命令。RETVAL=start/stop等exportCATALINABASE=”PWD” 表示设置当前路径为 CATALINA_BASE 的环境变量,一般情况下CATALINA_BASE 和 CATALINA_HOME 是默认一样的。

    启动脚本赋权限

              
    1
              
    # chmod a+x tomcat.sh

    5、启动测试

    启动/关闭a.ttlsa.com

              
    1
    2
    3
    4
    5
    6
              
    启动
    # cd /usr/local/tomcat-7.0.50/a.ttlsa.com/
    # ./tomcat.sh start
    关闭
    # cd /usr/local/tomcat-7.0.50/a.ttlsa.com/
    # ./tomcat.sh stop

    启动/关闭b.ttlsa.com

              
    1
    2
    3
    4
    5
    6
              
    启动
    # cd /usr/local/tomcat-7.0.50/a.ttlsa.com/
    # ./tomcat.sh start
    关闭
    # cd /usr/local/tomcat-7.0.50/a.ttlsa.com/
    # ./tomcat.sh stop

    备注:一定需要cd到tomcat.sh的当前目录下执行才可以

    在win7 下,需要创建在a.ttlsa.com 和b.ttlsa.com下面创建 startup.bat 来启动

              
    1
    2
    3
    4
    5
    6
              
    @echo off
    set JAVA_HOME = D : \Program Files \Java\jdk1 . 8.0 _112
    set PATH =% JAVA_HOME % \b in ;% PATH %
    set CATALINA_BASE =% CD %
    cd E : \tomcat - 8.5 . 6 \bin
    catalina . bat start

    这段是在win7 下云的bat脚本,于shell脚本同理,set CATALINA_BASE=%CD% 也是设置环境变量,CD 可以获取当前的路径。

    shell 脚本入门参考:http://sishuok.com/forum/blogPost/list/5655.html

    6、结果

    单个Tomcat应用多个tomcat实例的配置到此,就结束了。
    此外,我们在这里的基础上进行系统的扩展,比如如果我的Tomcat应用挂掉了,我的整个应用都将不可用了,我们应该如何处理?
    我们可以把Tomcat复制多份,在单机的情况下,开多一个Tomcat进程,在配合Nginx 来配置,就能实现Tomcat的自动切换,这些内容,有空再写。

    如果需要操作多个实例显得比较麻烦,大家可以自行写统一的脚本。

    tomcat架构

    tomcat架构

    Linux 下的实现基本一致。

    这样的好处是,显而易见的,这样能开启Tomcat的多个进程,即多台tomcat,挂了也不太怕,还有其他tomcat应用支撑,代码实例我们发版本的时候,只需要发布一份,实例代码易于维护。
    但是,我们网站的域名和端口一般是同一采用80端口,统一的域名,而现在我们开启tomcat只能一个使用80端口,显然是不合适的·,为此我们会引入负载均衡的nginx来配置。
    nginx 采用80 端口,tomcat分别采用8080, 8081, 8082 这样就能让我们的程序稳定的运行。
    这样,我们就能进最大的限度来压榨单机的性能,保证应用程序的稳定的运行。
    而然,单机不然有单机的瓶颈,毕竟单机中的cpu 已经各种硬件的限制,会大大影响实例程序的跑动,在这时,就不再是单机能抗的动的了,我们需要分析程序的瓶颈在那?数据库,那就把数据库单独分出去,单独一台机器,是文件图片服务器,就把他分出去。如果是应用程序太大,就要考虑把应用实例进行拆解为不同哦那个的组件,单独部署,这就是分布式部署。
    当然,这都是后话,只有程序复杂到一定的程度,并体量很大的话,才会做这种架构的演变,成本和技术投入的难度也会相应的变大。
    本章,只局限于如何玩好单机的基础上来讨论,对于分布式的那块,笔者能力有限,尚且还不能完全驾驭,不做分享。

    7、nginx+tomcat热备

    在上面的配置的基础上,我们在进一步进行扩展,进行实例的均衡和热备。
    可以在一个服务器挂了的情况下连到另外一个,那怎么弄呢?
    其实很简单,在upstream中的local_tomcat中配置多一个server。
    在上面,我的a.ttlsa.com 和 b.ttlsa.com 都是访问 F:\data\www\a.ttlsa.com 下的源码的index.jsp 页面,
    为了能观察,nginx 的keepAlive 的效果,我做一下修改:
    a.ttlsa.com —> F:\data\www\a.ttlsa.com index.jsp 中文字是 1
    b.ttlsa.com —> F:\data\www\b.ttlsa.com index.jsp 中文字是 2

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
              
    upstream local_tomcat {
    server localhost : 8081 weight = 1 ;
    server localhost : 8082 weight = 5 ;
    }
    server {
    listen 80 ;
    server_name localhost : 8081 ;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    #location / {
    # root html;
    # index index.html index.htm;
    #}
    location / {
    proxy_pass http://local_tomcat;
    }

    tomcat架构

    在通常的情况下,我们一般是指向一份源码就足够了,并且设置权值,减轻应用的压力。同时也不会出现单点的情况。

    补充:nginx.con 配置

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
              
    #user nobody;
    worker_processes 1;
    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    #tcp_nopush on;
    #keepalive_timeout 0;
    keepalive_timeout 65;
    #gzip on;
    upstream local_tomcat {
    server localhost:8081 weight=1;
    server localhost:8082 weight=5;
    }
    server {
    listen 80;
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    #location / {
    # root html;
    # index index.html index.htm;
    #}
    location / {
    proxy_pass http://local_tomcat;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }

    综上:我们做到了多台tomcat 但是我们也能做到tomcat的简单升级,并且实现实例的负载均衡,已经应用的主备,在也不用担心应用挂掉而睡不了觉了。
    缺点:nginx依然存在单点的问题。

    本次的实验资源供下载:http://download.csdn.net/detail/a82793510/9687715

    经验之谈

    如果是在资源有限的情况下,已经选择了单机,证明不是有钱荏,我一般会把上面的权去掉,在这样我们就可以在一台tomcat应用服务器挂掉的情况下,才会访问备机Tomcat应用服务器。
    如果只是应用的情况下,这样已经足够了。用基于IP分发的策略已经能解决绝大部分需求。

    资源进一步极端化

    现在,我们在这台单机上已经部署了一个应用app1, 假设现在我司实在是资源太紧缺了,我们又要在这台机子上,部署另外一个应用app2。
    那么现在我们就要对Nginx 和 Tomcat 进行改动。
    改动一般分为2种方法:2级域名改动 或 2级目录改动。
    先来在上面的基础上说说二级目录改动:
    按照我们上面的,我们的目标的架构:我们已经部署了一个应用程序:some.war ,现在我要采用二级目录方式部署另外的一个应用程序:app.war。
    那么我会在上面的基础上做如下的修改:localhost 可以修改为自己的域名。

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
              
    <Host name = "localhost/some" appBase = "F:\data\www\a.ttlsa.com"
    unpackWARs = "true" autoDeploy = "true"
    xmlValidation = "false" xmlNamespaceAware = "false" >
    <Context path = "" docBase = "" reloadable = "true" >
    <valve className = "org.apache.catalina.valves.RemoteAddrValve" />
    </Context>
    </Host>
    <Host name = "localhost/app" appBase = "F:\data\www\b.ttlsa.com"
    unpackWARs = "true" autoDeploy = "true"
    xmlValidation = "false" xmlNamespaceAware = "false" >
    <Context path = "" docBase = "" reloadable = "true" >
    <valve className = "org.apache.catalina.valves.RemoteAddrValve" />
    </Context>
    </Host>

    另外的一台的service.xml 也同样如此配置。
    nginx中的localhost 可以修改为自己的域名 如 mp.hello.io

              
    1
    2
    3
    4
    5
              
    server {
    listen 80 ;
    server_name localhost ; // 可以修改为自己的域名
    }

    二级域名的改动,
    前提:我们有一个顶级域名:如 hello.io 这样的一个顶级域名:
    那么,我们现在可以这样做:
    现在万网中配置一下我们的二级域名,如som.hello.io和app.hello.io 都要在万网中指向我们的服务器Ip 地址。
    在增加二级域名的情况下,我们可以新增2个是实例。
    把Nginx修改为这样的配置:

              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
              
    #user nobody;
    worker_processes 1;
    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    #tcp_nopush on;
    #keepalive_timeout 0;
    keepalive_timeout 65;
    #gzip on;
    upstream local_tomcat01 {
    server localhost:8081;
    server localhost:8082;
    }
    upstream local_tomcat02 {
    server localhost:8083;
    server localhost:8084;
    }
    server {
    listen 80;
    server_name some.hello.io;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    #location / {
    # root html;
    # index index.html index.htm;
    #}
    location / {
    proxy_pass http://local_tomcat02;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    server {
    listen 80;
    server_name app.hello.io;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    #location / {
    # root html;
    # index index.html index.htm;
    #}
    location / {
    proxy_pass http://local_tomcat02;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }

    此外,修改一下,Tomcat 的端口就可以了,同时80 81, 指向一个实例,83 84 指向另外一个实例(appBase中指定)。这样就可以做到程序的主备操作。

    备注:service_name 的名称可以是ip 地址。
    nginx在配置upstream时,有两个参数:
    ip_hash(同一IP一直使用同一台server服务)
    weight(server的使用权重,数值越大,nginx分发的请求越多)

    通过配合这两个参数,能粗糙地解决session共享的问题。
    对于一些不是太依赖session的应用,或者只有用户登录时保存,那么我认为可以用Cookies代替。
    即使真的要Session共享,我认为手动写代码保存到Memcached比为Tomcat加插件好,这样能获得更好的可控性。
    而且我不用Tomcat,用Redis,这个msm就用不上啦,不过我会按照我的思想实现session共享,呵呵,个人愚见!

    tomcat架构

    最后我们的架构是这样的。在这样的解构下,我们无论是修改为 二级目录 亦或是二级域名,我们运维都只是要做很小的改动就能切换。配置和源码分离的结构,对我们以后的扩展为分布式应用,还是依然是单机的传统结构都是进可以攻退以守。
    留有余地,唯一不足就是nginx的单点问题,不过就单机体系来说已经够用了。

    集群

    上面不架构已经是属于在单机上做了一个简单的集群了,要实现Tomcat。
    要多台机器,只要修改上面Nginx的分发的Ip 就可,但是会话共享是一个很大的问题,但是,用基于IP分发的策略已经能解决绝大部分需求。
    这里已经脱离了我们单机应用的主题,以后有机会探讨。


    参考文章:
    http://www.cnblogs.com/tq03/p/3507658.html
    http://www.itnose.net/detail/6658488.html
    http://www.ttlsa.com/tomcat/config-multi-tomcat-instance/
    http://www.cnblogs.com/_popc/p/4167516.html
    http://www.itnose.net/detail/6485584.html
    http://www.itnose.net/detail/6521677.html
    http://www.itnose.net/detail/6448554.html
    http://www.aikaiyuan.com/7907.html
    http://blog.csdn.net/cclovett/article/details/26377269 (nginx)
    http://www.roncoo.com/article/detail/125185

    展开全文
  • Linux下tomcat多实例配置成功。步骤如下:  1. 下载一个免安装版本的tomcat,例如:apache-tomcat-7.0.59.tar.gz。解压:tar xvf pache-tomcat-7.0.59.tar.gz.  解压后的文件夹中大致有7个文件夹:  bin (运行...
  • 当我们在一台服务器上想要部署多Tomcat 实例时,在不了解 Tomcat 的相关参数时,我们通常会下载多份 Tomcat 来安装使用,而实际情况下,多个 Tomcat 实例可以共用同一个安装目录,现在就让我们来看看 Tomcat 多...
  • # Tomcat 多实例部署 教程

    千次阅读 2016-06-13 13:59:17
    Tomcat 多实例部署 教程我们首先看到的是tomcat的目录结构,其每个文件夹有以下用途:bin – 包含所有运行tomcat的二进制和脚本文件 lib – 包含tomcat使用的所有共享库 conf - 包含配置信息,如tomcat绑定的端口...
  • tomcat 多实例部署

    千次阅读 2015-11-24 22:06:08
    如何以Tomcat实例方式部署多个项目,以下以实例讲解: 情景:在linux系统部署两个项目video和navigator。 步骤: 1.新建目录:/home/hm/apps/ 2.tomcat安装包apache-tomcat-8.0.26.tar.gz解压缩到目录/home/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,762
精华内容 25,504
关键字:

tomcat多实例部署