Tomcat

Tomcat

Tomcat 是一个 Java Servlet 容器(应用服务器),用于运行 Java web 应用(Servlet / JSP / WAR)。
Nginx 不是 Servlet 容器——它不能直接运行 Java servlet,但常用于静态文件、反向代理、负载均衡和 TLS 终端,通常会把请求转发到 Tomcat 或其他应用服务器。

下载与安装

  • 官方下载地址:https://tomcat.apache.org/
  • 解压(或安装)后进入 Tomcat 根目录。Windows 下启动脚本位于 bin\startup.bat(或 catalina.bat),Linux/macOS 下为 bin/startup.sh(或 catalina.sh)。生产环境通常使用 systemd 服务或进程管理器来启动和守护 Tomcat(不要直接在生产机上双击脚本)。
  • 环境变量:确保系统已安装合适版本的 Java 并设置 JAVA_HOME(以及可选的 CATALINA_HOME / CATALINA_BASE)。在选择 Tomcat 版本前,请先确认该 Tomcat 对应的 JDK/Java 要求(参见 Tomcat 官方的“Which version” 页面)。

本地截图

image-20251020115944381

image-20251020115936464

关于 Java EE / Jakarta EE(简明)

  1. 背景:Oracle 在 2017 年把 Java EE 移交给 Eclipse Foundation,随后更名为 Jakarta EE。:contentReference[oaicite:4]{index=4}
  2. 包名变化:从 Jakarta EE 9 开始,标准 API 的包名由 javax.* 迁移为 jakarta.*。这会导致依赖旧 javax.* 的应用在 Tomcat 10(及更高、基于 Jakarta API 的容器)上无法直接运行,除非进行迁移或使用兼容工具。:contentReference[oaicite:5]{index=5}
  3. 实务建议
    • 如果你的项目还使用 javax.*(很多老项目/第三方库如此),可以继续使用 Tomcat 9.x(兼容 javax)直到完成迁移;
    • 或者使用 Apache Tomcat 的迁移工具(migration tool for Jakarta EE)将已有的 WAR/binaries 从 javax 转为 jakarta;也可以在源码层面升级依赖并重新编译。:contentReference[oaicite:6]{index=6}

部署(常用方法)

  • 直接部署 WAR:把 yourapp.war 拷贝到 Tomcat 的 webapps/ 目录,Tomcat 会自动展开并部署(默认)。这是最简单的本地部署方式。:contentReference[oaicite:7]{index=7}
  • 使用 Manager:通过 Tomcat Manager 可以网页方式或 HTTP 接口部署、卸载应用;需要在 conf/tomcat-users.xml 为管理用户配置 manager-gui / manager-script 等角色。开发/测试环境常用此方式。:contentReference[oaicite:8]{index=8}
  • 其它方式:还可以使用 CI/CD 工具、远程部署脚本或 Tomcat Deployer 客户端等流程化部署方式(适合生产)。:contentReference[oaicite:9]{index=9}

常见配置与注意事项

  • 默认端口8080(在 conf/server.xml 中可修改)。
  • 安全建议:不要直接把 Tomcat 端口暴露在公网;在生产环境常见做法是把 Nginx 放在前面做反向代理、TLS 终端和静态资源处理,Tomcat 只监听内网访问。
  • JDK 版本:务必根据你选的 Tomcat 版本检查所需的 Java 版本(64-bit),并使用受支持的 JDK。官方“Which version”页面有对应表格。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF)...
(原始许可证头略)
-->

<!-- 顶层 Server 元素:代表 Tomcat 实例级别的配置(不是容器本身)
主要属性:
port: 用于监听关闭命令的端口。默认通常是 8005。设置为 -1 则禁用通过端口关闭(更安全)。
shutdown: 发送到 port 的字符串命令,若匹配则触发正常关闭。
-->
<Server port="-1" shutdown="SHUTDOWN">

<!-- 下面是若干 Listener(监听器),在 Tomcat 启动/关闭过程中执行初始化或清理工作 -->

<!-- 记录版本信息(启动时打印 Tomcat/组件版本)-->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />

<!-- 可选的安全监听器(已注释),用于增强安全相关初始化 -->
<!--
<Listener className="org.apache.catalina.security.SecurityListener" />
-->

<!-- APR(Tomcat Native / OpenSSL)生命周期监听器,
当安装了 Tomcat Native / APR 时可以使用以提升性能/SSL 支持。
注意:需要额外本地库,非必须。
-->
<Listener className="org.apache.catalina.core.AprLifecycleListener" />

<!-- OpenSSL 的替代(基于 Java 22 的 FFM API)示例(被注释)。
如果启用,和 AprLifecycleListener 的作用类似:提供 OpenSSL 支持。
-->
<!-- <Listener className="org.apache.catalina.core.OpenSSLLifecycleListener" /> -->

<!-- 防止常见的 JRE/JEE API 导致的内存泄漏(如 JDBC 驱动、线程本地变量等) -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

<!-- 管理全局 JNDI 资源的生命周期(例如全局 DataSource、UserDatabase) -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

<!-- 预防 ThreadLocal 导致的泄漏(在某些类库使用 ThreadLocal 时有帮助) -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

<!-- 全局 JNDI 资源(GlobalNamingResources)
在这里定义的资源可以被 webapp 或 Realm 等通过 JNDI 引用。
-->
<GlobalNamingResources>
<!-- UserDatabase:内存可编辑的用户数据库资源示例
属性说明:
name: JNDI 名称(引用该资源时使用的名字)
auth: Container / Application(谁来管理认证)
type: Java 类型(接口/类)
description: 描述
factory: 生产该资源实例的工厂类
pathname: 资源的数据文件路径,这里指向 conf/tomcat-users.xml(保存用户和角色)
-->
<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:一个 Service 下可以包含多个 Connector(端点),共享同一个 Engine(容器)
name: 服务名(任意,例如 "Catalina")
-->
<Service name="Catalina">

<!-- Executor:可选的线程池定义(被注释)。
定义后多个 Connector 可以复用同一个线程池(通过 executor 属性)。
属性示例:
name: 线程池名字
namePrefix: 线程名前缀
maxThreads: 最大线程数
minSpareThreads: 最少空闲线程
-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->

<!-- Connector:表示接受请求的网络端点(HTTP、AJP 等)
常见属性:
port: 监听端口(例如 8080)
protocol: 协议实现(HTTP/1.1、AJP/1.3 或特定的 Http11NioProtocol 等)
connectionTimeout: 毫秒为单位,连接空闲或等待时间
redirectPort: 当需要 SSL 时重定向到的端口(通常 8443)
executor: 指向上面定义的线程池名字(如果使用共享线程池)
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

<!-- 如果使用共享线程池 (Executor),Connector 可以写成下面这种形式(示例被注释) -->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->

<!-- SSL/TLS Connector 示例(注释掉),展示如何配置 HTTPS(8443)和 HTTP/2
重要点:
SSLEnabled="true" 开启 SSL
使用 <SSLHostConfig> 和 <Certificate> 指定 keystore 或证书信息
可以选用不同的协议实现(NIO、APR 等)
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<!-- 启用 HTTP/2 协议支持 -->
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
certificateKeystorePassword="changeit" type="RSA" />
</SSLHostConfig>
</Connector>
-->

<!-- AJP Connector 示例(注释)
AJP(Apache JServ Protocol)常用于与前端服务器(如 Apache httpd 或早期的代理)通信。
安全提醒:AJP 在过去存在配置不当导致远程代码执行的高危问题(如 Ghostcat),
因此如果不使用最好禁用,或限制绑定地址为本地回环并做访问控制。
常用属性:
protocol="AJP/1.3"
address: 绑定地址(可限制为 127.0.0.1 或 ::1)
port: AJP 端口(默认 8009)
-->
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->

<!-- Engine:Catalina 引擎,处理所有请求并根据 Host 分发
常用属性:
name: 引擎名字
defaultHost: 默认虚拟主机(Host)的名字(当请求不匹配任何 Host 时使用)
jvmRoute: 用于负载均衡和 session 粘滞(在使用 AJP / 负载均衡器时有用)
-->
<!-- 说明:建议在使用集群或负载均衡时配置 jvmRoute(eg. jvm1、jvm2) -->
<Engine name="Catalina" defaultHost="localhost">

<!-- Cluster(集群)配置示例(被注释)。如需启用会话复制等功能,可参考文档 -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->

<!-- Realm(身份认证与授权)配置:
外层 LockOutRealm 用来保护内部 Realm,防暴力破解(如超过失败次数会锁定账户)。
内层 UserDatabaseRealm 从全局 JNDI 的 UserDatabase(conf/tomcat-users.xml)读取用户/角色信息。
常用 Realm 类型还有 JDBCRealm、DataSourceRealm、JNDIRealm 等(用于生产环境接 LDAP/DB)。
-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- 这里的 UserDatabaseRealm 使用 GlobalNamingResources 中的 UserDatabase 资源 -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>

<!-- Host:表示一个虚拟主机(virtual host)
常用属性:
name: 主机名(必须对应请求的 Host header 或者是 defaultHost)
appBase: webapp 存放目录(相对于 CATALINA_BASE 或绝对路径)
unpackWARs: 是否自动解压 war 包(true/false)
autoDeploy: 是否在运行时自动扫描并部署 webapps(开发方便,生产通常禁用)
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn Valve(注释)
用途:在同一 Engine 内的多个 webapp 之间共享认证信息(登录一次,多个应用免登陆)。
注意:使用 SSO 时需评估安全性与会话管理。
-->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- AccessLogValve:访问日志记录器
常用属性:
className: 实现类
directory: 日志输出目录(相对于 CATALINA_BASE)
prefix/suffix: 日志文件前后缀
pattern: 日志格式(类似 Apache httpd 的格式,Tomcat 支持很多占位符)
pattern 示例中:
%h 客户端 IP
%l 远程逻辑用户(通常为 -)
%u 认证用户名
%t 时间
"%r" 请求第一行(方法与 URL 与 协议)
%s 状态码
%b 返回字节数
-->
<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>
</Engine>
</Service>
</Server>

快速参考(链接)