Tomcat
1. tomcat单机多实例部署
单Tomcat部署多实例有以下优点:
- 所有项目只应用单一Tomcat,对于项目启动、Tomcat升级可一次性解决,不需要更改过多配置
- 单一Tomcat日志存储不再是问题,可统一跟踪及处理
- 多实例无依赖,可做到单实例下线或维护,不影响其它实例运行,方便管理
- 对多实例间单例不会造成任何影响
- 可实现自定义单一实例热加载热部署,不会对其它实例造成影响
这里需要说明的两个变量CATALINA_HOME、CATALINA_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安装目录。
在/etc/profile最后加入CATALINA_HOME环境变量
export CATALINA_HOME=/home/q/tomcat
将tomcat主目录的conf、logs、webapp、temp、work目录拷贝到新的目录下作为一份新的tomcat实例,注意修改conf/server.xml文件中的各个端口号防止端口占用问题
| 目录 | 作用 |
|---|---|
| bin | 主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本 |
| conf | 主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml |
| lib | 主要存放tomcat运行所依赖的包 |
| logs | 主要存放运行时产生的日志文件,例如catalina.{date}.log等 |
| temp | 存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件 |
| webapps | 部署web应用程序的默认目录 |
| work | 主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件) |
编写启动脚本和关闭脚本,启动多实例时注意修改CATALINA_BASE为指定实例的目录
#! /bin/sh
export CATALINA_BASE=/home/q/tomcat/tomcat1
sh "$CATALINA_HOME"/bin/startup.sh
#! /bin/sh
export CATALINA_BASE=/home/q/tomcat/tomcat1
sh "$CATALINA_HOME"/bin/shutdown.sh
接下来就可以新建几个实例出来,启动多实例了,这样很多人用同一台服务器时可以各自跑各自的没什么影响
2. tomcat配置
2.1 账号管理
添加tomcat运行账号
groupadd tomcat
useradd -g tomcat tomcat
cat /etc/passwd | grep tomcat
配置启动账号 在$CATALINA_BASE/startenv.sh里面export环境变量:
export TOMCAT_USER=tomcat
同时需要修改$CATALINA_HOME/bin/startup.sh
修改前
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
修改后
if [ -z "$TOMCAT_USER" ]; then
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
else
exec su $TOMCAT_USER -c "$PRGDIR/$EXECUTABLE start $@"
fi
使用jsvc来启动tomcat
在jsvc配置文件里面指定参数
-u tomcat
2.2 配置default
2.2.1 删除默认文件
$CATALINA_BASE/webapps/docs
$CATALINA_BASE/webapps/examples
$CATALINA_BASE/webapps/host-manager
$CATALINA_BASE/webapps/manager
$CATALINA_BASE/conf/tomcat-users.xml
2.2.2 禁止列目录
配置$CATALINA_BASE/conf/web.xml文件,防止直接访问目录时由于找不到默认主页而列出目录下所有文件
<servlet>
......
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
......
</servlet>
2.2.3 日志记录
必须打开access log记录功能,按小时或按天记录。prefix/fileDateFormat/pattern可自定义,但必须记录关键信息,例如:源IP,Host、时间、请求、状态码、数据大小、UA等。注意:如果前端是NG做反向代理,默认的pattern="combined"和pattern="common"不能记录用户的真实IP,必须自定义pattern,记录客户端真实IP(X-Real-IP)。access log应该定期压缩上传至中央日志服务器保存。$CATALINA_BASE/conf/server.xml配置示例:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access" suffix=".log"
fileDateFormat="yyyy-MM-dd-HH"
pattern="%a %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" " %{X-Real-IP}i"
resolveHosts="false"/>
2.2.4 禁止使用AJP
配置$CATALINA_BASE/conf/server.xml文件,注释或删除如下部分。
注释前
<Connector port="*" maxThreads="*" enableLookups="false" redirectPort="*" protocol="AJP/**" />
注释后
<!--
<Connector port="*" maxThreads="*" enableLookups="false" redirectPort="*" protocol="AJP/**" />
-->
2.2.5 目录权限
NOTE: tomcat启动用户对WEB目录下所有文件及子目录应无写权限
chown -R root:root /home/q/www/xxx/webapps && chmod -R 0755 /home/q/www/xxx/webapps