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:使用前面定义的
UserDatabase
(tomcat-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
-
连接数据库
[root@db01 ~]# mysql -u root -p Enter password: # 123456
-
创建数据库
MariaDB [(none)]> create database zrlog; Query OK, 1 row affected (0.00 sec)
-
赋予权限
MariaDB [(none)]> grant all on zrlog.* to 'zrlog'@'172.16.1.%' identified by 'zrlog'; Query OK, 0 rows affected (0.00 sec)
-
验证
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
-
上传站点代码
[root@web01 ~]# mv /opt/software/zrlog-2.2.1-efbe9f9-release.war /opt/software/zrlog.war
-
部署代码
[root@web01 ~]# mv /opt/software/zrlog.war /opt/module/tomcat-8.5.87/webapps/
-
启动
tomcat
服务[root@web01 ~]# systemctl start tomcat
-
浏览器安装
http://192.168.2.104:8080/zrlog/install/
4)部署 Nginx
-
编辑
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;} }
-
刷新
Nginx
[root@web01 ~]# nginx -t [root@web01 ~]# nginx -s reload
-
配置
hosts
192.168.2.104 zrlog.cn
5)访问
-
用户端访问
http://zrlog.cn/zrlog/
-
管理端访问
http://zrlog.cn/zrlog/admin/
五:Tomcat + Nginx 动静分离
1)概述
📖Tomcat:主要用于处理动态请求(Java Servlet、JSP)。
📖Nginx:作为前端服务器,处理静态资源请求(HTML、CSS、JS、图片等),并将动态请求反向代理给 Tomcat。
目的:减轻 Tomcat 压力,提高静态资源访问速度,方便后续代码拆分和维护
2)部署
-
修改访问权限
确保 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
-
编辑
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;# 动态请求 -> Tomcatlocation / {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 天} }
-
刷新
Nginx
[root@web01 ~]# nginx -t [root@web01 ~]# nginx -s reload
六:Tomcat + HTTPS
1)概述
- Tomcat 本身支持 HTTPS,可以在
server.xml
中直接配置证书。 - 实际生产中,更推荐在 Nginx 层配置证书,Tomcat 只跑 HTTP(未加密),由 Nginx 做 TLS 终结,性能更好。
2)部署
- 上传证书 → 修改
server.xml
→ 配置 HTTPS Connector- 支持 PFX / JKS 格式证书
- 重启 Tomcat 后验证 8443 端口
- 可选:配置
web.xml
实现 HTTP 跳转 HTTPS
-
创建证书目录
[root@web01 ~]# mkdir -p /opt/module/cert/tomcat
-
创建自签名证书
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
-
修改
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"/>
-
-
配置 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
[root@web01 ~]# systemctl restart tomcat
-
验证
[root@web01 ~]# ss -lntup | grep 8443 tcp LISTEN 0 100 [::]:8443 [::]:* users:(("java",pid=130829,fd=57))
七:Tomcat 多实例
1)概述
- Tomcat 多实例:在同一台 Linux 主机上运行多个 Tomcat 进程,每个实例独立运行、互不干扰。
- 目的:
- 充分利用服务器资源
- 一个实例挂掉不影响其他实例
- 支持不同应用独立运行、隔离管理
2)部署
-
解压
JDK
二进制包[root@web02 ~]# tar -xzvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
-
解压
Tomcat
二进制包[root@web02 ~]# tar -xzvf /opt/software/apache-tomcat-8.5.87.tar.gz -C /opt/module/
-
准备两个
Tomcat
[root@web02 ~]# cd /opt/module[root@web02 module]# mv apache-tomcat-8.5.87/ tomcat1[root@web02 module]# cp -r tomcat1 tomcat2
-
修改
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
-
创建管理用户
[root@web02 ~]# useradd -Ms /sbin/nologin tomcat
-
修改
tomcat1
和tomcat2
所属[root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat1[root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat2
-
创建
tomcat1.service
和tomcat2.service
[root@web02 ~]# vim /etc/systemd/system/tomcat1.service
[Unitt] Description=Tomcat java web container After=network.target[Service] Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖) Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本 ExecStart=/opt/module/tomcat1/bin/startup.sh ExecStop=/opt/module/tomcat1/bin/shutdown.sh# 运行身份(推荐非 root) User=tomcat Group=tomcat[Install] WantedBy=multi-user.target
[root@web02 ~]# vim /etc/systemd/system/tomcat2.service
[Unitt] Description=Tomcat java web container After=network.target[Service] Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖) Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本 ExecStart=/opt/module/tomcat2/bin/startup.sh ExecStop=/opt/module/tomcat2/bin/shutdown.sh# 运行身份(推荐非 root) User=tomcat Group=tomcat[Install] WantedBy=multi-user.target
-
重新加载
systemctl
配置[root@web02 ~]# systemctl daemon-reload
-
启动服务
[root@hadoop105 module]# systemctl start tomcat1.service [root@hadoop105 module]# systemctl start tomcat2.service
总结
📌 本节重点回顾
-
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 企业级监控,迈向真正的生产级环境!