• tomcat 部署指南


    下载与安装

    • 个人建议不要使用发行版带的版本, 始终从主页来下载安装, 下载地址位于[1], 安装方法很简单, 直接解压即可, 建议解压到 /usr/local/ 目录, 再链接到 /usr/local/tomcat 目录
    • 创建目录 /data/apps/tomcat, 删除 $TOMCAT_HOME/webapps, 将 /data/apps/tomcat 软链接到 $TOMCAT_HOME/webapps
    • 创建目录 /data/logs/tomcat,  删除 $TOMCAT_HOME/logs, 将 /data/logs/tomcat 软链接到 $TOMCAT_HOME/logs
    • 如果 tomcat 无须监听 80 端口, 那么就没有必要使用 root 权限来跑, 那么就需要建立 tomcat 用户和 tomcat 用户组(tomcat 用户属于 tomcat 用户组), 再把 /usr/local/tomcat 下的文件owner 改为 tomcat.
    • 安装后的目录结构如[2]所示。

    [1] http://tomcat.apache.org/download-60.cgi

    [2] 目录结构示意图

    /usr/local
    |-- apache-tomcat-6.0.24
    |   |-- LICENSE
    |   |-- NOTICE
    |   |-- RELEASE-NOTES
    |   |-- RUNNING.txt
    |   |-- bin
    |   |-- conf
    |   |-- lib
    |   |-- logs -> /data/logs/tomcat
    |   |-- temp
    |   |-- webapps -> /data/apps/tomcat
    |   `-- work
    `-- tomcat -> apache-tomcat-6.0.24/

    配置

    基础配置

    一般安装后需要调整如下的几个文件:

    • conf/server.xml: 主要是调整端口, URI 编码, 自动部署, 访问日志配置
      需要修改的部分已在下面红色的部分标明, 自动部署会带来一些麻烦, 比如 "OutOfMemoryError: PermGen Space", 访问日志部分(AccessLogValve)本来就在文件中, 不过被注释了, 去掉注释就可以了
    <Connector URIEncoding="UTF-8" port="80" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" />
    ...
    <Engine ...>
      <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="false"
                xmlValidation="false" xmlNamespaceAware="false">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
      </Host>
    </Engine>
    • bin/setenv.sh
      需要创建该文件,加入一些环境配置(比如修改内存设置), 如下所示
      CATALINA_OPTS="-XX:MaxPermSize=256M"

    虚拟主机

    虚拟主机也是在 server.xml 中配置, 范例如下

    <Engine name="Catalina" defaultHost="www.jxphone.com">
    ...
        <Host name="www.jxphone.com"                 
            appBase="webapps/www.jxphone.com"
            unpackWARs="true" autoDeploy="false"
            xmlValidation="false" xmlNamespaceAware="false">
            <Alias>jxphone.com</Alias>
            <Valve className="org.apache.catalina.valves.AccessLogValve" 
                directory="logs"  prefix="www.jxphone.com_access_log." 
                suffix=".txt" pattern="common" resolveHosts="false"/>
        </Host>
        <Host name="bar.jxphone.com"  
            appBase="webapps/bar.jxphone.com"
            unpackWARs="true" autoDeploy="false"
            xmlValidation="false" xmlNamespaceAware="false">
            <Valve className="org.apache.catalina.valves.AccessLogValve" 
                directory="logs"  prefix="bar.jxphone.com_access_log." 
                suffix=".txt" pattern="common" resolveHosts="false"/>        </Host>
    </Engine>

    每个虚拟主机用一个 <Host/> 来配置, 其中 <Alias/> 是虚拟主机的别名, 可以有多个, Engine  的 defaultHost 属性表示使用 ip 地址直接访问时使用哪个主机, 也可以不设置 defaultHost 属性。

    https


    首先是要生成 keystore, 生成过程另文叙述, 然后把 keystore 拷贝到 conf 目录, 修改 server.xml 如下所示

    <Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="443" />
    <Connector URIEncoding="UTF-8" port="443" protocol="HTTP/1.1" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" keystoreFile="conf/keystore" keystorePass="changeit" keyAlias="tomcat"/>
    <Connector URIEncoding="UTF-8" port="8009" protocol="AJP/1.3" redirectPort="443" />

    PS. https 没有虚拟主机的概念, 所有的虚拟主机必须共享同一份 https 配置, 因为 https 协商加密在前, 传入 Host 参数在后。


    apache


    如果需要把 java 的网站和 php 的网站联合部署在同一台机器上,则一般使用 apache 作为前端, 用 mod_jk 连接 tomcat

    • 首先需要安装 libapache2-mod-jk, 并在 apache 中激活, (Debian 下直接使用 "sudo apt-get install libapache2-mod-jk; sudo a2enmod jk" 即可, 其他系统还未试过)
    • 在 $TOMCAT_HOME/conf/server.xml 中修改 AJP connector 的配置: "<Connector URIEncoding="UTF-8" port="8009" protocol="AJP/1.3" redirectPort="443" />", 注意 URIEncoding 一定记得加, redirectPort 是指转向 https 时所用的端口
    • 配置 /etc/libapache2-mod-jk/workers.properties, 根据注释填入全部数据即可
    • 新建文件 /etc/apache2/sites-available/tomcat, 输入如下的内容
    <VirtualHost *>
        ServerName www.jxphone.com
        JkMount /* ajp13_worker
    </VirtualHost>
    <VirtualHost *>
        ServerName bar.jxphone.com
        JkMount /* ajp13_worker
    </VirtualHost>
    • 重启 apache (或者重新加载 apache 配置)即可

    另: apache 的访问日志比 tomcat 自带的好用, 如果全部使用 mod_jk 来访问, 那么可以去掉 server.xml 中AccessLogValve相关的配置, 缺省日志位置在 /var/log/apache2/other_vhosts_access.log

    日志

    tomcat 运行在安全模式下时,  能只读 war 包里面的文件, 能读写 workDir 里面的文件, 其他文件就需要在 $TOMCAT_HOME/conf/catalina.policy 里面申请

    简单的应用日志直接输送到终端即可, 比如按如下文件来配置 log4j.properties

    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=www.jxphone.com: %d{ABSOLUTE} %5p %c:%L - %m%n

    log4j.rootLogger=info, CONSOLE

    在 ConversionPattern 中加入一个前缀, 方便分离日志。

    日志的缺省位置在 $TOMCAT_HOME/logs/catalina.out

    复杂的应用仍需要使用独立的日志的系统

    自动启动

    将如下的文件放到 /etc/init.d/tomcat, 并链接到 /etc/rc2.d/S80tomcat

    #!/bin/sh

    TOMCAT_HOME=/usr/local/tomcat

    case "$1" in
    start)
        echo $"Starting Tomcat"
        /bin/su tomcat $TOMCAT_HOME/bin/startup.sh
        ;;
    stop)
        echo $"Stopping Tomcat"

        /bin/su tomcat $TOMCAT_HOME/bin/catalina.sh stop
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "usage: $0 (start|stop|restart|help)"
    esac

    监控

    • 修改 $TOMCAT_HOME/bin/setenv.sh, 加入如下一行
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9012 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    • 建立 $HOME/projects/utils/build.xml, 如下所示
    <project name="Catalina Ant JMX" 
            xmlns:jmx="antlib:org.apache.catalina.ant.jmx" 
            default="state"
            basedir=".">
        <property name="jmx.server.name" value="localhost" />
        <property name="jmx.server.port" value="9012" />
        <property name="k1" value="machine-auth-51"/>
        <property name="k2" value="tomcat"/>
        <property name="k3" value="TODO"/>
        <tstamp>
        <format property="t" pattern="yyyy-MM-dd'T'HH:mm:ss"/>
        </tstamp>

        <target name="spdc">
        <echo>http://moshop.stat.jxphone.com/spdc/?param=s=0400000002|k1=${k1}|k2=${k2}|k3=${k3}|t=${t}|d=${d}"</echo>
        <get src="http://moshop.stat.jxphone.com/spdc/?param=s=0400000002|k1=${k1}|k2=${k2}|k3=${k3}|t=${t}|d=${d}" dest="stat.response"/>
        </target>
     
        <target name="state" description="Show JMX Cluster state">
            <jmx:open
                host="${jmx.server.name}"
                port="${jmx.server.port}"
                username="controlRole"
                password="tomcat"/>
           <jmx:get
                name="java.lang:type=Memory" 
                attribute="HeapMemoryUsage"
                resultproperty="HeapMemoryUsage"
                echo="true"
            />
           <jmx:get
                name="java.lang:type=Memory" 
                attribute="NonHeapMemoryUsage"
                resultproperty="NonHeapMemoryUsage"
                echo="true"
            />
        <jmx:get
            name="java.lang:type=OperatingSystem"
            attribute="OpenFileDescriptorCount"
            resultproperty="OpenFileDescriptorCount"
            echo="true"/>
        <jmx:get
            name="java.lang:type=OperatingSystem"
            attribute="MaxFileDescriptorCount"
            resultproperty="MaxFileDescriptorCount"
            echo="true"/>
        <antcall target="spdc">
            <param name="k3" value="HeapMemoryUsage.used"/>
            <param name="d" value="${HeapMemoryUsage.used}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="HeapMemoryUsage.commited"/>
            <param name="d" value="${HeapMemoryUsage.committed}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="HeapMemoryUsage.max"/>
            <param name="d" value="${HeapMemoryUsage.max}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="NonHeapMemoryUsage.used"/>
            <param name="d" value="${NonHeapMemoryUsage.used}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="NonHeapMemoryUsage.commited"/>
            <param name="d" value="${NonHeapMemoryUsage.committed}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="NonHeapMemoryUsage.max"/>
            <param name="d" value="${NonHeapMemoryUsage.max}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="OpenFileDescriptorCount"/>
            <param name="d" value="${OpenFileDescriptorCount}"/>
        </antcall>
        <antcall target="spdc">
            <param name="k3" value="MaxFileDescriptorCount"/>
            <param name="d" value="${MaxFileDescriptorCount}"/>
        </antcall>
        </target>
     
    </project>
    • 运行 crontab -e, 加入如下两行
    ANT_HOME=/usr/local/share/ant
    55 23 * * * $ANT_HOME/bin/ant -f $HOME/projects/utils/build.xml >> $HOME/cron.log

    部署

    部署 war 包, 以及配置 context.xml

    1. 把 war 包拷贝到虚拟主机配 置中 appBase 属性所指定的目录, 比如 webapps/www.jxphone.com, 如果要部署到根目录("/"), 则命名为 ROOT.war, 如果要部署到 /api 目录, 则命名为 api.war, 如果要部署到深层次目录, 比如 /api/v1 目录, 则命名为 api#v1.war
    2. 停止 tomcat 服务
    3. 删除war包对应的已经展开的目录, 只保留 war 包
    4. 如 果需要配置 context.xml, 则把 war 包里面的 META-INF/context.xml 拷贝到配置目录的对应位置, 比如 www.jxphone.com 的 api.war 的对应位置为 conf/Catalina/www.jxphone.com/api.xml (其中 Catalina 为 Engine 的名字, www.jxphone.com 为 Host 的名字, api.xml 的名字与 war 包的名字对应 (比如根目录用 ROOT.xml, /api/v1 目录用 api#v1.war)
    5. 编辑 api.xml, 修改里边的相关参数
    6. 如果 api.xml 有保密数据,比如数据库密码, 则关掉 api.xml 的所有用户可读权限, 比如 "chmod 640 api.xml"
    7. 重启 tomcat 服务


    参考文献:

      1. Apache Tomcat Configuration Reference: Environment EntriesResource Definitions
      2. JNDI Datasource HOW-TO
  • 相关阅读:
    CSS 动画示例
    CSS3 学习过程中还需要再次重点的
    CSS3 transform
    CSS 用before和after伪类选择器制作阴影
    CSS 制作的导航菜单
    Iconfont-阿里巴巴矢量库下载的字体
    HTML 5 <meta> 标签
    采购订单暂存和持有相关的问题?
    JS 基础
    LaTeX+TexStudio安装与使用
  • 原文地址:https://www.cnblogs.com/L-H-R-X-hehe/p/3827325.html
Copyright © 2020-2023  润新知