Java Tomcat 完整教程
目录
-
第一部分:基础入门
(图片来源网络,侵删)- 1 什么是 Tomcat?
- 2 Tomcat 的核心组件
- 3 Tomcat 与 Java EE 的关系
- 4 环境准备:安装 JDK
-
第二部分:安装与启动
- 1 下载 Tomcat
- 2 Windows 环境安装与启动
- 3 Linux/macOS 环境安装与启动
- 4 验证 Tomcat 是否运行成功
-
第三部分:核心配置
- 1
server.xml文件详解 - 2 修改端口号(避免冲突)
- 3 部署应用(三种方式)
- 4 配置虚拟主机
- 5 日志配置
- 1
-
第四部分:Web 应用部署实战
- 1 创建一个简单的 Java Web 应用
- 2 方式一:手动部署(复制 WAR 包)
- 3 方式二:使用 Tomcat Manager 部署
- 4 方式三:IDE(如 IntelliJ IDEA/Eclipse)集成部署
-
第五部分:进阶主题
(图片来源网络,侵删)- 1 配置数据源
- 2 配置 SSL/TLS (HTTPS)
- 3 性能调优(JVM、连接池等)
- 4 日志管理
-
第六部分:常见问题与故障排查
- 1 端口被占用
- 2 应用无法访问 (404, 500)
- 3 内存溢出
- 4 查看日志
第一部分:基础入门
1 什么是 Tomcat?
Apache Tomcat(简称 Tomcat)是一个开源的、轻量级的 Web 应用服务器和 Servlet 容器,它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language 和 Java WebSocket 规范。
- Web 服务器:负责处理 HTTP 请求和响应,Nginx、Apache HTTP Server。
- 应用服务器:除了 HTTP 服务,还提供了更复杂的服务,如事务管理、数据库连接池等,WebLogic、WebSphere。
- Servlet 容器:这是 Tomcat 的核心身份,它是一个“环境”,专门用来运行 Java Servlet 和 JSP 应用,Tomcat 本身不包含完整的 Java EE 实现,但它是运行 Java Web 应用的理想选择。
2 Tomcat 的核心组件
理解 Tomcat 的目录结构和核心组件至关重要。
bin: 存放启动和关闭 Tomcat 的脚本 (.sh/.bat)。conf: 存放核心配置文件,最重要的是server.xml。webapps: Web 应用部署目录,你所有的 Java Web 应用(通常打包成.war文件)放在这里,Tomcat 会自动部署。logs: 存放 Tomcat 的日志文件(catalina.out,localhost.xxxx.log等),排查问题时首先要看这里。temp: Tomcat 运行时产生的临时文件。work: JSP 文件被编译成 Servlet 后生成的.java和.class文件存放的地方。lib: 存放 Tomcat 自身所需的库文件。
3 Tomcat 与 Java EE 的关系
Java EE 是一个庞大的规范集合,包含 EJB、JMS、JPA 等,而 Tomcat 只实现了其中最核心的 Web 部分(Servlet/JSP),Tomcat 非常轻量、快速、资源占用少,非常适合开发和部署中小型 Web 应用,以及作为大型应用的前端服务器。

4 环境准备:安装 JDK
Tomcat 是用 Java 编写的,所以必须先安装 Java Development Kit (JDK)。
- 下载 JDK:从 Oracle 官网 或 OpenJDK 官网 下载。
- 安装 JDK:按照安装向导进行安装。
- 配置环境变量:
JAVA_HOME: 指向 JDK 的安装根目录(C:\Program Files\Java\jdk-17)。PATH: 在PATH变量中添加%JAVA_HOME%\bin(Windows) 或$JAVA_HOME/bin(Linux/macOS)。
- 验证安装:打开命令行,输入
java -version和javac -version,如果显示版本号,则说明安装成功。
第二部分:安装与启动
1 下载 Tomcat
- 访问 Tomcat 官网下载页面。
- 选择 "Core" 下的 "Binary Distributions"。
- 选择适合你操作系统的版本(如 64-bit Windows ZIP 或 64-bit Linux tar.gz)。
- 下载后解压到你喜欢的目录,
D:\apache-tomcat-9.0.85或/opt/apache-tomcat-9.0.85。
2 Windows 环境安装与启动
- 进入 Tomcat 的
bin目录。 - 双击
startup.bat文件,会弹出一个命令行窗口,显示启动信息。 - 看到
Server startup in xxx ms表示启动成功。
3 Linux/macOS 环境安装与启动
- 进入 Tomcat 的
bin目录。 - 给
startup.sh和shutdown.sh赋予执行权限:chmod +x startup.sh shutdown.sh
- 执行启动脚本:
./startup.sh
- 你会看到类似
Using CATALINA_BASE: /opt/apache-tomcat-9.0.85的输出。
4 验证 Tomcat 是否运行成功
打开你的浏览器,访问 http://localhost:8080。
如果看到 Tomcat 的欢迎页面,则说明 Tomcat 已经成功运行!
第三部分:核心配置
1 server.xml 文件详解
conf/server.xml 是 Tomcat 的主配置文件,它定义了 Tomcat 的整体结构,最重要的元素包括:
<Server>: 代表整个 Tomcat 实例。<Service>: 一组<Connector>和一个<Engine>的组合。<Engine>: 处理所有来自<Connector>的请求,并将其传递给相应的<Host>。<Host>: 一个虚拟主机,对应一个或多个 Web 应用,默认的Host是localhost,对应webapps目录。<Connector>: 负责接收客户端的 HTTP 请求,可以配置不同的端口、协议等。<Context>: 代表一个具体的 Web 应用,通常我们推荐在webapps目录下创建应用目录,而不是直接在这里配置。
2 修改端口号(避免冲突)
默认的 HTTP 端口是 8080,如果这个端口被其他程序占用,Tomcat 会启动失败。
编辑 conf/server.xml,找到 <Connector> 元素,修改 port 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
你可以将其改为 8081 或其他未被占用的端口。
3 部署应用(三种方式)
部署 Web 应用主要有三种方式:
-
复制到
webapps目录(最常用): 将你的 Web 应用打包成.war文件,然后直接复制到webapps目录下,Tomcat 会自动解压并部署它。- 将
myapp.war复制到webapps,访问地址就是http://localhost:8080/myapp。
- 将
-
在
server.xml中配置<Context>: 在<Host>元素内部添加<Context><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="D:/my_custom_app" path="/myapp" reloadable="true"/> </Host>docBase: 指向你的应用根目录(可以是.war文件路径或文件夹路径)。path: 访问该应用的 URL 路径。- 注意:官方不推荐直接修改
server.xml,因为重启后配置可能丢失,推荐使用第三种方式。
-
使用
context.xml文件(推荐): 在conf/Catalina/localhost/目录下创建一个与你的应用同名的 XML 文件,要部署一个名为myapp的应用,创建conf/Catalina/localhost/myapp.xml文件。<!-- conf/Catalina/localhost/myapp.xml --> <Context docBase="D:/my_custom_app" reloadable="true"/>
- 这样做的好处是配置与应用分离,且不需要修改主
server.xml。 path会自动取文件名,即myapp。
- 这样做的好处是配置与应用分离,且不需要修改主
4 配置虚拟主机
虚拟主机允许你在一个 Tomcat 实例上运行多个域名网站。
-
修改
conf/server.xml: 在<Engine>标签内添加新的<Host>。<Engine name="Catalina" defaultHost="localhost"> <!-- 默认的 localhost 主机 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> <!-- 新增的虚拟主机 www.example.com --> <Host name="www.example.com" appBase="webapps/example_com" unpackWARs="true" autoDeploy="true"> </Host> </Engine> -
配置 DNS:确保
www.example.com的域名解析到你服务器的 IP 地址。 -
创建目录:在
webapps下创建example_com目录,并将网站文件放入其中。
5 日志配置
默认情况下,所有日志都输出到 logs/catalina.out(Linux)或 logs/catalina.YYYY-MM-DD.log(Windows)。
你可以通过修改 conf/logging.properties 来配置更精细的日志策略,比如按日期分割日志、不同级别日志输出到不同文件等。
第四部分:Web 应用部署实战
1 创建一个简单的 Java Web 应用
-
创建项目目录结构:
myapp/ ├── src/ │ └── com/ │ └── example/ │ └── HelloServlet.java ├── web/ │ └── WEB-INF/ │ ├── web.xml │ └── lib/ └── pom.xml (如果使用 Maven) -
编写
HelloServlet.java:package com.example; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); resp.getWriter().println("<h1>Hello from Tomcat!</h1>"); } } -
配置
web.xml:<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> -
编译并打包成 WAR: 使用 IDE(如 IntelliJ IDEA)或 Maven 命令
mvn clean package,会生成一个myapp.war文件。
2 方式一:手动部署(复制 WAR 包)
- 将
myapp.war复制到 Tomcat 的webapps目录。 - 启动(或重启)Tomcat。
- Tomcat 会自动解压
myapp.war。 - 访问
http://localhost:8080/myapp/hello,你应该能看到 "Hello from Tomcat!"。
3 方式二:使用 Tomcat Manager 部署
Tomcat Manager 是一个 Web 应用,用于管理部署在 Tomcat 上的应用。
- 配置用户权限:
编辑
conf/tomcat-users.xml,添加一个具有manager-gui和manager-script角色的用户。<tomcat-users xmlns="http://tomcat.apache.org/xml.tomcat-users.xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml.tomcat-users.xml http://tomcat.apache.org/xml.tomcat-users.xsd"> <role rolename="manager-gui"/> <role rolename="manager-script"/> <user username="admin" password="password" roles="manager-gui,manager-script"/> </tomcat-users> - 访问 Manager App:
启动 Tomcat 后,访问
http://localhost:8080/manager/html。 - 部署应用:
- 输入用户名和密码登录。
- 在 "WAR file to deploy" 部分,点击 "Choose File" 选择你的
myapp.war。 - 点击 "Deploy"。
4 方式三:IDE(如 IntelliJ IDEA/Eclipse)集成部署
现代 Java IDE 都内置了对 Tomcat 的完美支持。
- 配置 Tomcat 服务器: 在 IDE 中,添加一个 Tomcat 服务器实例,并指向你的 Tomcat 安装目录。
- 部署应用:
在 "Artifacts" 或 "Deployment" 选项卡中,将你的 Web 应用项目添加到 Tomcat 服务器上。
- 启动和调试: IDE 会自动编译你的代码、打包成 WAR 并部署到 Tomcat,然后启动服务器,你可以在 IDE 中直接进行断点调试,非常方便。
第五部分:进阶主题
1 配置数据源
在 Web 应用中,通常需要连接数据库,将数据库连接池配置在 Tomcat 中,可以让所有应用共享,提高资源利用率。
- 创建数据源配置文件:
在
conf/Catalina/localhost/目录下创建一个your_app.xml文件(your_app是你的应用名)。<?xml version="1.0" encoding="UTF-8"?> <Context> <!-- Resource definition for a MySQL DataSource --> <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="dbuser" password="dbpassword" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC"/> </Context> - 在应用中使用数据源:
在你的 Java 代码中,通过 JNDI (Java Naming and Directory Interface) 查找数据源。
// InitialContext ctx = new InitialContext(); // Java 8 Context ctx = new InitialContext(); // Java 11+ DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB"); Connection conn = ds.getConnection(); // ... 使用 conn 进行数据库操作 ...
2 配置 SSL/TLS (HTTPS)
为 Tomcat 配置 HTTPS 可以保障数据传输安全。
- 获取证书:
你可以从证书颁发机构购买,或者使用
keytool生成一个自签名的证书用于开发环境。keytool -genkeypair -alias tomcat -keyalg RSA -keystore keystore.jks -storepass password -keypass password
- 配置
server.xml: 在<Service>标签内添加一个<Connector>,并配置 SSL 相关属性。<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="httpss" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/keystore.jks" keystorePass="password"/> - 访问:现在可以通过
https://localhost:8443访问你的应用了。
3 性能调优
- JVM 内存调优:在
bin/catalina.sh(Linux) 或bin/catalina.bat(Windows) 中设置JAVA_OPTS。export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m"
-Xms: JVM 初始堆内存大小。-Xmx: JVM 最大堆内存大小,这是最重要的调优参数。
- 连接池调优:调整
<Connector>中的maxThreads(最大线程数)、acceptCount(等待队列长度)等参数。 - 使用 AJP 协议:Tomcat 通常作为后端应用服务器,Nginx 或 Apache 作为前端反向代理,它们之间可以通过 AJP 协议通信,性能比 HTTP 更好。
4 日志管理
- 使用
log4j2或Logback:虽然 Tomcat 自带了 JULI (Java Util Logging Implementation),但强烈建议在你的 Web 应用中使用更强大的日志框架如Log4j2或Logback。 - 配置:在你的应用中添加
log4j2.xml或logback.xml配置文件,可以灵活地控制日志的输出格式、级别和目的地(文件、控制台等)。
第六部分:常见问题与故障排查
1 端口被占用
- 现象:启动
startup.sh或startup.bat后,窗口一闪而过,或者提示Port already in use。 - 解决:
- 查找占用端口的进程:
netstat -ano | findstr :8080(Windows) 或lsof -i :8080(Linux/macOS)。 - 根据找到的 PID(进程 ID),使用
taskkill /PID <PID> /F(Windows) 或kill -9 <PID>(Linux/macOS) 结束进程。 - 或者,直接修改
server.xml中的Connector端口。
- 查找占用端口的进程:
2 应用无法访问 (404, 500)
- 404 Not Found:
- URL 错误:检查 URL 路径是否正确,包括应用名和 Servlet 路径。
- 应用未部署:检查
.war文件是否在webapps目录下,是否已解压。 web.xml配置错误:检查<servlet-mapping>中的<url-pattern>是否与请求的 URL 匹配。
- 500 Internal Server Error:
- 这是服务器端错误,最直接的方法是查看日志!
- 检查
logs/catalina.out或logs/localhost.<日期>.log文件,找到具体的错误堆栈信息(java.lang.NullPointerException等),根据错误信息定位代码问题。
3 内存溢出
- 现象:Tomcat 启动后运行一段时间就卡死,日志中出现
OutOfMemoryError: Java heap space。 - 解决:
- 增加 JVM 内存:如 5.3 节所述,调大
-Xmx的值。 - 检查内存泄漏:可能是你的应用没有正确释放资源(如数据库连接、文件流等),使用工具如 VisualVM(JDK 自带)或 MAT (Memory Analyzer Tool) 来分析堆内存,找出泄漏的对象。
- 增加 JVM 内存:如 5.3 节所述,调大
4 查看日志
logs/catalina.out/catalina.YYYY-MM-DD.log:Tomcat 的核心日志,记录了启动、关闭、严重错误等信息。logs/localhost.<日期>.log:与特定主机(默认是localhost)相关的应用日志。logs/manager.<日期>.log:Tomcat Manager 应用的日志。- 使用
tail命令:在 Linux 下,可以使用tail -f logs/catalina.out实时查看日志输出,这对于调试非常有用。
