> 技术文档 > Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署


Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  • 一: `server.xml` 配置文件
    • 1)`Server` 节点
    • 2)`Listener` 节点
    • 3)`GlobalNamingResources` 节点
    • 4)`Service` 节点
    • 5)`Connector` 节点
    • 6)`Engine` 节点
    • 7)`Host` 节点
  • 二:端口
    • 1)**8005:关闭端口(Shutdown Port)**
    • 2)**8080:HTTP 端口**
    • 3)**8443:HTTPS 端口**
    • 4)**8009:AJP 端口**
  • 三:规范 tomcat 访问日志格式
  • 四:部署 `zrlog` 应用
    • 1)环境准备
    • 2)部署 `MySQL`
    • 3)部署 `Tomcat`
    • 4)部署 `Nginx`
    • 5)**访问**
  • 五:Tomcat + Nginx 动静分离
    • 1)概述
    • 2)部署
  • 六:Tomcat + HTTPS
    • 1)概述
    • 2)部署
  • 七:Tomcat 多实例
    • 1)概述
    • 2)部署
  • 总结

🚀 Tomcat 系列文章导航
本系列系统讲解 Linux 环境下 Apache Tomcat 的部署、配置、管理与优化,并最终带你完成 企业级前后端分离项目上线。无论你是初学者还是想进阶的运维人员,这份路线图都能帮你快速构建完整的知识体系。

⚠️ 该系列所有涉及的软件包和项目都可以私信博主免费获取

  • 👉 第一部分:Tomcat 核心概念与基础部署
  • 👉 第二部分:Tomcat 系统化管理与应用部署
  • 👉 第三部分:Tomcat 配置解析与集群化部署
  • 👉 第四部分:Tomcat 企业级监控
  • 👉 第五部分:Tomcat 优化和安全加固
  • 👉 第六部分:综合项目实战:Java 前后端分离架构部署

一: server.xml 配置文件

1)Server 节点

<Server port=\"8005\" shutdown=\"SHUTDOWN\">
  • 作用:定义 Tomcat 服务器的最外层容器。
  • port=“8005”:这是 关闭端口,当有人本地连接这个端口并输入字符串 SHUTDOWN 时,Tomcat 就会安全关闭。
  • shutdown=“SHUTDOWN”:规定关闭指令,默认是字符串 SHUTDOWN,可以修改。

2)Listener 节点

<Listener className=\"org.apache.catalina.startup.VersionLoggerListener\" /><Listener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" /><Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" /><Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" /><Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" />
  • 作用:这些是监听器,在 Tomcat 启动或运行时监听并执行一些特定任务。常见功能:
    • VersionLoggerListener:输出 Tomcat 版本、JVM 版本、操作系统信息。
    • AprLifecycleListener:检测并初始化 APR(Apache Portable Runtime),提高性能和 SSL 支持。
    • JreMemoryLeakPreventionListener:防止某些 JRE 类库引起的内存泄漏。
    • GlobalResourcesLifecycleListener:初始化全局 JNDI 资源。
    • ThreadLocalLeakPreventionListener:减少 ThreadLocal 所引起的内存泄漏。

3)GlobalNamingResources 节点

<GlobalNamingResources> <Resource name=\"UserDatabase\" auth=\"Container\" type=\"org.apache.catalina.UserDatabase\" description=\"User database that can be updated and saved\" factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\" pathname=\"conf/tomcat-users.xml\" /></GlobalNamingResources>
  • 作用:配置全局的 JNDI 资源。

  • 这里的 Resource:定义了一个用户数据库 UserDatabase,数据存放在 conf/tomcat-users.xml

  • 这个数据库主要用于 Tomcat 管理后台(/manager, /host-manager) 的认证。

4)Service 节点

<Service name=\"Catalina\">
  • 作用:一个 Service = 一组连接器(Connector) + 一个引擎(Engine)

  • name=“Catalina”:这是默认的 Service 名字。

5)Connector 节点

<Connector port=\"8080\" protocol=\"HTTP/1.1\"  connectionTimeout=\"20000\"  redirectPort=\"8443\" />
  • 作用:定义 Tomcat 如何接收请求。
  • port=“8080”:接收 HTTP 请求的端口。
  • protocol=“HTTP/1.1”:采用 HTTP/1.1 协议。
  • connectionTimeout=“20000”:连接超时 20 秒。
  • redirectPort=“8443”:如果应用要求安全(HTTPS),Tomcat 会把请求重定向到 8443 端口。

6)Engine 节点

<Engine name=\"Catalina\" defaultHost=\"localhost\">
  • 作用:处理来自 Connector 的请求。

  • defaultHost=“localhost”:指定默认虚拟主机。

Realm(认证域)

<Realm className=\"org.apache.catalina.realm.LockOutRealm\"> <Realm className=\"org.apache.catalina.realm.UserDatabaseRealm\" resourceName=\"UserDatabase\"/></Realm>
  • 作用:用户认证与授权机制。
  • UserDatabaseRealm:使用前面定义的 UserDatabasetomcat-users.xml)来校验用户。
  • LockOutRealm:防止密码爆破(例如连续输错几次账号就会暂时锁定)。

7)Host 节点

<Host name=\"localhost\" appBase=\"webapps\" unpackWARs=\"true\" autoDeploy=\"true\">
  • 作用:定义一个虚拟主机(相当于 Apache/Nginx 的虚拟主机)。

  • name=“localhost”:域名是 localhost

  • appBase=“webapps”:应用的目录(默认在 webapps 下)。

  • unpackWARs=“true”:部署时会解压 .war 文件。

  • autoDeploy=“true”:支持热部署,直接放到 webapps 就会加载。

Valve(阀门)

<Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\" prefix=\"localhost_access_log\" suffix=\".txt\" pattern=\"%h %l %u %t "%r" %s %b\" />
  • 作用:类似过滤器,可以对请求进行拦截、记录。
  • AccessLogValve:访问日志组件。
  • pattern:定义日志格式(客户端IP、用户、时间、请求内容、状态码、响应大小等)。
  • 日志会写到 logs/localhost_access_log*.txt
# vim conf/server.xml<?xml version=\"1.0\" encoding=\"UTF-8\"?><Server port=\"8005\" shutdown=\"SHUTDOWN\"> <Listener className=\"org.apache.catalina.startup.VersionLoggerListener\" /> <Listener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" /> <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" /> <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" /> <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" /> <GlobalNamingResources> <Resource name=\"UserDatabase\" auth=\"Container\"  type=\"org.apache.catalina.UserDatabase\"  description=\"User database that can be updated and saved\"  factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"  pathname=\"conf/tomcat-users.xml\" /> </GlobalNamingResources> <Service name=\"Catalina\"> <Connector port=\"8080\" protocol=\"HTTP/1.1\"  connectionTimeout=\"20000\"  redirectPort=\"8443\" /> <Engine name=\"Catalina\" defaultHost=\"localhost\"> <Realm className=\"org.apache.catalina.realm.LockOutRealm\"> <Realm className=\"org.apache.catalina.realm.UserDatabaseRealm\"  resourceName=\"UserDatabase\"/> </Realm> <Host name=\"localhost\" appBase=\"webapps\" unpackWARs=\"true\" autoDeploy=\"true\"> <Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\"  prefix=\"localhost_access_log\" suffix=\".txt\"  pattern=\"%h %l %u %t "%r" %s %b\" /> </Host> </Engine> </Service></Server>

二:端口

⚠️ 很多人初学 Tomcat 都以为只有 8080,其实 Tomcat 内部默认会开多个端口,各自有不同作用:

1)8005:关闭端口(Shutdown Port)

  • 作用:专门用来关闭 Tomcat 的。

  • server.xml 里配置:

    <Server port=\"8005\" shutdown=\"SHUTDOWN\">
  • 如果有人(通常是本地)连接 8005 端口并发送字符串 SHUTDOWN,Tomcat 就会安全关闭。

  • ⚠️ 安全风险:生产环境常常 禁用/修改 这个端口,否则可能被恶意关闭。

2)8080:HTTP 端口

  • 作用:这是最常见的端口,处理普通 HTTP 请求。

  • 浏览器访问 http://localhost:8080/,就是通过这个端口。

  • server.xml 中:

    <Connector port=\"8080\" protocol=\"HTTP/1.1\"  connectionTimeout=\"20000\"  redirectPort=\"8443\" />

3)8443:HTTPS 端口

  • 作用:处理 HTTPS(加密的 HTTP)请求。
  • 一般情况下你配置了 SSL 证书,Tomcat 就会监听 8443,用来接收 HTTPS 连接。
  • 如果在 8080 配置了 redirectPort=\"8443\",当应用要求安全访问时,Tomcat 会把请求重定向到 8443

4)8009:AJP 端口

  • AJP (Apache JServ Protocol)

    • 一种二进制协议,效率比 HTTP 高。
    • 主要用于 Apache HTTPD / Nginx 等 Web 服务器和 Tomcat 通信。
    • 好处:前端 Apache 接收请求 → 转发给 Tomcat,能做负载均衡、安全控制等。
  • server.xml 中原本会有:

    <Connector port=\"8009\" protocol=\"AJP/1.3\" redirectPort=\"8443\" />
  • 从 Tomcat 8.5 之后

    • 默认 注释掉/禁用 了 8009,
    • 因为过去曾爆出 Ghostcat 漏洞(CVE-2020-1938),攻击者可通过 8009 读取 Tomcat 文件甚至执行代码。

三:规范 tomcat 访问日志格式

说明 tomcat nginx 定义访问日志的格式 Host 部分的pattern 定义 http 区域 log_format 部分 客户端 ip 地址 %h $remote_addr 访问的时间 %t $local_time 请求起始行 %r $request 状态码 %s $status 大小 %b $body_bytes_sent 从哪里跳转来的(用户如何访问网站) %{Referer}i $http_referer 客户端类型,浏览器 %{User-Agent}i $http_user_agent XFF 头记录 %{X-Forwarded-For}i $http_x_forwarded_for
pattern=\"%h %l %u %t "%r" %s %b "%{Referer}i""%{User-Agent}i" "%{X-Forwarded-For}i"\" />

四:部署 zrlog 应用

1)环境准备

角色 主机 外网IP 内网IP MySQL db01 192.168.2.109 172.16.1.109 Tomcat + Nginx + zrlog web01 192.168.2.104 172.16.1.104

2)部署 MySQL

  1. 连接数据库

    [root@db01 ~]# mysql -u root -pEnter password: # 123456
  2. 创建数据库

    MariaDB [(none)]> create database zrlog;Query OK, 1 row affected (0.00 sec)
  3. 赋予权限

    MariaDB [(none)]> grant all on zrlog.* to \'zrlog\'@\'172.16.1.%\' identified by \'zrlog\';Query OK, 0 rows affected (0.00 sec)
  4. 验证

    MariaDB [(none)]> select user, host, password from mysql.user;+------------+------------+-------------------------------------------+| user | host | password |+------------+------------+-------------------------------------------+| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || root | ::1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || zrlog | 172.16.1.% | *09CB1653907CD6E8B66284F7442626F9A83E9F32 |+------------+------------+-------------------------------------------+4 rows in set (0.00 sec)

3)部署 Tomcat

  1. 上传站点代码

    [root@web01 ~]# mv /opt/software/zrlog-2.2.1-efbe9f9-release.war /opt/software/zrlog.war
  2. 部署代码

    [root@web01 ~]# mv /opt/software/zrlog.war /opt/module/tomcat-8.5.87/webapps/

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  3. 启动 tomcat 服务

    [root@web01 ~]# systemctl start tomcat
  4. 浏览器安装

    http://192.168.2.104:8080/zrlog/install/

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

4)部署 Nginx

  1. 编辑 zrlog.conf 文件

    [root@web01 ~]# vim /etc/nginx/conf.d/zrlog.conf
    server { listen 80; server_name zrlog.cn; error_log /var/log/nginx/zrlog-error.log notice; access_log /var/log/nginx/zrlog-access.log main; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
  2. 刷新 Nginx

    [root@web01 ~]# nginx -t[root@web01 ~]# nginx -s reload
  3. 配置 hosts

    192.168.2.104 zrlog.cn

5)访问

  • 用户端访问

    http://zrlog.cn/zrlog/

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  • 管理端访问

    http://zrlog.cn/zrlog/admin/

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署


五:Tomcat + Nginx 动静分离

1)概述

📖Tomcat:主要用于处理动态请求(Java Servlet、JSP)。

📖Nginx:作为前端服务器,处理静态资源请求(HTML、CSS、JS、图片等),并将动态请求反向代理给 Tomcat。

目的:减轻 Tomcat 压力,提高静态资源访问速度,方便后续代码拆分和维护

2)部署

  1. 修改访问权限

    确保 nginx 用户 有权限访问 Tomcat 的 Web 应用目录

    # 修改整个 webapps 目录所属为 nginx 用户[root@web01 ~]# chown -R nginx:nginx /opt/module/tomcat-8.5.87/webapps/# 修改目录权限[root@web01 ~]# chmod 755 /opt/module/tomcat-8.5.87/webapps/[root@web01 ~]# chmod -R 755 /opt/module/tomcat-8.5.87/webapps/zrlog# 普通文件 644,目录 755[root@web01 ~]# find /opt/module/tomcat-8.5.87/webapps/ -type f | xargs chmod 644[root@web01 ~]# find /opt/module/tomcat-8.5.87/webapps/ -type d | xargs chmod 755
  2. 编辑 zrlog.conf 文件

    zrlog 应用配置虚拟主机,静态资源交由 Nginx 处理,其余动态请求转发到 Tomcat

    [root@web01 ~]# vim /etc/nginx/conf.d/zrlog.conf
    server { listen 80; server_name zrlog.cn; error_log /var/log/nginx/zrlog-error.log notice; access_log /var/log/nginx/zrlog-access.log main; # 动态请求 -> Tomcat location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态资源 -> 直接由 Nginx 处理 location ~* \\.(html|js|css|png|jpeg|bmp|webp)$ { root /opt/module/tomcat-8.5.87/webapps/zrlog; expires 7d; # 缓存 7 天 }}
  3. 刷新 Nginx

    [root@web01 ~]# nginx -t[root@web01 ~]# nginx -s reload

六:Tomcat + HTTPS

1)概述

  • Tomcat 本身支持 HTTPS,可以在 server.xml 中直接配置证书。
  • 实际生产中,更推荐在 Nginx 层配置证书,Tomcat 只跑 HTTP(未加密),由 Nginx 做 TLS 终结,性能更好。

2)部署

  1. 上传证书 → 修改 server.xml → 配置 HTTPS Connector
  2. 支持 PFX / JKS 格式证书
  3. 重启 Tomcat 后验证 8443 端口
  4. 可选:配置 web.xml 实现 HTTP 跳转 HTTPS
  1. 创建证书目录

    [root@web01 ~]# mkdir -p /opt/module/cert/tomcat
  2. 创建自签名证书

    keytool 是 JDK 自带的证书工具,可以直接生成 JKS/PKCS12 格式的证书文件

    参数说明:

    • -alias tomcat:证书别名
    • -keyalg RSA:加密算法
    • -keysize 2048:密钥长度
    • -validity 365:证书有效期(天)
    • -keystore:证书保存路径(JKS/PKCS12 文件)
    • -storepass:keystore 密码
    • -keypass:私钥密码
    • -dname:证书的身份信息(常用 CN=域名,其他随意)
    # 生成 JKS [root@web01 ~]# keytool -genkeypair \\ -alias zrlog \\ -keyalg RSA \\ -keysize 2048 \\ -validity 365 \\ -keystore /opt/module/cert/tomcat/zrlog.keystore \\ -storepass 123456 \\ -keypass 123456 \\ -dname \"CN=zrlog.cn, OU=IT, O=MyCompany, L=Beijing, ST=Beijing, C=CN\"
    # 转换为 PKCS12[root@web01 ~]# keytool -importkeystore \\ -srckeystore /opt/module/cert/tomcat/zrlog.keystore \\ -destkeystore /opt/module/cert/tomcat/zrlog.pfx \\ -deststoretype pkcs12 \\ -srcstorepass 123456 \\ -deststorepass 123456
  3. 修改 server.xml 配置

    • port=\"8443\" → HTTPS 端口

    • keystoreFile → 证书路径

    • keystoreType → 证书类型(PKCS12 / JKS,JKS 格式配置时,去掉 keystoreType=\"PKCS12\" 即可)

    • keystorePass → 证书密码

    [root@web01 ~]# vim /opt/module/tomcat-8.5.87/conf/server.xml
     <Connector port=\"8443\" protocol=\"HTTP/1.1\" SSLEnabled=\"true\" scheme=\"https\" secure=\"true\" keystoreFile=\"/opt/module/cert/tomcat/zrlog.pfx\" keystoreType=\"PKCS12\" keystorePass=\"123456\" clientAuth=\"false\" SSLProtocol=\"TLSv1.1+TLSv1.2+TLSv1.3\" ciphers=\"TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256\"/>

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  4. 配置 HTTP 自动跳转 HTTPS(可选)

    [root@web01 ~]# vim /opt/module/tomcat-8.5.87/conf/server.xml
    <login-config> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name></login-config><security-constraint> <web-resource-collection> <web-resource-name>ssl</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint></security-constraint>

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  5. 重启 Tomcat

    [root@web01 ~]# systemctl restart tomcat
  6. 验证

    [root@web01 ~]# ss -lntup | grep 8443tcp LISTEN 0 100 [::]:8443  [::]:*  users:((\"java\",pid=130829,fd=57))

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署


七:Tomcat 多实例

1)概述

  • Tomcat 多实例:在同一台 Linux 主机上运行多个 Tomcat 进程,每个实例独立运行、互不干扰。
  • 目的
    • 充分利用服务器资源
    • 一个实例挂掉不影响其他实例
    • 支持不同应用独立运行、隔离管理

2)部署

  1. 解压 JDK 二进制包

    [root@web02 ~]# tar -xzvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
  2. 解压 Tomcat 二进制包

    [root@web02 ~]# tar -xzvf /opt/software/apache-tomcat-8.5.87.tar.gz -C /opt/module/
  3. 准备两个 Tomcat

    [root@web02 ~]# cd /opt/module[root@web02 module]# mv apache-tomcat-8.5.87/ tomcat1[root@web02 module]# cp -r tomcat1 tomcat2
  4. 修改 server.xml 文件

    每个实例的 conf/server.xml 里需要修改端口,避免冲突

    [root@web02 module]# sed -i \'s#8005#8006#g\' tomcat1/conf/server.xml [root@web02 module]# sed -i \'s#8080#8081#g\' tomcat1/conf/server.xml [root@web02 module]# sed -i \'s#8005#8007#g\' tomcat2/conf/server.xml [root@web02 module]# sed -i \'s#8080#8082#g\' tomcat2/conf/server.xml
  5. 创建管理用户

    [root@web02 ~]# useradd -Ms /sbin/nologin tomcat
  6. 修改 tomcat1tomcat2 所属

    [root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat1[root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat2
  7. 创建 tomcat1.servicetomcat2.service

    [root@web02 ~]# vim /etc/systemd/system/tomcat1.service
    [Unitt]Description=Tomcat java web containerAfter=network.target[Service]Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖)Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本ExecStart=/opt/module/tomcat1/bin/startup.shExecStop=/opt/module/tomcat1/bin/shutdown.sh# 运行身份(推荐非 root)User=tomcatGroup=tomcat[Install]WantedBy=multi-user.target
    [root@web02 ~]# vim /etc/systemd/system/tomcat2.service
    [Unitt]Description=Tomcat java web containerAfter=network.target[Service]Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖)Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本ExecStart=/opt/module/tomcat2/bin/startup.shExecStop=/opt/module/tomcat2/bin/shutdown.sh# 运行身份(推荐非 root)User=tomcatGroup=tomcat[Install]WantedBy=multi-user.target
  8. 重新加载 systemctl 配置

    [root@web02 ~]# systemctl daemon-reload
  9. 启动服务

    [root@hadoop105 module]# systemctl start tomcat1.service [root@hadoop105 module]# systemctl start tomcat2.service 

    Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署


总结

📌 本节重点回顾

  • server.xml 配置解析

    • 掌握了 Server / Service / Connector / Engine / Host 五大核心节点及其常用配置。

    • 重点理解 Connector 端口(8005/8080/8443/8009) 的作用与安全风险。

    • 熟悉 Realm、Valve、Listener 等功能组件。

  • 日志与端口管理

    • 学会了 规范 Tomcat 访问日志格式,并对比了 Tomcat 与 Nginx 日志字段。

    • 明确了 Tomcat 默认端口的用途及生产环境的调整建议。

  • 应用部署与优化

    • 完成了 zrlog 博客系统 在 Tomcat 上的部署,并结合 Nginx 实现动静分离。

    • 掌握了 Tomcat HTTPS 配置(证书生成、导入、配置、启用)。

    • 能在同一主机上运行 多实例 Tomcat,实现应用隔离与高可用。

至此,你已经掌握了 Tomcat 配置解析、应用部署、动静分离、HTTPS、安全与多实例管理 等企业级运维必备技能。
下一篇我们将进入 Tomcat 企业级监控,迈向真正的生产级环境!