tomcat配置文件
-
tomcat的配置文件构成
tomcat 的配置文件也是由 java 语言编写,遵循 java 的语法
[root@CentOS74 tomcat]# ll conf/
total 216
drwxr-xr-x 3 root root 23 Jul 18 12:12 Catalina
-rw-r----- 1 root tomcat 13852 Jun 29 22:44 catalina.policy
-rw-r----- 1 root tomcat 7499 Jun 29 22:44 catalina.properties
-rw-r----- 1 root tomcat 1577 Jun 29 22:44 context.xml
-rw-r----- 1 root tomcat 3387 Jun 29 22:44 logging.properties
-rw-r----- 1 root tomcat 6458 Jun 29 22:44 server.xml
-rw-r----- 1 root tomcat 2164 Jun 29 22:44 tomcat-users.xml
-rw-r----- 1 root tomcat 2634 Jun 29 22:44 tomcat-users.xsd
-rw-r----- 1 root tomcat 169566 Jun 29 22:44 web.xml
server.xml:主配置文件
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置
tomcat-users.xml:用户认证的账号和密码文件
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.properties:日志系统相关的配置
-
tomcat核心组件
server.xml
server.xml 配置文件的基本结构
<Server>
<Service>
<connector/>
<connector/>
...
<Engine>
<Host>
<Context/>
<Context/>
...
</Host>
<Host>
...
</Host>
...
</Engine>
</Service>
</Server>
每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:
顶级组件:Server,代表一个运行的 tomcat 实例
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...
web应用的部署
-
JSP WebAPP的组织结构
[root@CentOS74 ~]# tree /data/myweb/
/data/myweb/
├── classes #类文件,当前webapp所提供的类
├── index.jsp #主页
├── lib #库文件,当前webapp所提供的类,被打包为jar格式
├── MATA-INF #类似于WEB-INF/
└── WEB-INF #当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件
4 directories, 1 file
webapp归档格式:
.war:webapp
.jar:EJB的类打包文件;
.rar:资源适配器类打包文件;
.ear:企业级webapp;
-
部署(deploy)webapp的相关操作
将 webapp 的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于 web.xml 和 context.xml 文件中定义的路径来访问此webapp。将其特有的类和依赖的类通过 class loader 装载至 JVM
部署有两种方式:
自动部署:auto deploy
手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat
热部署:在不停止tomcat的前提下进行部署
部署工具:manager、ant脚本、tcd(tomcat client deployer)等
undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp
start:启动处于停止状态的webapp
stop:停止webapp,不再向用户提供服务;其类依然在jvm上
redeploy:重新部署;undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp
发布一个简单的 webapp
将一个 webapp 存放至 webapp/ 目录下即可实现一次简单的热部署
[root@CentOS74 ~]# ll /usr/local/tomcat/webapps/
total 4
drwxr-xr-x 14 root tomcat 4096 Jul 18 11:07 docs
drwxr-xr-x 6 root tomcat 83 Jul 18 11:07 examples
drwxr-xr-x 5 root tomcat 87 Jul 18 11:07 host-manager
drwxr-xr-x 5 root tomcat 103 Jul 18 11:07 manager
drwxr-xr-x 6 root root 80 Jul 18 16:24 myweb #webapp文件夹
drwxr-xr-x 3 root tomcat 306 Jul 18 11:07 ROOT
使用 curl 工具访问
[root@CentOS69 ~]# curl http://192.168.30.74:8080/myweb/
<html>
<head>
<title>Test Page</title>
</head>
<body>
hello world
</body>
</html>
我们也可以使用软连接实现 webapp 的部署(不支持热部署,需要重启 tomcat 服务)
[root@CentOS74 webapps]# ll
total 4
drwxr-xr-x 14 root tomcat 4096 Jul 18 11:07 docs
drwxr-xr-x 6 root tomcat 83 Jul 18 11:07 examples
drwxr-xr-x 5 root tomcat 87 Jul 18 11:07 host-manager
drwxr-xr-x 5 root tomcat 103 Jul 18 11:07 manager
lrwxrwxrwx 1 root root 14 Jul 18 16:43 myweb -> /data/myweb1.1 #创建软连接至应用程序存放的文件夹
drwxr-xr-x 3 root tomcat 306 Jul 18 11:07 ROOT
使用 Manager 程序进行部署
想要启用 tomcat-manager 应用需要在 conf/tomcat-users.xml 中添加对应的认证语句
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>
manager 应用有四种角色:
manager-gui:图形界面,拥有所有管理权限
manager-script:通过脚本管理,拥有所有权限
manager-jmx:可以查看JXM proxy与状态页面
manager-status:仅允许查看状态页面
配置tomcat服务
- Server:代表 tomcat instance,即表现出的一个 java 进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口
<Server port="8005" shutdown="SHUTDOWN">
- Service:用于实现将一个或多个connector组件关联至一个engine组件
<Service name="Catalina">
- Connector:负责接收请求,常见的有三类http/https/ajp
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Connector 能够接收的请求大致可以分为两类:
直接来自客户端发起的请求(不推荐)
来自前段代理服务器,反向代理的请求
属性:
port="8080" 监听端口
protocol="HTTP/1.1" 使用的协议
connectionTimeout="20000" 连接超时时长
redirectPort="8443" 重定向端口
address 监听的IP地址;默认为本机所有可用地址;
maxThreads 最大并发连接数,默认为200;
enableLookups 是否启用DNS查询功能;
acceptCount 等待队列的最大长度;
secure 是否启用secure功能
sslProtocol ssl协议版本
SSLEnabled 是否启用ssl
- Engine组件:Servlet 实例,即 servlet 引擎,其内部可以一个或多个 host 组件来定义站点; 通常需要通过 defaultHost 属性来定义默认的虚拟主机
<Engine name="Catalina" defaultHost="localhost">
属性:
name 名称
defaultHost 默认的虚拟主机
jvmRoute=name=
defaultHost="localhost"
jvmRoute=
- Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
属性:
name 虚拟主机名称
appBase 虚拟主机根目录,当路径是相对目录时,则会在$CTATLINA_BASE下查找,也可以写绝对路径
unpackWARs 是否自动展开.war文件
autoDeploy 是否自动部署应用程序
- Valve组件:插入在Catalina容器(包括Engine,Host或者Context)处理流程中的组件,一般用于记录日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
属性:
className 实现的Java类名。记录日志必须被设置成org.apache.catalina.valves.AccessLogValve
directory 存放日志文件的目录,可以是相对路径或者绝对路径
prefix 日志文件名的前缀。如果没有指定,缺省值是“access_log.”
suffix 日志文件名的后缀
resolveHosts 是否使用DNS进行反向解析
pattern 需要记录的请求/响应不同信息域的格式布局
%a - 远端IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,如果为0,使用"-"
%B - 发送的字节数,不包括HTTP头
%h - 远端主机名(如果resolveHost=false,远端的IP地址)
%H - 请求协议
%l - 从identd返回的远端逻辑用户名(总是返回 '-')
%m - 请求的方法(GET,POST,等)
%p - 收到请求的本地端口号
%q - 查询字符串(如果存在,以 '?'开始)
%r - 请求的第一行,包含了请求的方法和URI
%s - 响应的状态码
%S - 用户的session ID
%t - 日志和时间,使用通常的Log格式
%u - 认证以后的远端用户(如果存在的话,否则为'-')
%U - 请求的URI路径
%v - 本地服务器的名称
%D - 处理请求的时间,以毫秒为单位
%T - 处理请求的时间,以秒为单位
%{xxx}i
消息头
%{xxx}c
特定的cookie
%{xxx}r
xxx 是ServletRequest中的某个属性
%{xxx}s
xxx 是HttpSession中的某个属性
- Context组件: 一个Context组件代表一个web应用,context name 必须唯一,而context path可以不唯一
<Context path="/context" docBase="/data/context/testapp" reloadable="" />
属性:
path 访问时的uri
docBase web应用存放的路径
className 实现的Java类名。该类必须实现org.apache.catalina.Context接口。如果没有指定,使用标准实现
cookie 默认为true,表示启用cookie来标识session
reloadable 是否在/WEB-INF/class和/WEB-INF/lib更改时重载,生产时建议为false
wapperClass 实现wrapper容器的类,该类必须实现org.apache.catalina.Wrapper接口,如果不指定该属性则采用默认的标准类
创建虚拟主机
在 server.xml 中定义新的虚拟主机
<Host name="web1.test.com" appBase="/data/test/web1"
unpackWARs="true" autoDeploy="true">
<Context path="/context" docBase="/data/context/testapp" reloadable="" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/test/web1"
prefix="web1_access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
为虚拟主机 web1.test.com 和 Context /context 创建应用文件
[root@CentOS74 ~]# tree /data/test/web1/ /data/context/testapp/
/data/test/web1/
└── ROOT
├── classes
├── index.jsp
├── lib
├── MATA-INF
└── WEB-INF
/data/context/testapp/
├── classes
├── index.jsp
├── lib
├── MATA-INF
└── WEB-INF
9 directories, 2 files
重启 tomcat 服务加载新的虚拟主机,并访问 web1.test.com
使用 Host-Manager 程序添加虚拟主机
启用 tomcat-manager 应用需要在 conf/tomcat-users.xml 中添加对应的认证语句
<role relename="admin-gui"/>
<user username="admin" password="admin" roles="admin-gui"/>
总结 tomcat 处理请求的流程
1、Tomcat 启动后,Connector 组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接受 Socket
2、监听到客户端连接,将连接交给线程池 Executor 处理,开始执行请求响应任务
3、HttpllProcessor 组件负责从客户端连接中读取消息报文,然后解析 HTTP 的请求行、请求头部、请求体。将解析后的报文组装成 Request 对象,方便日后通过 Request 对象获取 HTTP 协议的相关值
4、Mapper 组件根据 HTTP 协议请求行的 URL 属性值和请求头部的 Host 属性值匹配由哪个 Host 容器、哪个 Context 容器。哪个 Wrapper 容器处理请求。就是根据请求从 Tomcat 中找到对应的 Servlet。然后将结果保存到 Request 对象中,方便后面处理时通过 Request 对象选择容器
5、CoyoteAdaptor 组将负责将 Connector 组件和 Engine 容器链接起来,把处理过程生成的 Request 和 Response 传递到 Engine 容器,调用他的管道。
6、Engine 容器的管道开始处理请求,管道包含若干阀门(Value),每个阀门负责某些处理逻辑。用 xxxvalue 代表阀门,可以根据自己的需要往这个阀门中添加多个阀门,首先执行这个 xxxValue,然后才执行基础阀门 EngineValue,负责调用 Host 容器的管道
7、Host 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 HostValue,他继续往下调用 Context 容器的管道
8、Context 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 ContextValue,他继续往下调用 Wrapper 容器的管道
9、Wrapper 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 WrappertValue,它会执行该 Wrapper 容器对应的 Servlet 对象的处理方法,对请求进行逻辑处理,将结果输出到客户端