资讯动态

Tomcat 8.0.47 部署实战:从环境对齐到 systemd 托管与避坑排查

发布时间:2026/10/21 5:03:21 来源:尧图企业网站定制
简介Apache Tomcat 8.0.47 是 Apache 软件基金会推出的开源 Java Web 应用容器完整实现 Servlet、JSP 与 Java EE 规范适合需要部署调试 Java Web 项目的开发者、运维人员及计算机专业学生使用。压缩包共 628 个文件约 9.75MB涵盖 html 文档、class 字节码、java 源码、jsp 页面、jar 依赖包、xml 配置、sh/bat 启动脚本及 properties 配置等基本覆盖 Tomcat 运行所需的目录结构与示例应用。资源包含 Catalina 容器、Jasper JSP 引擎、Coyote 连接器、JNDI 命名服务、JASPI 认证接口及 JK 连接器等核心模块并附带 server.xml、context.xml、web.xml 等关键配置文件便于理解端口、虚拟主机、上下文路径与安全约束的设置方式。目前已有 122 人学习下载适合用于本地环境搭建、源码研读与 Web 应用部署练习。1. Tomcat 8.0.47 部署为什么老版本反而更难装上周帮一个朋友处理他公司内网的老项目Java 7 编译的Spring 3.x跑在一台 CentOS 7 的虚拟机上。项目本身没什么问题但部署环境卡了整整一个下午——他下载了最新的 Tomcat 10启动直接报NoClassDefFoundError换 Tomcat 9 又提示 Servlet 版本不兼容。最后我让他退回到 apache-tomcat-8.0.47十分钟跑通。这不是个例很多遗留系统、教学环境、老版本中间件依赖的项目就是绑死在 Tomcat 8.0.x 这条线上。Tomcat 8.0.47 是 8.0 分支的最后一个版本2018 年发布支持 Servlet 3.1、JSP 2.3、EL 3.0同时兼容 Java 7 和 Java 8。装不好它的典型症状是启动闪退、端口占用、JAVA_HOME找不到、manager页面 403。这篇笔记按我实际部署的顺序来从环境确认到启动验证中间穿插几个我踩过的坑适合正在给老项目配环境的开发者。2. 安装前先把环境对齐JDK 版本和目录规划2.1 JDK 版本选择别用 Java 11 去跑 Tomcat 8.0.47Tomcat 8.0.47 官方要求 Java 7 及以上但“及以上”有边界。我实测 Java 11 启动会报Unsupported major.minor version或者java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter因为 Java 11 移除了 JAXB 模块。Java 17 更不行SecurityManager相关 API 已经废弃。稳妥的选择是 JDK 8如果项目本身是 Java 7 编译的用 JDK 8 跑也没问题向下兼容。查看当前 JDK 版本java -version # 输出示例 # java version 1.8.0_202 # Java(TM) SE Runtime Environment (build 1.8.0_202-b08) # Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)如果输出是1.7.0_80也可以但建议至少升到 8u151 以上避免旧版 JDK 的 TLS 问题。JAVA_HOME必须指向 JDK 根目录不是bin目录也不是 JRE 目录。我一般这样配# 编辑 /etc/profile 或 ~/.bashrc export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.202.b08-1.el7_6.x86_64 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar改完执行source /etc/profile再用echo $JAVA_HOME确认路径没有多余空格或换行。常见错误是复制路径时带上了行尾空格导致 Tomcat 启动脚本解析失败。2.2 目录规划别把 Tomcat 解压到/root下我见过有人把 Tomcat 解压到/root/apache-tomcat-8.0.47然后用tomcat用户去启动结果logs目录写不进去启动日志一片空白。正确的做法是单独建一个应用目录比如/opt/tomcat或/usr/local/tomcat把解压后的文件放进去再把属主改成运行用户。假设你用tomcat用户跑服务# 创建目录并解压 sudo mkdir -p /opt/tomcat sudo tar -zxvf apache-tomcat-8.0.47.tar.gz -C /opt/tomcat --strip-components1 # 创建 tomcat 用户如果还没有 sudo useradd -r -s /sbin/nologin tomcat # 改属主 sudo chown -R tomcat:tomcat /opt/tomcat--strip-components1的作用是去掉压缩包自带的apache-tomcat-8.0.47这一层目录直接把bin、conf、webapps放到/opt/tomcat下。这样后面配 systemd 服务时路径更干净。如果你只是本地测试用当前用户跑也行但生产环境别用 root 跑 Tomcat这是基本的安全习惯。2.3 端口检查8080 被占用的两种处理方式Tomcat 默认监听 8080HTTP、8005SHUTDOWN、8009AJP。启动前先确认端口没被占# 查看 8080 端口占用 ss -tlnp | grep 8080 # 或者 netstat -tlnp | grep 8080如果被占要么停掉占用进程要么改 Tomcat 端口。改端口在conf/server.xml里!-- 把 8080 改成 8081 -- Connector port8081 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /注意redirectPort也要跟着改否则 HTTPS 跳转会有问题。AJP 端口 8009 如果不用可以注释掉减少暴露面。3. 安装与配置从解压到 systemd 托管3.1 解压后的目录结构确认解压完先看一眼目录确认文件完整ls -lh /opt/tomcat # 应该看到 # bin/ conf/ lib/ logs/ temp/ webapps/ work/bin下关键脚本是startup.sh、shutdown.sh、catalina.sh。conf下核心配置文件是server.xml、web.xml、context.xml、tomcat-users.xml。logs目录初始为空启动后才会生成catalina.out。如果logs目录不存在手动建一个并改属主否则启动会报No such file or directory。3.2 配置setenv.sh定制 JVM 参数Tomcat 启动时会自动读取bin/setenv.sh如果存在用来设置 JVM 内存、编码、临时目录等。我一般会建这个文件而不是直接改catalina.sh这样升级 Tomcat 时配置不会丢# 创建 /opt/tomcat/bin/setenv.sh export CATALINA_OPTS$CATALINA_OPTS -Xms512m -Xmx1024m export CATALINA_OPTS$CATALINA_OPTS -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m export CATALINA_OPTS$CATALINA_OPTS -Dfile.encodingUTF-8 export CATALINA_OPTS$CATALINA_OPTS -Djava.awt.headlesstrue export CATALINA_PID/opt/tomcat/tomcat.pid-Xms和-Xmx分别是最小和最大堆内存老项目一般 512M 到 1G 够用。MetaspaceSize是 Java 8 用来替代永久代的设太小会频繁 Full GC。CATALINA_PID指定 PID 文件路径方便shutdown.sh精确杀进程避免杀错。建完给执行权限chmod x /opt/tomcat/bin/setenv.sh3.3 配置tomcat-users.xml启用管理页面默认情况下manager和host-manager页面是 403 的因为没配用户。编辑conf/tomcat-users.xml在tomcat-users标签内加role rolenamemanager-gui/ role rolenamemanager-script/ role rolenameadmin-gui/ user usernameadmin passwordYourStrongPassword rolesmanager-gui,manager-script,admin-gui/注意manager-gui和manager-script要分开前者给浏览器用后者给脚本调用。密码别用admin或tomcat这是被扫描的重点。另外 Tomcat 8.0.47 默认只允许本机访问管理页面如果要远程访问需要改webapps/manager/META-INF/context.xml把allow的值改成你的 IP 段Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow127\.\d\.\d\.\d|192\.168\.1\.\d /改完重启生效。生产环境不建议开放远程管理页面用 SSH 隧道或只在本机操作更安全。3.4 用 systemd 托管 Tomcat 服务手动startup.sh启动的缺点是终端一关进程就没了而且开机不会自启。用 systemd 托管是标准做法# /etc/systemd/system/tomcat.service [Unit] DescriptionApache Tomcat 8.0.47 Afternetwork.target [Service] Typeforking Usertomcat Grouptomcat EnvironmentJAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.202.b08-1.el7_6.x86_64 EnvironmentCATALINA_HOME/opt/tomcat EnvironmentCATALINA_BASE/opt/tomcat ExecStart/opt/tomcat/bin/startup.sh ExecStop/opt/tomcat/bin/shutdown.sh Restarton-failure RestartSec10 [Install] WantedBymulti-user.targetTypeforking是因为startup.sh会 fork 一个后台进程。Environment里显式指定JAVA_HOME避免 systemd 环境变量缺失导致启动失败。Restarton-failure让 Tomcat 崩溃后自动拉起。写完执行sudo systemctl daemon-reload sudo systemctl start tomcat sudo systemctl enable tomcat查看状态用systemctl status tomcat看日志用journalctl -u tomcat -f或直接tail -f /opt/tomcat/logs/catalina.out。4. 避坑排查启动失败、403、乱码的常见原因4.1 启动闪退catalina.out只有一行Tomcat started现象执行startup.sh后提示Tomcat started但ps查不到进程catalina.out没有详细日志。原因通常是JAVA_HOME或JRE_HOME没配或者setenv.sh里有语法错误导致脚本提前退出。解决先手动执行bash -x /opt/tomcat/bin/catalina.sh run看哪一行报错。如果是JAVA_HOME问题在setenv.sh里显式export JAVA_HOME...。如果是setenv.sh语法错误检查有没有多余空格或中文引号。4.2 管理页面 403tomcat-users.xml配了也没用现象访问/manager/html返回 403日志里没有报错。原因有两个一是tomcat-users.xml改完没重启二是 Tomcat 8.0.47 的manager应用默认有RemoteAddrValve限制只允许127.0.0.1访问。解决确认重启后检查webapps/manager/META-INF/context.xml里的allow值加上你的客户端 IP。如果还是 403看logs/localhost.日期.log里面会记录拒绝的 IP。4.3 中文乱码GET 请求参数变问号现象页面提交中文参数后台收到???。原因Tomcat 8 默认 URI 编码是 UTF-8但server.xml里Connector没配URIEncoding时某些系统环境会按 ISO-8859-1 解析。解决在Connector标签加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /同时确认setenv.sh里有-Dfile.encodingUTF-8。POST 请求的乱码一般用request.setCharacterEncoding(UTF-8)解决或者配CharacterEncodingFilter。4.4logs目录权限不对启动报Permission denied现象用tomcat用户启动catalina.out写不进去启动失败。原因解压时用的是 rootlogs、temp、work目录属主是 root。解决chown -R tomcat:tomcat /opt/tomcat确保logs、temp、work可写。如果用了CATALINA_PIDPID 文件所在目录也要可写。4.5 内存溢出OutOfMemoryError: Metaspace现象运行一段时间后报OutOfMemoryError: Metaspace应用无响应。原因MaxMetaspaceSize设太小或者应用动态生成类太多比如 JSP 频繁编译。解决在setenv.sh里调大-XX:MaxMetaspaceSize512m同时检查work目录有没有堆积大量编译后的 JSP 类。定期清理work/Catalina目录可以缓解。5. 装完怎么验证从端口到应用的完整检查链装完别急着丢给开发按这条链走一遍确认每个环节都通。第一步确认进程和端口ps -ef | grep tomcat ss -tlnp | grep -E 8080|8005|8009应该看到tomcat用户的 Java 进程以及 8080、8005 处于 LISTEN 状态。如果 8009 没监听说明 AJP 没启用不影响 HTTP 访问。第二步本地 curl 测试curl -I http://127.0.0.1:8080/ # 期望输出 # HTTP/1.1 200 OK # Content-Type: text/html;charsetUTF-8如果返回 404检查webapps/ROOT目录是否存在。第三步部署一个测试 WAR 包验证应用加载# 假设有一个 test.war cp test.war /opt/tomcat/webapps/ # 等几秒后查看日志 tail -f /opt/tomcat/logs/catalina.out # 看到 Deployment of web application archive ... has finished in ... ms 表示成功然后访问http://127.0.0.1:8080/test/确认页面正常。第四步检查管理页面curl -u admin:YourStrongPassword http://127.0.0.1:8080/manager/text/list # 应该返回 OK - Listed applications for virtual host localhost如果返回 401说明用户密码不对返回 403说明 IP 限制没放开。第五步看日志有没有异常grep -i SEVERE\|ERROR\|Exception /opt/tomcat/logs/catalina.out正常的启动日志里不应该有SEVERE级别的错误。如果有ClassNotFoundException检查lib目录下有没有对应的 jar 包。第六步模拟重启验证 systemdsudo systemctl restart tomcat sleep 5 curl -I http://127.0.0.1:8080/重启后能正常访问说明 systemd 配置没问题。我一般还会把catalina.out加到 logrotate 里避免日志无限增长# /etc/logrotate.d/tomcat /opt/tomcat/logs/catalina.out { daily rotate 7 missingok notifempty copytruncate }copytruncate是关键因为 Tomcat 一直持有文件句柄直接删文件不会释放空间。从那以后我每次部署完 Tomcat都会把这条检查链完整走一遍尤其是curl -I和grep SEVERE这两步能提前发现八成以上的配置问题。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑