把项目部署到Tomcat,核心就两件事:把打包好的war包或项目目录放进webapps,确认端口和上下文路径不冲突,重启后用http://服务器IP:8080/项目名验证。真正卡人的往往不是”放进去”这一步,而是版本匹配、路径配置和日志排查这三个环节,下面按实际操作顺序拆开讲,命令和路径都写清楚,照着走基本能跑通。
Tomcat部署项目的两种主流方式,先选对路子
Tomcat认的是标准Java Web目录结构:WEB-INF、META-INF、静态资源,以及可选的web.xml,不管你在IDE里点运行,还是用命令行打包,最终都是把这种结构交给Tomcat,落地方式只有两种。
war包丢进webapps,最省事
这是最常规的做法,适合大多数中小项目。
- 用Maven或Gradle打出war包,例如执行
mvn clean package -DskipTests; - 把生成的
xxx.war上传到$CATALINA_HOME/webapps/; - 启动Tomcat,它会在启动时自动解压war包,生成同名目录;
- 浏览器访问
http://IP:8080/xxx,其中xxx就是war包文件名。
要注意:war包名会直接变成访问路径,打出来叫demo-1.0.0.war,访问路径就是/demo-1.0.0,不是/demo,很多新手第一次部署完访问404,就是栽在这里。
目录部署配Context,更灵活
项目目录不想放在webapps下,或者想自定义访问路径,可以走Context配置。
- 把解压后的项目目录放到任意位置,比如
/data/app/myapp; - 在
$CATALINA_HOME/conf/Catalina/localhost/下新建myapp.xml;写一行:<Context path="/myapp" docBase="/data/app/myapp" reloadable="false" />; - 重启Tomcat,访问
http://IP:8080/myapp。
reloadable="false"是生产环境的常规设置,因为开启后Tomcat会持续扫描类文件变化,白白消耗资源。
Tomcat部署war包和目录部署的区别,一张表说清
| 对比项 | war包部署 | 目录部署 |
|---|---|---|
| 操作复杂度 | 低,放进去就行 | 中,要写Context配置 |
| 访问路径 | 由war包名决定 | 由path属性决定 |
| 更新方式 | 替换war包后重新解压 | 直接覆盖目录内文件 |
| 适用场景 | 快速上线、版本固定 | 路径定制、频繁小改 |
| 风险点 | 包名带版本号导致路径不符 | docBase路径写错或权限不足 |
怎么选?项目要跑在正式环境、版本迭代走发布流程,war包部署足够,项目路径要求固定、部署目录不方便动,用Context配置更顺手。
把项目部署到Tomcat服务器的完整操作步骤
以一台全新的Linux云服务器为例,走一遍最典型的war包部署流程。
第一步:版本先对齐
这是最容易埋雷的地方,Tomcat 9及以前用的是javax.servlet包名,Tomcat 10及以后统一改成jakarta.,用Tomcat 10跑一个基于javax编译的老项目,启动时直接报ClassNotFoundException。
| Tomcat版本 | 支持的Servlet规范 | 建议JDK |
|---|---|---|
| Tomcat 8.5 | Servlet 3.1 | JDK 8 |
| Tomcat 9 | Servlet 4.0 | JDK 8及以上 |
| Tomcat 10.1 | Servlet 6.0 | JDK 11及以上 |
Spring Boot项目尤其要注意:内嵌Tomcat版本和外部Tomcat版本要能对上,打成war包部署时,需要把spring-boot-starter-tomcat的scope改成provided,并让启动类继承SpringBootServletInitializer,否则外部容器根本接管不了应用。
第二步:打包并检查产物
- Maven项目:
mvn clean package -DskipTests; - Gradle项目:
gradle build -x test; - 产物在
target/或build/libs/下,确认是.war后缀,且里面含有WEB-INF/classes。
第三步:上传并放好位置
scp target/demo.war root@服务器IP:/opt/tomcat/webapps/;- 确认目录属主:
chown -R tomcat:tomcat /opt/tomcat/webapps,用专用账号跑Tomcat是行业里的通行做法,别拿root直接跑。
第四步:改端口和上下文路径
编辑conf/server.xml,找到Connector节点:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
8080被占用就换成其他端口,想省掉路径里的项目名,把war包重命名为ROOT.war,访问时直接用IP加端口,不过一个Tomcat实例只能有一个ROOT应用,多项目共存时还是老老实实分路径。
第五步:启动与验证
- 启动:
bin/startup.sh,Windows下是bin/startup.bat; - 看日志:
tail -f logs/catalina.out,启动成功的标志是最后出现Server startup in xxx ms; - 本地验证:
curl -I http://127.0.0.1:8080/demo,返回200就说明容器层通了; - 外网验证:浏览器访问公网IP加端口。
云服务器部署Tomcat一年多少钱?这笔账先算明白
Tomcat本身免费,成本全在服务器上,价格取决于配置和计费方式,不是固定数字。
配置怎么选
- 个人练手、测试环境:1核2G够用,按年付费通常在几百元这个量级;
- 小型生产项目:2核4G比较稳妥,一年大致在一两千元区间;
- 有一定并发、跑多个应用:4核8G起步,费用会到两三千元甚至更高。
按量付费适合临时验证,长期跑还是包年划算,带宽另算,固定带宽和按流量计费差别不小,访问量波动大的项目可以优先考虑按流量。
机房地域对访问速度的影响
华东、华北、华南这些节点怎么挑,看用户在哪,用户在长三角,选华东节点,网络往返延迟明显更低,行业共识认为,同城或同省节点的访问体验要好于跨区域部署,国内服务器对外提供Web服务需要备案,这一步的时间成本要提前算进上线计划。
Tomcat部署项目后访问404怎么解决?按这个顺序排查
404说明服务器通了、Tomcat活着,只是找不到对应资源,按下面顺序查,基本能定位。
先看日志有没有报错
logs/catalina.out和logs/localhost.yyyy-mm-dd.log是主要入口,如果应用启动失败,日志里会有异常堆栈;如果根本没解压出目录,多半是war包损坏或磁盘空间不足。
再核对context path和war包名
- 访问路径和war包名是否完全一致,大小写敏感;
- war包是否已经解压成同名目录,没解压就说明
autoDeploy被关了; - 用Context配置的,检查
docBase指向的目录里是否有WEB-INF。
最后查端口、防火墙和安全组
netstat -tlnp | grep 8080确认端口在监听;- 服务器本机防火墙放行:
firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload; - 云服务器控制台的安全组入方向规则要单独放行8080,这一层最容易被忽略本机curl通、外网打不开,十有八九是安全组。
上线前容易被忽略的几个细节
- 关掉manager和host-manager:
webapps下这两个默认应用带管理入口,生产环境建议删除或限制访问IP; - 配JVM参数:在
bin/setenv.sh里写JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m",默认堆内存偏小,项目一多容易OOM; - 日志切割:Tomcat自带的日志不会自动按大小切,长期运行
catalina.out能涨到几个G,配个logrotate或改用Log4j2接管; - 时区统一:启动参数加
-Duser.timezone=Asia/Shanghai,避免日志时间对不上; - 中文乱码:确认
conf/logging.properties和Connector的URIEncoding="UTF-8"设置一致。
部署这件事,做一次是体力活,做十次就该沉淀成脚本,把上传、替换、重启、健康检查写成一个shell,比每次手动敲命令靠谱得多,据工信部相关统计,国内中小企业上云比例近年来持续上升,Tomcat这类轻量容器依然是Java Web项目最普遍的落地选择,把基础操作吃透,收益是长期的。
关于Tomcat部署项目的常见问题
Q1:war包部署和目录部署,生产环境选哪个?
优先war包,版本可追溯,回滚就是换回上一版war,配合CI/CD容易自动化,目录部署更适合需要固定上下文路径、或应用体积大且只改少量静态资源的场景。
Q2:Tomcat部署项目后启动特别慢,一般是什么原因?
先看catalina.out里卡在哪个阶段,常见原因有三个:熵源不足导致SecureRandom阻塞,可在JVM参数加-Djava.security.egd=file:/dev/./urandom;应用初始化时连数据库超时;war包过大导致解压耗时,定位到具体阶段再对症处理。
Q3:同一个Tomcat能部署多个项目吗?
可以,把多个war包放进webapps,各自用包名作为访问路径即可,但要注意端口只有一个、JVM内存是共享的,项目数量多时建议拆成多个Tomcat实例,按端口隔离,单个应用出问题不至于拖垮全部。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771273.html

