简介:本资源为Linux平台下Apache Tomcat 8.5.35官方发行版二进制包,面向Java Web开发者、运维工程师及高校教学实践者,用于快速搭建轻量级Servlet容器环境,支撑Web应用开发、测试与部署。压缩包共645个文件,涵盖236个HTML文档(含官方帮助页与示例页面)、100个class字节码文件、75个Java源码(供调试参考)、59个JSP示例模板、31个JAR依赖库、16个XML配置文件(如server.xml、web.xml等核心配置),以及startup.sh/shutdown.sh等9个Linux启动脚本,完整呈现Tomcat标准目录结构与运行时组件。资源大小9.2MB,解压即用,无需编译。目前已有556人学习下载,读者可直接获取包含Catalina容器、Jasper引擎、Coyote连接器及完整conf/bin/webapps/logs等关键目录的开箱即用环境,便于深入理解Servlet生命周期、JSP编译机制、HTTPS配置方法及WAR自动部署流程。
1. Tomcat 8.5.35 在 Linux 上不是“装完就能跑”,而是“装错一个路径就 404 到怀疑人生”
你手头刚下载好tomcat8-8.5.35.tar.gz,解压、启动、浏览器敲http://localhost:8080——结果页面空白,连经典的猫图标都不见。别急着重装,这大概率不是你操作失误,而是 Tomcat 8.5.35 这个生命周期已结束但仍在大量生产环境服役的 LTS 版本,对 JDK 版本、用户权限、SELinux 策略、甚至$CATALINA_HOME路径里的空格都极其敏感。我见过太多人卡在「明明startup.sh显示 started,却死活打不开管理页」,最后发现是 JDK 11 悄悄替换了系统默认的 JDK 8,或者/opt/tomcat目录被 systemd 服务单元文件硬编码了旧路径。这套环境不是给新手练手的玩具,而是某高校实验室部署十年未大修的教务系统后台、某公司遗留 ERP 的 Web 容器、某跨平台系统中稳定扛住日均 20 万请求的 Java Web 基座。它不时髦,但够稳;不自动,但可溯;不宽容,但有迹可循。本文只讲一件事:用最贴近真实运维现场的方式,把tomcat8-8.5.35.tar.gz在主流 Linux 发行版(CentOS 7/8、Ubuntu 20.04/22.04)上,从零配到能进 Manager 页面、能部署 WAR、能查日志定位问题——每一步命令都带后果说明,每个报错都对应可验证的修复动作。
2. 下载、解压与基础目录结构:别跳过 tar.gz 解压时的三个隐藏陷阱
Tomcat 8.5.35 是 Apache 官方于 2018 年 11 月发布的版本,属于 Tomcat 8.x 系列最后一个功能更新版(后续仅发布安全补丁),官方已归档至 archive.apache.org 。它不提供.deb或.rpm包,纯tar.gz分发,这意味着所有路径、权限、环境变量都得你亲手定义。跳过这步细节,后面 90% 的 404、403、Permission denied 都源于此。
2.1 下载源与校验:为什么必须核对 SHA512?
虽然tomcat8-8.5.35.tar.gz名字明确,但网络传输或镜像站缓存可能引入损坏。Apache 官方为每个发布包提供 SHA512 校验值,这是防止“下载了个假包”的后悔药。
# 进入临时工作目录(避免污染 /root 或家目录) cd /tmp # 下载主包 + 对应的 SHA512 校验文件(注意:不是 .sha,是 .sha512) curl -O https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz curl -O https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz.sha512 # 校验(输出 'OK' 表示无误) sha512sum -c apache-tomcat-8.5.35.tar.gz.sha512提示:如果提示
sha512sum: apache-tomcat-8.5.35.tar.gz: No such file or directory,说明文件名不匹配。官方包名是apache-tomcat-8.5.35.tar.gz,不是tomcat8-8.5.35.tar.gz——后者多为国内镜像站或个人重命名,务必以官网包名为准,否则后续配置文档路径全错。
2.2 解压位置选择:为什么/opt/tomcat是运维共识?
Linux 系统中,第三方独立软件(非包管理器安装)约定俗成放在/opt。Tomcat 不同于 Nginx 或 MySQL,它不写系统级配置,所有运行时数据都在自身目录下,因此/opt/tomcat是最干净、最易备份、最不易被yum update或apt upgrade波及的位置。
# 创建专用用户(安全基线要求:绝不以 root 启动 Tomcat) sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat # 解压到 /opt,并重命名为规范目录名(去掉版本号便于后续升级) sudo tar xzvf apache-tomcat-8.5.35.tar.gz -C /opt/ sudo mv /opt/apache-tomcat-8.5.35 /opt/tomcat # 修正所有权:tomcat 用户拥有全部,组为 tomcat sudo chown -R tomcat:tomcat /opt/tomcat sudo chmod -R u+x /opt/tomcat/bin/逻辑说明:
-r创建系统用户(UID < 1000),无登录 shell;-m自动创建家目录(虽设为/opt/tomcat,但确保路径存在);-U创建同名组;chown -R tomcat:tomcat是关键——若遗漏,startup.sh可能因无权读取conf/server.xml而静默失败;chmod -R u+x /opt/tomcat/bin/确保catalina.sh、startup.sh等脚本可执行(某些发行版解压后权限为 644)。
2.3 目录结构速览:哪些子目录你必须盯紧?
解压后/opt/tomcat结构如下(精简核心):
| 目录 | 作用 | 运维关注点 |
|---|---|---|
bin/ | 启动/停止脚本、JVM 参数配置 | setenv.sh必须手动创建,否则无法调优内存 |
conf/ | 主配置文件 | server.xml(端口/Connector)、tomcat-users.xml(管理页账号)、web.xml(全局 Servlet 映射) |
logs/ | 运行日志 | catalina.out是标准输出重定向,localhost.<date>.log记录应用级异常 |
webapps/ | 默认部署目录 | ROOT/对应http://host:port/,manager/和host-manager/需显式启用 |
work/ | JSP 编译缓存 | 可清空,重启后重建;若磁盘满,先清此目录 |
注意:
temp/和lib/一般不动。temp/存放临时文件,lib/是 Tomcat 自身依赖(如servlet-api.jar),切勿往里塞项目用的 JDBC 驱动——那是webapps/yourapp/WEB-INF/lib/的事。
3. JDK 兼容性与环境变量配置:Tomcat 8.5.35 只认 JDK 8,不是“能跑就行”
Tomcat 8.5.x 系列官方明确支持 JDK 7 和 JDK 8,对 JDK 9+ 仅作有限兼容测试,且 8.5.35 发布时 JDK 11 尚未 GA。现实中,很多服务器已预装 OpenJDK 11 或 17,若不显式指定JAVA_HOME,Tomcat 会调用系统默认 JDK,导致启动失败或运行时UnsupportedClassVersionError。
3.1 验证并安装 JDK 8(以 Ubuntu 22.04 为例)
Ubuntu 22.04 默认源已移除 OpenJDK 8,需添加旧版仓库:
# 添加 OpenJDK 8 仓库(适用于 Ubuntu 20.04/22.04) sudo apt update sudo apt install -y software-properties-common sudo add-apt-repository -y ppa:openjdk-r/ppa sudo apt update # 安装 OpenJDK 8(注意:不是 default-jdk) sudo apt install -y openjdk-8-jdk-headless # 验证安装 java -version # 输出应为:openjdk version "1.8.0_382" ...CentOS 7/8 用户请使用:
# CentOS 7 sudo yum install -y java-1.8.0-openjdk-devel # CentOS 8(需启用 PowerTools) sudo dnf install -y java-1.8.0-openjdk-devel3.2 设置 JAVA_HOME:为什么不能只靠update-alternatives?
update-alternatives --config java只影响java命令软链,但 Tomcat 启动脚本(catalina.sh)优先读取JAVA_HOME环境变量,其次才是PATH。若JAVA_HOME未设或指向错误路径,startup.sh会尝试用which java查找,结果可能调用到 JDK 11。
# 查找 JDK 8 实际路径(Ubuntu 示例) sudo update-java-alternatives -l | grep jdk8 # 输出类似:java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64 # 永久设置 JAVA_HOME(写入 tomcat 用户环境) echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64' | sudo tee -a /opt/tomcat/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /opt/tomcat/.bashrc # 切换到 tomcat 用户验证 sudo su - tomcat -c 'echo $JAVA_HOME' # 必须输出:/usr/lib/jvm/java-1.8.0-openjdk-amd643.3 创建 setenv.sh:JVM 内存与编码的生死线
Tomcat 8.5.35 默认 JVM 参数极保守(-Xms和-Xmx均为 128M),生产环境必调;且默认字符集为ISO-8859-1,处理中文 URL 或表单会乱码。
# 以 tomcat 用户身份创建 setenv.sh(必须在 bin/ 下,且不可加 .sh 后缀以外的扩展名) sudo -u tomcat tee /opt/tomcat/bin/setenv.sh << 'EOF' #!/bin/bash # JVM 内存设置(根据服务器内存调整:4G 机器建议 -Xms512m -Xmx1024m) JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m" # 强制 UTF-8 字符集(解决中文乱码) JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" # 关闭 RMI 以规避防火墙问题(非集群环境推荐) JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=false" EOF # 赋予执行权限 sudo chmod +x /opt/tomcat/bin/setenv.sh参数说明:
-Xms512m -Xmx1024m:初始堆 512MB,最大堆 1024MB,避免频繁 GC;-XX:MetaspaceSize=256m:JDK 8 引入元空间替代永久代,设初始大小防动态扩容开销;-Dfile.encoding=UTF-8:此参数必须存在,否则request.getParameter("中文")返回乱码;-Dcom.sun.management.jmxremote=false:关闭 JMX 远程管理(默认开启但监听 1000+ 端口,常被防火墙拦截)。
4. 启动脚本与 systemd 服务配置:让 Tomcat 成为真正的 Linux 系统服务
手动执行./startup.sh只适合调试。生产环境必须通过systemd管理,实现开机自启、崩溃自拉起、日志统一收集。Tomcat 8.5.35 自带daemon.sh,但现代 Linux(systemd 时代)更推荐原生 service 文件。
4.1 编写 tomcat.service 文件:路径、用户、依赖三要素
# 创建 systemd 服务文件 sudo tee /etc/systemd/system/tomcat.service << 'EOF' [Unit] Description=Apache Tomcat Web Application Container After=network.target [Service] Type=forking # 关键:指定 tomcat 用户和组 User=tomcat Group=tomcat # 工作目录必须是 CATALINA_HOME WorkingDirectory=/opt/tomcat # 启动前确保 JAVA_HOME 正确(systemd 不读 .bashrc,需显式声明) Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" Environment="CATALINA_HOME=/opt/tomcat" Environment="CATALINA_BASE=/opt/tomcat" Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid" # 启动命令:调用 catalina.sh start(不是 startup.sh) ExecStart=/opt/tomcat/bin/catalina.sh start ExecStop=/opt/tomcat/bin/catalina.sh stop Restart=always RestartSec=10 # 安全加固:禁止 core dump,限制内存 LimitCORE=infinity MemoryLimit=2G [Install] WantedBy=multi-user.target EOF逻辑说明:
Type=forking:Tomcat 启动后主进程 fork 子进程并退出,符合catalina.sh start行为;Environment块必须显式声明,因为 systemd 会清空用户环境;CATALINA_PID指向temp/tomcat.pid,catalina.sh会自动写入进程 ID,stop时读取;MemoryLimit=2G防止 Tomcat 内存泄漏拖垮整机(CentOS 7+ 支持,Ubuntu 需systemd229+)。
4.2 启用并启动服务:验证是否真正“活着”
# 重载 systemd 配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable tomcat # 启动服务 sudo systemctl start tomcat # 检查状态(重点看 Active: active (running) 和 Main PID) sudo systemctl status tomcat -l # 查看实时日志(Ctrl+C 退出) sudo journalctl -u tomcat -f常见成功日志特征:
INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [xxx] millisecondsINFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
若卡在Starting ProtocolHandler后无响应,大概率是server.xml中Connector端口被占用,或JAVA_HOME错误导致 JVM 启动失败。
4.3 防火墙放行:8080 端口不是“默认开放”的
# CentOS 7/8 sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload # Ubuntu(ufw) sudo ufw allow 8080 sudo ufw reload提示:若服务器在云厂商(如阿里云、腾讯云),安全组规则必须额外放行 8080 端口,防火墙只是第一道关。
5. 管理界面启用与常见问题排查:403/404 不是 Bug,是配置没到位
Tomcat 8.5.35 默认禁用 Manager 和 Host Manager 应用,这是安全设计,不是缺陷。想进http://localhost:8080/manager/html,必须手动配置用户权限和访问控制。
5.1 配置 tomcat-users.xml:三步解锁管理页
# 编辑用户配置文件(注意:是 conf/tomcat-users.xml,不是 conf/web.xml) sudo -u tomcat nano /opt/tomcat/conf/tomcat-users.xml在<tomcat-users>标签内添加以下内容(替换掉注释掉的示例用户):
<!-- 添加管理员用户 --> <user username="admin" password="SecurePass123!" roles="manager-gui,manager-status,admin-gui,admin-script"/>角色说明:
manager-gui:允许访问/manager/html图形界面;manager-status:查看服务器状态(JVM、线程、连接池);admin-gui:访问/host-manager/html(虚拟主机管理);admin-script:支持/host-manager/text接口(脚本化部署)。
5.2 开放 Manager 应用的 IP 访问限制
Tomcat 8.5.35 默认只允许127.0.0.1和::1访问 Manager,远程登录需修改context.xml:
# 编辑 Manager 应用的上下文配置 sudo -u tomcat nano /opt/tomcat/webapps/manager/META-INF/context.xml找到<Valve>标签,注释掉整段 IP 限制(或修改allow属性):
<!-- 注释掉这一整段 --> <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> --> <!-- 或改为允许所有 IP(仅限内网环境) --> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow=".*" />注意:
allow=".*"是正则表达式,表示允许任意 IP。生产环境请严格限定内网段,如allow="192\.168\.1\.\d+"。
5.3 常见问题排查:血泪经验总结的 4 条高频翻车点
现象 1:startup.sh执行后立即返回,ps aux | grep tomcat查无进程,catalina.out为空
原因:JAVA_HOME未正确设置,或指向了 JRE(非 JDK)目录,导致catalina.sh找不到java命令。
解决:sudo -u tomcat bash -c 'echo $JAVA_HOME && $JAVA_HOME/bin/java -version',确认输出 JDK 8 版本。
现象 2:浏览器打开http://ip:8080显示 404,但http://ip:8080/manager/html提示 403
原因:tomcat-users.xml中用户未分配manager-gui角色,或context.xml的 IP 限制未放开。
解决:检查tomcat-users.xml是否有<user>标签且roles包含manager-gui;检查manager/META-INF/context.xml是否注释了<Valve>。
现象 3:能进 Manager 页面,但上传 WAR 包时报FAIL - Deploy Upload Failed
原因:webapps/目录权限不属于tomcat用户,或temp/目录磁盘满。
解决:sudo chown -R tomcat:tomcat /opt/tomcat/webapps/ /opt/tomcat/temp/;df -h /opt查磁盘。
现象 4:启动后catalina.out报SEVERE [main] org.apache.catalina.core.StandardServer.await Port 8005 required
原因:server.xml中Shutdown端口(默认 8005)被其他进程占用。
解决:sudo ss -tuln | grep :8005查占用进程,kill -9 <pid>;或修改server.xml中<Server port="8005">为其他端口(如 8006)。
6. 验证部署与日志诊断:用一个 WAR 包走通完整流程
装完不是终点,验证才是。我们用 Tomcat 自带的examples应用(已内置)或一个极简 WAR 包,走通「部署 → 访问 → 查日志 → 排错」闭环。
6.1 部署自带 examples 应用:快速验证容器健康度
Tomcat 8.5.35 的webapps/examples目录默认存在,但需确保其WEB-INF/web.xml中的 Servlet 映射有效:
# 检查 examples 是否已解压(正常应为目录,非 .war 文件) ls -ld /opt/tomcat/webapps/examples/ # 若是 examples.war 文件,则需先删除再重启,让 Tomcat 自动解压 sudo rm /opt/tomcat/webapps/examples.war sudo systemctl restart tomcat等待 10 秒后,访问http://your-server-ip:8080/examples/servlets/,应看到 Servlet 示例列表。点击任意链接(如servlets/servlet/RequestInfoExample),若显示请求信息页,证明:
✅ Tomcat HTTP Connector 正常;
✅ JSP/Servlet 编译器工作;
✅webapps/目录读写权限正确。
6.2 手动部署 WAR 包:从打包到上线的最小可行路径
假设你有一个hello-world.war(可从 Spring Initializr 生成最简 Spring Boot 项目导出),部署步骤:
# 复制 WAR 到 webapps(tomcat 用户必须有写权限) sudo -u tomcat cp /path/to/hello-world.war /opt/tomcat/webapps/ # Tomcat 会自动解压(观察 logs/catalina.out) # 或手动触发部署(等效) sudo systemctl restart tomcat验证访问:http://your-server-ip:8080/hello-world/(WAR 包名决定 context path)。若返回 404:
- 检查
webapps/下是否生成hello-world/目录(而非hello-world.war文件残留); - 查
logs/localhost.<date>.log,看是否有Deploying web application directory日志; - 若有
java.lang.OutOfMemoryError: Metaspace,说明setenv.sh中MetaspaceSize太小,调大至512m。
6.3 日志分层诊断法:三类日志各司其职
Tomcat 日志不是一锅炖,要分层查:
| 日志文件 | 何时查看 | 典型线索 |
|---|---|---|
logs/catalina.out | 启动失败、JVM 崩溃 | java.lang.OutOfMemoryError,Address already in use,Could not load class |
logs/localhost.<date>.log | 应用启动失败、Servlet 初始化异常 | SEVERE [RMI TCP Connection(2)-127.0.0.1] ... Error configuring application listener |
logs/manager.<date>.log | Manager 页面操作失败 | FAIL - Application at context path [/myapp] could not be started |
实战技巧:
- 用
tail -f logs/catalina.out监控启动过程; - 部署 WAR 后,立刻
tail -f logs/localhost.*.log看应用级日志; - 若页面空白但无报错,检查浏览器开发者工具 Network 标签页,看具体哪个资源 404(常是 CSS/JS 路径错)。
从那以后我每次新装 Tomcat,都强制走一遍:
sudo -u tomcat $JAVA_HOME/bin/java -version(验 JDK);sudo -u tomcat /opt/tomcat/bin/catalina.sh configtest(语法检查);sudo systemctl status tomcat(服务状态);curl -I http://127.0.0.1:8080(HTTP 头响应);sudo -u tomcat ls -l /opt/tomcat/webapps/(部署目录快照)。
五步下来,95% 的“启动了但打不开”问题当场定位。希望帮到你。
本文还有配套的精品资源,点击获取