文章目录
Pre
Tomcat Version : 8.5+
我们先回顾下 前几节学习的的tomcat的功能及架构
Tomcat是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx apache 服务器不同在于一般用于动态请求处理。
在架构设计上采用面向组件的方式设计, 即整体功能是通过组件的方式拼装完成。
Tomcat 各组件及关系
Server 和 Service
Connector 连接器
HTTP 1.1
SSL https
AJP( Apache JServ Protocol) apache 私有协议,用于apache 反向代理TomcatContainer
Engine 引擎 catalina
Host 虚拟机 基于域名 分发请求
Context 隔离各个WEB应用 每个Context的 ClassLoader都是独立Component
Manager (管理器)
logger (日志管理)
loader (载入器)
pipeline (管道)
valve (管道中的阀)
server.xml 配置详解
上述组件,都是可以在server.xml中配置
server
root元素 , server 的顶级配置
主要属性:
- port:执行关闭命令的端口号
- shutdown:关闭命令
基于telent 执行SHUTDOWN 命令即可关闭(必须大写)
telnet 127.0.0.1 8005
SHUTDOWN
service
服务:将多个connector 与一个Engine组合成一个服务,可以配置多个服务。
connector
连接器:用于接收 指定协议下的连接 并指定给唯一的Engine 进行处理。
主要属性:
- protocol 监听的协议,默认是http/1.1
- port 指定服务器端要创建的端口号
- minThread服务器启动时创建的处理请求的线程数
- maxThread最大可以创建的处理请求的线程数
- enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
- redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
- acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
- connectionTimeout指定超时的时间数(以毫秒为单位) 【请求连接tomcat的最大超时时间,如果超过该时间,tomcat自动掐断该请求。如果当前可使用的线程都被使用,connectionTimeout时间内还是没有线程能处理该请求,即超时 】
- SSLEnabled 是否开启 SSL 验证,在Https 访问时需要开启。
举个例子
<Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8862"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"
maxThreads="1024" minSpareThreads="200"
acceptCount="800"
enableLookups="false"
/>
Engine
引擎:用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。
主要属性:name 引擎名称 defaultHost 默认host
Host
虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost. 主要属性
举例配置多个Host
<Host name="www.luban.com" appBase="/usr/www/artisan"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.artisan.com.access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
Context
应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。
举例配置多个Context
<Context docBase="hello" path="/h" reloadable="true"/>
docBase 不能有 / , 否则是根目录
Tomcat与App应用分开部署
我们平时启动Tomcat过程是怎么样的?
- 复制WAR包至Tomcat webapp 目录。
- 执行starut.bat 脚本启动。
- 启动过程中war 包会被自动解压装载。
再回想我们在idea 中启动WEB项目的时候 也是把War包复杂至webapps 目录解压吗?
显然不是,其真正做法是在Tomcat程序文件之外创建了一个部署目录,在一般生产环境中也是这么做的 即:Tomcat 程序目录和部署目录分开 。
我们只需要在启动时指定CATALINA_HOME 与 CATALINA_BASE 参数即可实现。
启动参数 | 描述说明 |
JAVA_OPTS | jvm 启动参数 , 设置内存 编码等 -Xms200m -Xmx200m -Dfile.encoding=UTF-8 |
JAVA_HOME | 指定jdk 目录,如果未设置从java 环境变量当中去找。 |
CATALINA_HOME | Tomcat 程序根目录 |
CATALINA_BASE | 应用部署目录,默认为$CATALINA_HOME |
CATALINA_OUT | 应用日志输出目录:默认$CATALINA_BASE/logs |
CATALINA_TMPDIR | 应用临时目录:默认:$CATALINA_BASE/temp |
好处很明显:
- 不会和 tomcat耦合在一起,升级tomcat版本很方便 ,搞个软连接爱指哪儿指哪儿
- 配置文件隔离 : conf目录每个app都有一份,那岂不是什么端口号啊 想改就改~ ,改了这个AP的,也不影响另外一个AP的。因为conf是每个应用都有自己的嘛
当然了,缺点也是你得搞个启动脚本
操作步骤:
- 下载tomcat8.5+, 解压,比如这里解压到/root/artisan ,当然了你可以搞个软连接指定8.5+的版本。 后续升级维护这个软连接的指向即可
- 新建目录用于存放你的应用,比如叫apps 然后下面存放你的其中一个应用,比如叫 artisanAPP,也可以放多个 artisanAPP2 . 这些应用都是可以单独启动的。
- copy tomcat 中的 conf 和 webapps 到你的apps/artisanAPP目录下
- apps/artisanAPP目录下新建logs目录 (一定要建,不然报错)
- 编写启动脚本 tomcat.sh ,如下
export JAVA_OPTS="-Xms1024m -Xmx1024m"
export JAVA_HOME=/root/artisan/jdk
export CATALINA_HOME=/root/artisan/apache-tomcat
export CATALINA_BASE=`pwd`
# start stop restart status
case $1 in
start)
$CATALINA_HOME/bin/catalina.sh start
echo "start success"
;;
stop)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
sleep 3
$CATALINA_HOME/bin/catalina.sh start
echo start success!!
;;
version)
$CATALINA_HOME/bin/catalina.sh version
;;
configtest)
$CATALINA_HOME/bin/catalina.sh configtest
;;
esac
exit 0
以上是一个比较简单的启动tomcat的脚本,本质上也是调用catalina.sh 。
可以调用 tomcat.sh/configtest 来验证配置是否正确。