首先要知道:Tomcat是一个Servlet/JSP容器。
Tomcat作为一个Web应用服务器软件,它的核心功能是实现由JCP(Java Community Process)制定的Java Servlet,(JSP)JavaServer Pages, (EL)Java Expression Language 和 Java WebSocket规范,并提供了一些对Web应用很有用的特性。
本文基于Tomcat 8.0.x所写,它实现的是Servlet3.1和JSP2.3规范。
专有名词
在使用Tomcat前,最好先了解Tomcat设计的一些概念,以及在使用过程中会用到的变量名词。
Catalina
Tomcat由多个组件构成,Catalina是最核心的组件。它实现了Servlet/JSP规范,是Tomcat的Servlet容器。据闻它是以太平洋的一个小岛Catalina命名的。
Tomcat的安装包里有几个地方是以Catalina命名的。如bin目录的catalina.sh脚本,它是用来管理Tomcat容器,包括tomcat的启动和关闭。logs目录的catalina.out,它是tomcat容器的主日志。
Tomcat架构相关名词
Server:服务器,在Tomcat里它表示整个容器,它对应Tomcat的Server interface接口。
Service:服务,它是一个中间组件,它的作用是把一个或多个的Connector绑定到一个Engine引擎上。它对应Tomcat的 Service interface接口。
Engine:引擎,Service的请求处理流程。接收和处理Connector的请求,并返回响应。它对应tomcat的Engine interface。
Connector:连接器,它用来与客户端通信。一个Tomcat服务器可以配置多个连接器,如处理http请求的HTTP Connector,处理AJP协议的AJP Connector(用来连接Tomcat服务器与其他web应用服务器的通信)。
Host:虚拟主机。它的作用是给Tomcat服务器关联网址,如majing.io。一个Engine可以包含多个虚拟主机,其中一个主机作为Engine的默认主机,它是通过Engine的defaultHost设置,默认主机将处理那些发送到tomcat服务器而未指定虚拟主机地址的请求。
Context: 表示部署的web应用。一个虚拟主机可以包含多个Context,但每个Context需要有唯一的路径。
环境变量的设置
Tomcat是一个Java的应用程序,它本身是不会直接使用环境变量。这些环境变量主要是tomcat的启动脚本使用。catalina.sh是Tomcat在*inux系统下的启动脚本,它会检测一些环境变量,使用这些环境变量来构造java命令,用来启动tomcat。
在catalina.sh脚本的开头列出了它所使用的环境变量,以及每个环境变量作用。其中CATALINA_HOME,CATALINA_BASE,JRE_HOME,JRE_HOME,CATALINA_OPTS以及CATALINA_PID是比较常用的环境变量。
CATALINA_HOME与CATALINA_BASE
- CATALINA_HOME:必须,指向Tomcat的安装目录。如果没有设置CATALINA_HOME,脚本会自动检测并且设置为Tomcat的安装目录。
- CATALINA_BASE:可选,表示tomcat的实例路径。在单个tomcat实例的情况下,它指向的就是$CATALINA_HOME。在部署多个实例的情况下,它表示自己所在实例的路径。
tomcat安装包里可以分为两类目录:
- 属于tomcat的软件目录,包括bin和lib
- tomcat实例运行相关目录,包括conf,logs,temp,webapps以及work
我们可以把tomcat运行的相关目录内容拷贝多份,每一份为一个tomcat实例,它的$CATALINA_HOME指向到tomcat软件所在目录(即tomcat的安装目录),$CATALINA_BASE指向到实例所在目录。但很少会使用这种部署方式。所以一般情况下$CATALINA_HOME和$CATALINA_BASE都是指向Tomcat的安装目录。
JRE_HOME与JAVA_HOME
- JRE_HOME:jre的安装目录。
- JAVA_HOME:jdk的安装目录。
这两个环境变量必须存在其中一个,如果两个环境变量都存在,使用JRE_HOME指定的目录。
CATALINA_OPTS与CATALINA_PID
CATALINA_OPTS和CATALINA_PID是比较常用到两个环境变量。
- CATALINA_OPTS:可以在这个环境变量设置Java运行参数,如堆栈大小,GC参数等。CATALINA_OPTS所设置的参数只会用在tomcat的启动命令start,run以及debug,不会在stop命令里使用。
- CATALINA_PID:配置tomcat的进程id存放位置。
JAVA_OPTS是一个容易与CATALINA_OPTS混淆的环境变量,它也是用来设置Java运行参数。与CATALINA_OPTS不同,JAVA_OPTS所设置的参数除了用在tomcat的启动命令start里外,还会用在tomcat的关闭命令stop里。
关闭tomcat,执行stop命令实际也是执行一个java命令,它不需要很大的内存等资源。为了避免执行stop命令时耗费很多资源,不要在JAVA_OPTS里设置内存限制相关参数。启动脚本所需要的JAVA运行参数往往都是在CATALINA_OPTS设置,这也是JAVA_OPTS不怎么使用的原因。
setenv.sh
catalina.sh会检测在$CATALINA_HOME/bin目录下是否存在setenv.sh脚本,如果存在则执行setenv.sh脚本。顾名思义,“setenv”是用来设置环境变量的,Tomcat推荐除了CATALINA_HOME和CATALINA_BASE外的环境变量在setenv.sh中设置。
示例:
JRE_HOME=/usr/java/latest
CATALINA_PID="$CATALINA_BASE/tomcat.pid"
默认情况下,$CATALINA_HOME/bin目录下是没有setenv.sh,可以自己新建此文件。
服务器配置
TODO