阿里云更新下载tomcat
阿里云ECS上那台Tomcat 8.5跑了快两年,阿里最近一次漏洞扫描报出来三个CVE,云更其中一个还是新下远程代码执行。我打开终端连上去,阿里`bin/version.sh` 显示 build 日期停在 2021 年 11 月。云更这事不能再拖了。新下 先说清楚一个前提:Tomcat 不是阿里 `yum update` 就能搞定的东西。阿里云的云更 yum 源里那个 `tomcat` 包版本老得离谱,而且跟手动部署的新下目录结构完全对不上。你如果当初是阿里用 `yum install tomcat` 装的,那还好办,云更直接 `yum update tomcat` 就行。新下但大多数人是阿里下载 tar.gz 解压到 `/usr/local/tomcat` 或者 `/opt/tomcat` 这种路径下,那就得手动换。云更 我的新下情况属于后者。服务器上跑着两个 Java 应用,一个用 8080,一个用 8443,Tomcat 装在 `/opt/tomcat`,systemd 管着服务。升级的核心思路就一句话:把新版本的 bin 和 lib 目录替换掉,保留 conf、webapps、logs 和 temp。配置文件和你的应用不动,只换引擎。 操作从下载开始。Apache 官网的镜像在国内速度看运气,阿里云 ECS 上直接用 `wget` 拉 `https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz` 大概两三分钟。注意别去下 `latest` 那个符号链接,版本号写死,不然下次你都不知道自己升了什么。 解压到一个临时目录: 接下来是关键步骤。先停服务: 然后备份旧目录。别偷懒,这一步省不得: 备份完,把新版本的 bin 和 lib 覆盖过去: 这里有个坑我踩过:新版本的 `bin` 目录里 `setclasspath.sh` 和 `catalina.sh` 的权限可能不对,覆盖后记得 `chmod +x /opt/tomcat/bin/*.sh`。另外如果你之前改过 `catalina.sh` 里的 JVM 参数,比如堆内存或者 GC 配置,那覆盖之前先把旧文件里的自定义部分抄出来,合并到新文件里。我习惯把 JVM 参数单独写在 `setenv.sh` 里,这样升级时完全不用动 bin 目录下的脚本。 还有 `conf` 目录。新版本的 `server.xml` 和 `context.xml` 可能有 schema 变化,但一般情况下旧配置能兼容。我建议只把新版本 `conf` 里的 `web.xml` 覆盖过去,其他文件保持原样。`web.xml` 是 Servlet 规范描述文件,跟着版本走比较稳妥。 启动之前检查一下 Java 版本。Tomcat 9 要求 Java 8 以上,Tomcat 10 要求 Java 11 以上。如果你还在用 Java 8,别去碰 Tomcat 10,那个 `javax.servlet` 到 `jakarta.servlet` 的包名迁移能把你的应用搞崩。阿里云 ECS 上如果装的是 OpenJDK 8,用 Tomcat 9 就是最稳的组合。 启动服务: 看日志确认版本: 启动信息里会打印 `Server version: Apache Tomcat/9.0.98`,看到这行基本就成了。然后访问一下应用,确认 8080 和 8443 都正常响应。 有个细节:阿里云的安全组规则不会因为 Tomcat 升级而改变,但如果你之前开放的是 8080 端口,新版本默认监听端口没变,那就不用动。如果换了端口,记得去 ECS 控制台改安全组入方向规则。 整个升级过程从下载到验证,熟练的话十五分钟。不熟练的话,备份那一步多花五分钟,总比出事之后回滚强。我那次升级完之后,漏洞扫描的三个 CVE 全部消失,`version.sh` 的 build 日期变成了 2024 年 12 月。旧目录 `tomcat.bak.20250115` 留了一周,确认没问题才删掉。 如果你用的是阿里云容器服务 ACK,那更简单——直接改 Dockerfile 里的基础镜像 tag,重新构建推送就行。但如果是 ECS 上手动部署的,上面这套流程就是最直接的路子。cd /tmp tar -xzf apache-tomcat-9.0.98.tar.gzsystemctl stop tomcatcp -a /opt/tomcat /opt/tomcat.bak.20250115cp -a /tmp/apache-tomcat-9.0.98/bin/* /opt/tomcat/bin/ cp -a /tmp/apache-tomcat-9.0.98/lib/* /opt/tomcat/lib/systemctl start tomcat systemctl status tomcattail -f /opt/tomcat/logs/catalina.out