配置文件
Tomcat 配置文件分类
- 官方帮助文档:https://tomcat.apache.org/tomcat-8.5-doc/index.html
[root@centos8 ~]# cd /usr/local/tomcat/conf/
[root@centos8 conf]# find . -type f
./server.xml #主配置文件
./web.xml #此文件为所有的webapps提供默认部署相关的全局配置,(每个web应用也可以使用专用子配置文件,优先级高于全局配置文件,其存放在应用目录下的WEB-INF目录中并且名称也为web.xml)
./context.xml #此文件为所有的webapps提供默认定义所有应用均需加载的context全局配置,(每个web应用也可以使用专用子配置文件,优先级高于全局配置文件,其存放在应用目录下的WEB-INF目录中并且名称也为context.xml)
./tomcat-users.xml #用户认证的账号和密码文件
./tomcat-users.xsd
./catalina.policy #当使用security选项启动tomcat时,此文件用于为tomcat设置安全策略
./catalina.properties #tomcat 环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数
./logging.properties #tomcat 日志系统相关配置,可以修改日志级别和日志路径等
./jaspic-providers.xml
./jaspic-providers.xsd
./tomcat.conf #自定义的配置文件,主要存放了JAVA_HOME全局变量 jdk的位置配置文件 server.xml 说明
- server.xml 为主配置文件
server.xml 文件结构
- $CATALINA_BASE 表示tomcat的家目录,如:/apps/tomcat
#$CATALINA_BASE/conf/server.xml
...
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context >
<Context />
</Host>
</Engine>
</Service>
</Server>
...server
- 服务器,代表整个 Tomcat 容器,Tomcat运行的进程实例,一台主机可以启动多 Tomcat 实例,需要确保端口不要产生冲突
- 一个 server中可以有多个service,但通常就一个
#$CATALINA_BASE/conf/server.xml
...
<Server port="8005" shutdown="SHUTDOWN">
...
</Server>8005/tcp 端口安全配置
- 8005/tcp 是Tomcat的管理端口
- 默认监听在127.0.0.1上
- 无需验证就可向此IP和端口发送SHUTDOWN这个字符串,Tomcat接受到后就会关闭此server
- 此功能建议禁用
[root@18 ~]# vim /usr/local/tomcat/conf/server.xml
...
<Server port="8005" shutdown="SHUTDOWN"> #将8005改成-1将禁用,此行不能被注释,否则tomcat将无法启动,shutdown=后面得内容可以自定义 而后可以实现使用自定义得字符串关闭tomcat
...
---------------------------------------------------------------------------------
#范例
#执行前
[root@tomcat-node1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:*
LISTEN 0 100 *:8080 *:*
LISTEN 0 128 [::]:22 [::]:*
#执行
[root@tomcat-node1 ~]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
#可以看到tomcat服务已经关闭
[root@tomcat-node1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:* service
- 服务,实现组织 engine 和 connector 之间的对应关系
- 一个service中只能包含一个engine
- 一般情况下,一个server实例只配置一个service,
#$CATALINA_BASE/conf/server.xml
...
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina"> <!-- name属性该service的ID -->
...
</Server>connector
- 协议的连接器,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)(AJP 是一种基于TCP的二进制通讯协议)
- 一个connector只属于某一个engine
- redirectPort:重定向端口,如果访问HTTPS协议,则自动转向这个连接器。但大多数时候 tomcat不会开启https功能,因为tomcat部署偏内层 所以HTTPS的性能不好
#$CATALINA_BASE/conf/server.xml
...
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> <!-- Connector配置 -->
...
</Server>自定义http服务器版本信息
- 默认不显示tomcat的http的server头信息,可以指定tomcat的http的server头信息为相应的值
#默认不显示任何版本信息
[root@localhost ~]#curl -I 10.0.0.18:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 13 Sep 2021 12:08:48 GMT
#自定义版本信息
[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/server.xml
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" server=azhengweb/> #加上一个server=自定义的名称
...
[root@tomcat-node1 ~]# systemctl restart tomcat.service
#测试
[root@localhost ~]#curl -I 10.0.0.18:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 13 Sep 2021 12:17:22 GMT
Server: azhengwebengine
- 引擎,用来响应并处理用户请求
- 一个 engine 上可以绑定多个 connector
#$CATALINA_BASE/conf/server.xml
...
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
...
<Engine name="Catalina" defaultHost="localhost"> <!-- Engine配置 -->
...
</Server>host
- 虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
- 指向内部某虚拟主机,默认虚拟主机可以改动,默认localhost
#$CATALINA_BASE/conf/server.xml
...
<Server port="-1" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
...
<Engine name="Catalina" defaultHost="localhost">
...
#Host配置
#name:虚拟主机的名称,即url
#appBase:虚拟主机数据存放位置,可以写相对路径或绝对路径,相对路径是相对于$CATALINA_BASE的路径 #unpackWARs:自动解war包,生产中需禁用,防止有人在此目录添加恶意的war包对站点实施攻击等...
#autoDeploy:自动部署,生产中需禁用
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
...
</Server>实现多虚拟主机
准备虚拟主机数据
#虚拟主机1准备
[root@tomcat-node1 ~]# mkdir -p /data/webapps/app1/ROOT
[root@tomcat-node1 ~]# echo 'app1 page' > /data/webapps/app1/ROOT/index.jsp
#虚拟主机2准备
[root@tomcat-node1 ~]# mkdir -p /data/webapps/app2/ROOT
[root@tomcat-node1 ~]# echo 'app2 page' > /data/webapps/app2/ROOT/index.jsp
#修改权限
[root@tomcat-node1 ~]# chown -R tomcat.tomcat /data/webapps*修改配置文件
- -为标注分界线,方便查阅,无需在tomcat中配置
- 为app2单独配置了日志记录,不写的话就是不启用日志记录
[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/server.xml
...
</Host>
--------------------------------------------------------------------------------
<Host name="app1.azheng.vip" appBase="/data/webapps/app1/"
unpackWARs="true" autoDeploy="false">
</Host>
<Host name="app2.azheng.vip" appBase="/data/webapps/app2/"
unpackWARs="true" autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="app2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
--------------------------------------------------------------------------------
</Engine>
...
#重启服务
[root@tomcat-node1 ~]# systemctl restart tomcat.service测试
#客户段修改DNS
[root@clicent ~]#vim /etc/hosts
10.0.0.18 app1.azheng.vip app2.azheng.vip
#测试访问
[root@clicent ~]#curl app1.azheng.vip:8080
app1 page
[root@clicent ~]#curl app2.azheng.vip:8080
app2 pagevalve
- valve(阀门)组件可以定义日志,也可以定义访问控制
- valve存在多种类型:
- 定义访问日志:org.apache.catalina.valves.AccessLogValve
- 定义访问控制:org.apache.catalina.valves.RemoteAddrValve
范例:
#定义访问日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="app2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
#定义访问控制
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>context
- 应用的上下文,配置特定 url 路径映射和目录的映射关系,即:url –> directory
- 注意:新版本tomcat以及将此配置定义为了单独的子配置文件,详参下文:
- 也可以在 server.xml 中定义?
配置文件 context.xml 说明
-
路径重定向
-
context作用:
- 路径映射,将url映射至指定目录,而非使用appBase下的物理目录,实现虚拟目录的功能
- 应用独立配置,例如单独配置应用日志、单独配置应用访问控制
-
在虚拟机主机配置内添加
-
path:表示访问的RUL路径,如果path与appBase下面的目录同名 则 Context的docBase下的路径优先级更高
-
docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
-
reloadable:true表示如果 WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议禁用:reloadable=“false”
#路径映射
<Context path="/test" docBase="/data/test" reloadable="true"/>
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="app2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>context 配置范例
准备测试目录
[root@tomcat-node2 ~]# mkdir -p /data/appv1/
[root@tomcat-node2 ~]# echo 'test app version1.0' > /data/appv1/index.html
#创建软连接方便后期升级或回滚
[root@tomcat-node2 ~]# ln -s /data/appv1/ /data/app
[root@tomcat-node2 ~]# tree /data/
/data/
├── app -> /data/appv1/
└── appv1
└── index.html
#为了安全修改权限
[root@tomcat-node2 ~]# chown -R tomcat.tomcat /data/修改配置文件
[root@tomcat-node2 ~]# vim /usr/local/tomcat/conf/server.xml
...
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
#添加如下Context
<Context path="/app" docBase="/data/app" reloadable="false" />
...
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
...
#重启tomcat
[root@tomcat-node2 ~]# systemctl restart tomcat测试访问
[root@clicent ~]#curl 10.0.0.28:8080/app/
test app version1.0假设app升级
#升级前访问
[root@clicent ~]#curl app.azheng.vip:8080/app/
test app version1.0
#创建app version2
[root@tomcat-node2 ~]# mkdir /data/appv2
[root@tomcat-node2 ~]# echo 'test app version2.0' > /data/appv2/index.jsp
#修改软连接指向,完成升级
[root@tomcat-node2 ~]# rm -f /data/app
[root@tomcat-node2 ~]# ln -s /data/appv2/ /data/app
#重启tomcat(reloadable="false"时需要重启tomcat才能生效)
#测试访问
[root@clicent ~]#curl app.azheng.vip:8080/app/
test app version2.0假设app回滚
#回滚前测试
[root@clicent ~]#curl app.azheng.vip:8080/app/
test app version2.0
#删除旧的软连接,创建新的软连接
[root@tomcat-node2 ~]# rm -f /data/app
[root@tomcat-node2 ~]# ln -s /data/appv1/ /data/app
[root@tomcat-node2 ~]# tree /data/
/data/
├── app -> /data/appv1/
├── appv1
│ └── index.jsp
└── appv2
└── index.jsp
3 directories, 2 files
[root@tomcat-node2 ~]# systemctl restart tomcat
#测试访问
[root@clicent ~]#curl app.azheng.vip:8080/app/
test app version1.0Tomcat定义子配置文件
可以将webapps目录下的应用目录下的WEB-INF目录拷贝到自定义的目录下,再修改web.xml文件即可