☰
Tomcat 9.0.117 Windows 部署指南:生产级配置与安全加固
2026/10/18 18:57:52 网站建设 项目流程

简介:本资源为Apache Tomcat 9.0.117官方Windows 64位发行版压缩包,面向Java Web初学者、后端开发人员及运维工程师,用于本地环境快速部署Servlet/JSP应用、学习容器原理与服务配置。压缩包共647个文件,涵盖221个HTML文档(含官方帮助页与示例页面)、99个class字节码与71个Java源码(便于理解核心组件如Connector与Container)、58个JSP示例、38个JAR依赖库、18个XML配置模板(如server.xml、web.xml),以及bat/sh启动脚本、PNG/SVG图标资源和properties配置文件等,结构完整,开箱即用。资源大小14.16MB,轻量易下载,适配现代Windows系统并支持Servlet 4.0、WebSocket 1.1等新规范。目前已有95人学习下载,读者可直接解压运行startup.bat启动服务,结合内置示例工程与配置文件深入理解Tomcat分层架构、线程池调优、安全加固及Web应用生命周期管理。

1. Apache Tomcat 9.0.117 Windows x64:不是“随便解压就能跑”的老版本,而是生产级 Java Web 容器在 Windows 环境下最稳的落地锚点

你手头这个apache-tomcat-9.0.117-windows-x64.zip文件,表面看只是个带版本号的压缩包,但实际它代表的是 Apache Tomcat 9 系列中最后一个正式发布的稳定维护版本(2023 年 10 月发布),也是目前 Windows Server 2016/2019/2022 环境下部署 Spring Boot 外置 WAR、遗留 Servlet 应用、JSP 管理后台时,兼容性、安全补丁覆盖度与 JVM 互操作性三者平衡得最扎实的一版。它不追求新特性(比如 Jakarta EE 9+ 的全量命名空间迁移),但把 TLS 1.3 支持、Windows 服务封装、JVM 内存模型适配、以及对 JDK 8u291–JDK 17 的跨版本运行保障,都打磨到了可写进运维手册的程度。如果你正面临:老旧 ERP 系统需迁移到新服务器、高校实验平台要求 Java Web 项目必须外置部署、或某监管系统明确限定容器版本为 “Tomcat 9.x”,那么这个 zip 包不是过渡选项,而是你当前技术栈里最值得信赖的“确定性入口”。它不炫技,但能让你少改一行代码、少调一次 GC 参数、少查一次 Windows 事件日志——这才是工程师真正需要的“稳”。


2. 解压即用?不,先做这三件事:环境校验、目录瘦身、服务注册

Tomcat 的“开箱即用”是建立在严格前提下的。直接双击startup.bat启动失败?90% 源于这三步没走实。我一般会在解压后立刻执行以下动作,顺序不能乱。

2.1 验证 JDK 版本与 JAVA_HOME 是否真正生效

Tomcat 9.0.117 明确要求JDK 8u291 或更高版本,且推荐使用 JDK 11/17 LTS。注意:仅安装 JDK 不够,JAVA_HOME必须指向 JDK 根目录(非 JRE),且该路径不能含中文、空格或特殊符号(如C:\Program Files\是雷区)。

# 在 CMD 中逐条执行,确认输出一致 echo %JAVA_HOME% java -version javac -version

提示:若java -version输出正常但javac -version报错,说明你装的是 JRE 而非 JDK;若%JAVA_HOME%显示为空,需手动设置系统环境变量(非用户变量),并重启 CMD。这是新手翻车第一高发点。

2.2 删除冗余目录,让部署结构更干净、更安全

官方 zip 包包含大量演示文件和文档,生产环境必须裁剪。进入解压后的apache-tomcat-9.0.117目录,执行以下清理(建议用 PowerShell 或资源管理器操作):

目录名是否删除原因说明
webapps/examples/✅ 必删内含大量可执行 JSP/Servlet 示例,存在信息泄露与 RCE 风险
webapps/docs/✅ 必删文档服务暴露 Tomcat 版本与配置细节,攻击面扩大
webapps/manager/和webapps/host-manager/⚠️ 按需保留若需远程热部署则保留,但必须后续重配访问权限(见 3.2 节)
conf/tomcat-users.xml⚠️ 必改默认无用户,但文件本身存在,需手动添加最小权限账号
logs/❌ 保留日志目录必须存在,否则启动失败

清理后,webapps/下应仅剩ROOT/(默认首页)、host-manager/(如启用)、manager/(如启用)三个目录,其他全部清空。这不是“省空间”,而是消除默认攻击路径。

2.3 将 Tomcat 注册为 Windows 服务:告别黑窗、实现开机自启与进程守护

解压版默认以控制台模式运行(startup.bat),但生产环境必须转为 Windows 服务。关键不是用service.bat install,而是用tomcat9.exe直接注册,并精确控制 JVM 参数:

# 进入 bin 目录,以管理员身份运行 CMD cd /d "C:\apache-tomcat-9.0.117\bin" # 注册服务(服务名为 "Tomcat9",显示名为 "Apache Tomcat 9.0.117") tomcat9 //IS//Tomcat9 ^ --DisplayName="Apache Tomcat 9.0.117" ^ --Install="C:\apache-tomcat-9.0.117\bin\tomcat9.exe" ^ --Jvm="auto" ^ --StartMode="jvm" ^ --StopMode="jvm" ^ --StartClass="org.apache.catalina.startup.Bootstrap" ^ --StartParams="start" ^ --StopClass="org.apache.catalina.startup.Bootstrap" ^ --StopParams="stop" ^ --LogPath="C:\apache-tomcat-9.0.117\logs" ^ --StdOutput="auto" ^ --StdError="auto" ^ --LogLevel="Info" ^ --JvmMs="512" ^ --JvmMx="2048"

逻辑说明://IS//表示 Install Service;--JvmMs/--JvmMx设置 JVM 初始/最大堆内存(单位 MB),这里设为 512MB/2048MB 是 Windows Server 下中等负载的保守值;--LogPath必须用绝对路径,且目录需提前存在并有写入权限。参数末尾的^是 CMD 续行符,不可删除。

注册成功后,在 Windows 服务管理器(services.msc)中即可看到 “Apache Tomcat 9.0.117”,右键启动即可。此时进程由svchost.exe托管,无黑窗、不随 CMD 关闭而退出。


3. 配置不是填空题:server.xml的 3 个必调参数与web.xml的安全加固

Tomcat 启动后能访问http://localhost:8080,不代表它已准备好承接生产流量。默认配置在安全性、性能和协议支持上均需显式干预。重点不在“改什么”,而在“为什么必须改”。

3.1conf/server.xml:关掉危险端口、启用 HTTPS、锁定连接器

打开conf/server.xml,定位<Connector>标签。默认有两个:HTTP(8080)和 AJP(8009)。按以下原则修改:

<!-- 1. 修改 HTTP 连接器:关闭重定向、限制协议、禁用 TRACE --> <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="200" minSpareThreads="10" disableUploadTimeout="true" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json" relaxedQueryChars="[]|{}^&#x5c;" relaxedPathChars="[]|{}^&#x5c;" /> <!-- 2. 注释掉 AJP 连接器(除非你明确用 Apache httpd 反向代理) --> <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> --> <!-- 3. 新增 HTTPS 连接器(需先配置证书,见 3.3 节) --> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/keystore.jks" keystorePass="changeit" keyAlias="tomcat" />

参数说明:

  • relaxedQueryChars/relaxedPathChars:Tomcat 9.0.117 默认严格校验 URL 字符,但某些前端框架(如 Vue Router history 模式)会生成含[]的路径,不加此参数将返回 400 错误;
  • compression="on":开启 GZIP 压缩,减少静态资源传输体积,对 JSP/HTML 页面效果显著;
  • AJP 端口(8009)是历史遗留协议,若无 Apache/Nginx 反向代理需求,必须注释,否则成为常见攻击入口。

3.2conf/web.xml:强制 HTTPS 重定向与敏感资源拦截

在conf/web.xml的<web-app>标签下末尾,追加以下安全约束(无需修改原有内容):

<!-- 强制所有请求走 HTTPS --> <security-constraint> <web-resource-collection> <web-resource-name>Protected Context</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <!-- 禁止访问 WEB-INF 和 META-INF 目录 --> <security-constraint> <web-resource-collection> <web-resource-name>Restrict WEB-INF and META-INF</web-resource-name> <url-pattern>/WEB-INF/*</url-pattern> <url-pattern>/META-INF/*</url-pattern> </web-resource-collection> <auth-constraint /> </security-constraint>

逻辑说明:第一段让所有http://请求自动 301 重定向到https://;第二段通过auth-constraint为空,拒绝任何用户访问WEB-INF/(含web.xml、classes/、lib/)和META-INF/,这是防止源码泄露的底线防护。

3.3 生成自签名证书并配置 HTTPS(无公网域名也可用)

即使没有公网域名,HTTPS 也应启用——它不仅是加密,更是现代浏览器对 CookieSecure属性、SameSite策略的强制前提。用 JDK 自带keytool生成:

# 在 CMD 中执行(路径需替换为你的 Tomcat conf 目录) cd /d "C:\apache-tomcat-9.0.117\conf" keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 ^ -storetype PKCS12 -keystore keystore.jks -validity 3650 ^ -storepass changeit -keypass changeit ^ -dname "CN=localhost, OU=IT, O=Company, L=City, ST=Province, C=CN"

参数说明:-keystore keystore.jks指定密钥库文件名(与server.xml中keystoreFile一致);-storepass和-keypass设为相同密码(changeit是 Tomcat 默认,可改但需同步更新server.xml);-dname中CN=localhost表示证书绑定本地回环,浏览器访问https://localhost:8443时会提示“证书不安全”,但可手动信任——这比 HTTP 明文传输强百倍。

生成后,重启 Tomcat 服务,访问https://localhost:8443即可验证。


4. 避坑:5 条血泪经验总结——那些官网不写、但上线前必踩的深坑

这些不是“可能遇到”,而是我在多个模拟项目 X 和某高校实验平台部署中,反复验证过的确定性陷阱。每一条都对应一个具体现象、根本原因和可立即执行的解决动作。

4.1 现象:服务启动后localhost:8080返回 404,但localhost:8080/manager可访问

原因:webapps/ROOT/目录被意外删除或内容为空。Tomcat 默认首页由webapps/ROOT/index.jsp或webapps/ROOT/index.html提供,若该目录不存在或为空,ROOT 应用不会部署,导致根路径 404。
解决:检查webapps/ROOT/是否存在且含至少一个 HTML/JSP 文件;若需自定义首页,确保ROOT/WEB-INF/web.xml中<welcome-file-list>正确声明,或直接放index.html在ROOT/下。

4.2 现象:部署 WAR 包后,应用能访问但中文参数乱码(如?name=张三变成?name=å¼ ä¸‰)

原因:HTTP 连接器未指定URIEncoding="UTF-8",Tomcat 默认用 ISO-8859-1 解码 URL。
解决:在conf/server.xml的 HTTP<Connector>标签内添加属性:URIEncoding="UTF-8",然后重启服务。这是 Windows 环境下最常漏配的编码项。

4.3 现象:Windows 服务启动失败,事件查看器报错 “Failed to start service. JVM exited unexpectedly.”

原因:JAVA_HOME路径含空格(如C:\Program Files\Java\jdk-11.0.18),tomcat9.exe无法正确解析路径。
解决:卸载当前 JDK,重新安装到无空格路径(如C:\jdk11),更新JAVA_HOME,再用tomcat9 //US//Tomcat9 --Jvm="%JAVA_HOME%\bin\server\jvm.dll"重新注册服务。

4.4 现象:manager页面登录失败,conf/tomcat-users.xml已添加用户但提示“Access denied”

原因:Tomcat 9 默认关闭了manager应用的远程访问权限,仅允许localhost访问。即使用户名密码正确,从其他 IP 登录也会被拒。
解决:编辑webapps/manager/META-INF/context.xml,注释掉<Valve>标签内的allow属性限制:

<!-- 注释掉这一行 --> <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

保存后重启服务。生产环境请改用更细粒度的 IP 白名单。

4.5 现象:应用日志中频繁出现SEVERE [main] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [...] java.lang.ClassNotFoundException

原因:WAR 包内WEB-INF/lib/缺少某个 Filter 依赖的 JAR,或该 JAR 与 Tomcat 自带的 JAR(如servlet-api.jar)冲突。
解决:检查CATALINA_HOME/lib/与WEB-INF/lib/是否存在同名不同版本的 JAR(如commons-lang3-3.12.0.jar与commons-lang3-3.8.1.jar);若有,删除CATALINA_HOME/lib/中旧版,或在WEB-INF/web.xml中为该 Filter 添加<async-supported>false</async-supported>(部分老 Filter 不支持异步)。


5. 进阶技巧:用setenv.bat精准控制 JVM 参数,绕过catalina.bat的硬编码陷阱

Tomcat 启动脚本catalina.bat里写死了部分 JVM 参数(如-Djava.util.logging.config.file),直接修改它会导致升级时被覆盖。正确做法是创建bin/setenv.bat—— Tomcat 启动时会自动加载此文件,且优先级高于内置配置。这是我部署模拟项目 X 时,为解决 GC 日志轮转和线程栈深度问题总结出的最可靠方式。

5.1 创建setenv.bat并注入生产级 JVM 参数

在bin/目录下新建文本文件,命名为setenv.bat(注意扩展名是.bat,非.txt),内容如下:

@echo off rem 设置 JVM 内存与 GC 日志 set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx2048m set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC -XX:MaxGCPauseMillis=200 set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails -XX:+PrintGCTimeStamps set JAVA_OPTS=%JAVA_OPTS% -Xloggc:"C:\apache-tomcat-9.0.117\logs\gc.log" set JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M rem 设置时区与文件编码(Windows 下尤其重要) set JAVA_OPTS=%JAVA_OPTS% -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 rem 禁用 RMI 服务器(避免端口冲突) set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote=false rem 设置应用上下文路径(可选) set JAVA_OPTS=%JAVA_OPTS% -Dcatalina.base="C:\apache-tomcat-9.0.117"

关键参数说明:

  • -XX:+UseG1GC:G1 垃圾收集器在多核 Windows 服务器上表现更稳,-XX:MaxGCPauseMillis=200设定目标停顿时间;
  • -Xloggc+-XX:+UseGCLogFileRotation:开启 GC 日志并自动轮转,避免单个日志文件无限增长;
  • -Duser.timezone=GMT+08:强制 JVM 使用东八区时区,解决new Date()时间偏移问题;
  • -Dcom.sun.management.jmxremote=false:显式关闭 JMX 远程管理(默认开启),防止端口 1099 被扫描。

5.2 验证setenv.bat是否生效:三步确认法

不要只信“写了就有效”。我习惯用以下方法交叉验证:

  1. 查进程参数:启动 Tomcat 服务后,打开任务管理器 → 详细信息 → 找到java.exe进程 → 右键“转到服务” → 确认关联服务为Tomcat9;右键“属性” → “详细信息” → 查看“命令行”列,确认-Xms1024m等参数已出现在字符串中;
  2. 看日志输出:启动后检查logs/catalina.out(或logs/catalina.yyyy-mm-dd.log),搜索JAVA_OPTS,应看到类似Picked up JAVA_TOOL_OPTIONS: ...的提示;
  3. 运行时检测:部署一个简单 Servlet,用System.getProperty("sun.java.command")打印启动命令,或用ManagementFactory.getRuntimeMXBean().getInputArguments()获取 JVM 参数列表。

5.3 一个真实场景:解决 Windows 下java.io.tmpdir权限不足导致的上传失败

某次部署某图像处理 Demo 时,用户上传图片总报java.io.IOException: Permission denied。排查发现是 Tomcat 默认java.io.tmpdir指向C:\Users\<user>\AppData\Local\Temp,而 Windows 服务以LocalSystem账户运行,无权写入用户临时目录。解决方案就是在setenv.bat中显式指定:

rem 在 setenv.bat 末尾追加 set JAVA_OPTS=%JAVA_OPTS% -Djava.io.tmpdir="C:\apache-tomcat-9.0.117\temp"

然后手动创建C:\apache-tomcat-9.0.117\temp目录,并赋予SYSTEM用户完全控制权限(右键目录 → 属性 → 安全 → 编辑 → 添加SYSTEM→ 勾选“完全控制”)。重启服务后上传即恢复正常。

这就是setenv.bat的价值:它不修改 Tomcat 源码,不碰启动脚本,却能精准外科手术式地修复 Windows 环境下那些“看似奇怪、实则必然”的权限与路径问题。我已把它列为每次部署 Tomcat 9.0.117 的标准动作,就像系安全带一样自然。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询