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%nlog4j.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
- 把 war 包拷贝到虚拟主机配 置中 appBase 属性所指定的目录, 比如 webapps/www.jxphone.com, 如果要部署到根目录("/"), 则命名为 ROOT.war, 如果要部署到 /api 目录, 则命名为 api.war, 如果要部署到深层次目录, 比如 /api/v1 目录, 则命名为 api#v1.war
- 停止 tomcat 服务
- 删除war包对应的已经展开的目录, 只保留 war 包
- 如 果需要配置 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)
- 编辑 api.xml, 修改里边的相关参数
- 如果 api.xml 有保密数据,比如数据库密码, 则关掉 api.xml 的所有用户可读权限, 比如 "chmod 640 api.xml"
- 重启 tomcat 服务
参考文献:
- Apache Tomcat Configuration Reference: Environment Entries, Resource Definitions
- JNDI Datasource HOW-TO
tomcat 部署指南的更多相关文章
- Tomcat权威指南(第二版)下载pdf 高清完整中文版-百度云下载
本书是一本万能工具,其主题涵盖了Apache Tomcat这一广受欢迎的开源servlet.JSP容器和高性能的web server. <Tomcat权威指南>对管理员和web站点管理员而 ...
- Tomcat部署web项目,如何直接通过域名访问,不加项目名称
问题:下面的问题是互联网上问得比较多的,但是显然都是同一个问题. JavaWeb项目部署到tomcat服务之后设置不需要输入项目名称即可访问? Tomcat部署web项目,如何直接通过域名访问,不加项 ...
- Tomcat部署web应用程序
对Tomcat部署web应用的方式总结,常见的有以下四种: 1.[替换ROOT目录] 最简单的一种方法,webapps目录下面ROOT文件夹的文件为你的文件,然后输入localhost:8080/首页 ...
- 如何制定tomcat部署时自己定义的docBase路径
装了tomcat后发现tomcat安装在系统跟路径地下,每次部署的时候挺麻烦的,于是想指定一个自己定义的应用部署的路径: 以下是如何指定,相关文档请查看https://tomcat.apache.or ...
- Tomcat部署方式
tomcat中三种部署项目的方法 第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: <Context path="/he ...
- Tomcat 部署
<CATALINA_HOME>/webapps: Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录. 1.war包部署: 将需要发布的web应用打成war文件, ( ...
- tomcat部署方法总结
可以参考之前的:http://www.cnblogs.com/youxin/archive/2013/01/18/2865814.html 在Tomcat中部署Java Web应用程序有两种方式:静态 ...
- 解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题
解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题 在web.xml中添加如 ...
- (转) Tomcat部署Web应用方法总结
原文:http://blog.csdn.net/yangxueyong/article/details/6130065 Tomcat部署Web应用方法总结 分类: Java web2011-01-11 ...
随机推荐
- (转)SSL工作原理
转:https://www.cnblogs.com/bhlsheji/p/4586597.html 挑 希望:SSL使用数据加密.身份验证和消息完整性验证机制,基于TCP和其他的应用层协议提供可 ...
- day03-Python基础
1:函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 函数定义: def sayh ...
- Ubuntu中几个字符小玩意儿
1.黑客帝国特效: 打开终端,输入 sudo apt install cmatrix 即可.安装完成后,在终端输入 cmatrix 即可出现特效. 2.奔跑的小火车: 终端输入:sudo apt in ...
- sql数据库收缩
回收步骤: 1.查看日志文件大小[一般回收比较大的] --适用于RDS For SQL Server2012\2016 SELECT DB_NAME(database_id) AS [Database ...
- SpringBoot 切换国际化
git:https://github.com/xiaozhuanfeng/demoProj 代码结构: application.properties: spring.messages.basename ...
- iView 实战系列教程(21课时)_1.iView 实战教程之配置篇_图片优化
首先需要安装vue cli 3.0版本 点击添加插件, 输入iview 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动 ...
- usb接口类型 简单分类辨识
usb接口类型 简单分类辨识 - [相似百科] 庆欣 0.0 4 人赞同了该文章 1. 先放图,随着越来越多的接触智能设备,会遇到各种各样的usb接口,对于很多人来说,接口类型只有:usb接口,安卓接 ...
- 孩子王app自动签到送现金券
今天在某商场的孩子王店给小孩买东西时发现,app连续签到3天即可获得一张5元现金券. 回到家中,花几分钟Fiddler抓包分析写了个自动签到的代码. var cookies = new string[ ...
- Mac基本配置
相关操作 配置文件 java 下载jdk-12.0.1_osx-x64_bin.dmg 配置环境变量 #配置java JAVA_HOME=/Library/Java/JavaVirtualMachin ...
- python函数及调用
python的函数是一段重复多次可调用的代码,依据python的函数,我们可以利用函数式的编程,来减少代码的重复. 在本章节中,详细的介绍python的函数,以及python的函数式编程的与众不同,函 ...