配置文件

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: azhengweb

engine

  • 引擎,用来响应并处理用户请求
  • 一个 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 &quot;%r&quot; %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 page

valve

  • 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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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.0

Tomcat定义子配置文件

可以将webapps目录下的应用目录下的WEB-INF目录拷贝到自定义的目录下,再修改web.xml文件即可