最近总有人问我同一个问题CentOS 7停止维护了手上那一堆服务器该往哪儿迁我的答案一直是 Ubuntu Server。这不是拍脑袋而是我自己这几年在 VMware 上反复折腾 Ubuntu Server 22.04、JDK、Tomcat 之后一步步试出来的结论。这篇东西不打算写成说明书而是把我从装系统到把 Tomcat 跑起来的完整过程、踩过的坑、想明白的原理一次性讲清楚。先说清楚这篇内容能做、能解决什么它能让你在 VMware 虚拟机里从零装好一个 Ubuntu Server 22.04配好远程连接再装好 JDK 和 Tomcat最后浏览器能直接访问你的 Java Web 应用。整个过程我都会给理由比如为什么这么分区、为什么那么配网络、为什么 JDK 推荐手动装而不是 apt 直接装。适合谁看刚从 CentOS 迁移过来的运维、正在学 Linux 的初学者、以及想搭一套 Java 部署环境的同学这篇都能直接用。1. CentOS 停止维护后为什么很多人转向 Ubuntu Server这不是追热点是现实问题。CentOS 7 在 2024 年 6 月已经正式停止维护了意味着安全更新、漏洞补丁、内核修复全部断了。对生产环境来说这可不是小事。你当然可以说我用 CentOS 7 用得挺稳先不管但下次 CVE 爆出来的时候你就知道什么叫裸奔了。我在评估迁移目标的时候候选无非就是几个CentOS Stream、Rocky Linux、AlmaLinux、Ubuntu Server、Debian。最后选了 Ubuntu Server 22.04 LTS有几个实在的理由第一生命周期有保证。Ubuntu 的 LTS 版本支持期是 5 年22.04 会支持到 2027 年 4 月。如果你买了 Ubuntu Pro或者用扩展安全维护ESM甚至能拉到 10 年。这点对一个要长期跑的服务来说太重要了。第二文档和社区活跃度极高。我自己的体会是Ubuntu 的官方文档、Stack Overflow 上的问答、各种论坛的帖子密度是其他发行版比不了的。你装 Tomcat 报个错Google 一搜前十条里至少六条是 Ubuntu 环境的解法多数能直接抄作业。第三云厂商的亲和度。AWS 的 Ubuntu 镜像、Azure 的 Ubuntu 镜像、阿里云的 Ubuntu 镜像全都在力推。你在 VMware 上练熟的东西将来迁到云上操作习惯基本不用改。这一点在换工作、接外包的时候尤其值钱。第四桌面端和服务器端通吃。这点经常被忽略但实际很关键。你可以在自己电脑上装 Ubuntu Desktop 当日常环境服务器上装 Ubuntu Server两边命令、配置、软件包管理方式完全一致练习成本极低。CentOS 生态基本看不到桌面场景学完服务器知识本地还是用 Windows/Mac总有点割裂。当然Ubuntu 也不是没有争议。最常被吐槽的是snap 包机制有人嫌它占用系统资源、软件源慢、和传统包管理习惯不一致。我自己对 snap 的态度是能用 .deb 和 tar.gz 就不碰 snap但 snap 的存在本身不是问题因为服务器上大多数场景你用不到它apt 和手动解压就够。还有一个很多人忽略的细节Ubuntu 的默认防火墙是ufwCentOS 是firewalld。命令不一样但思路是相通的。别被这东西吓住我后面会专门讲怎么处理 22 端口和 8080 端口。2. Ubuntu 与 CentOS核心区别不在于名字不同很多人以为 Ubuntu 和 CentOS 的区别就是 apt 和 yum 的区别倒也没错但只是表层。往深了看你会发现两者的设计哲学、文件系统布局、默认安全策略都有差异。理解这些差异你才能少踩坑。2.1 包管理和源配置的差异CentOS 用 yum新版用 dnf仓库文件在/etc/yum.repos.d/一个 .repo 文件对应一个仓库源。Ubuntu 用 apt源列表在/etc/apt/sources.list还有/etc/apt/sources.list.d/下面的独立文件。实际操作中最大的感受是apt 的依赖处理更智能。装一个软件apt 能自动把依赖树理清楚基本不会出现 yum 那种装包装一半缺了某个依赖导致回滚的情况。另外 apt 的apt search比 yum 的yum search结果更清晰日常检索软件包方便得多。我自己的习惯是装完 Ubuntu 第一件事就是换源。国内用户建议用清华或者阿里的镜像源速度能快好几倍。具体做法sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo apt update注意 22.04 的 sources.list 格式和 20.04 略有不同如果你刚才改了之后apt update报错大概率是 URI 格式对不上。直接手动打开文件把http://改成https://加上镜像地址即可。2.2 安全模型SELinux 与 AppArmor 的取与舍CentOS 的一大特色是 SELinux默认强制enforcing模式。这就意味着你启动 Tomcat 或 Nginx 的时候如果端口号、文件上下文不对就会被 SELinux 拦下来日志里还只给你一句模糊的 Permission denied。排查起来是真头大。当年我年轻的时候被 SELinux 卡住过整整一个下午最后发现是 httpd 的 boolean 没打开。Ubuntu 用的是AppArmor默认只对少数关键进程启用。对普通用户来说大部分场景你几乎感觉不到它的存在。这不算谁好谁坏只能说 AppArmor 对入门更友好SELinux 在复杂多租户场景下更严格。如果你是从 CentOS 迁过来的可以大大松一口气因为你不太需要去学一套全新的 SELinux 策略语言。当然这不是说 Ubuntu 就不安全了ufw、AppArmor、sudo 机制一起兜底足够应付常规生产需求。2.3 systemd 与网络配置的差异两者现在都用 systemd服务管理命令是通用的systemctl start/stop/status/enable。区别主要在网络配置。CentOS 传统上用/etc/sysconfig/network-scripts/ifcfg-*文件配置静态 IP新版本支持 NetworkManager 的nmcli。Ubuntu 从 18.04 开始用netplan配置文件在/etc/netplan/*.yaml。第一次见到 netplan 的时候我觉得很新奇它其实是一个翻译层把 YAML 配置翻译成后端 NetworkManager 或 systemd-networkd 的配置。我后面配置静态 IP 时会具体演示 netplan 的写法这里先提一个重要区别Ubuntu 的网卡命名规则和 CentOS 不一样。Ubuntu Server 22.04 默认用 predictable network interface names实体机或者 VMware 下通常叫ens33、ens160之类的CentOS 7 则常见eth0。如果你找错了网卡名配置全白搭。用ip addr或ip link看清楚再动手。2.4 一个容易忽略的差异用户的 sudo 机制CentOS 下我习惯直接改root密码然后所有操作都用 root 登录。Ubuntu 默认安装时只让你创建普通用户root 密码是随机的你根本不知道。要用管理员权限就必须sudo。这是设计哲学的分歧Ubuntu 默认鼓励最小权限。别嫌 sudo 麻烦这在服务器上是好习惯。我见过很多生产事故就是 root 一把梭导致误删文件。sudo 好歹多一步确认。真要长期用 root也可以sudo passwd root设置 root 密码然后sudo su -切过去。但我个人建议保持普通用户 sudo特别是你后面要配置 Tomcat 自启动的时候权限控制得当能少很多风险。2.5 Ubuntu 与 CentOS 快速对比表对比项UbuntuCentOS包管理apt / dpkgyum / dnf (新版)软件源配置/etc/apt/sources.list/etc/yum.repos.d/安全模块AppArmor默认较温和SELinux默认 enforcing防火墙ufwfirewalld / iptables网络配置netplan (YAML)ifcfg 文件或 NetworkManager生命周期LTS 5 年可扩展CentOS Linux 停止维护Stream 为滚动发布默认用户普通用户 sudoroot或自定义普通用户适用场景云服务器、个人开发、企业通用传统服务器、企业合规场景3. VMware 上安装 Ubuntu Server 22.04 的完整过程这部分我尽量写细因为初学者最容易在这里卡住而每一步选择背后都有原因。我的环境是 VMware Workstation Pro 17理论上 16 也一样。3.1 下载 ISO选对版本很重要先去 Ubuntu 官网下载 Ubuntu Server 22.04 的 ISO 镜像文件名一般是ubuntu-22.04.x-live-server-amd64.iso。注意三点选Server而不是 DesktopDesktop 带图形界面服务器用不上纯粹浪费资源。选LTS版本不要选带.1或.2后缀的临时版本其实都是长期支持但确保版本号为 22.04 开头。建议走镜像站下载国内用阿里云镜像、清华镜像速度更快官网直接下载经常只有几百 KB/s。3.2 创建虚拟机参数设置与 VM 引导方式选择VMware 里新建虚拟机选自定义然后兼容性默认即可不用特意改。客户机操作系统选择 Linux版本下拉菜单选 Ubuntu 64 位。CPU 至少给 2 核内存建议 2048MB 起步跑 JDK Tomcat 的话 4096MB 更稳。网络选NAT模式。这个很关键NAT 模式下虚拟机共享主机 IP能访问外网也能被主机通过 SSH 连接最适合学习和开发。桥接模式需要额外配置局域网 IP容易和公司网络冲突。磁盘设 20GB拆分成多个文件。这一点新手容易忽略拆分成多文件方便你用 VMware 的快照功能做备份和迁移单个巨大文件vmdk一旦损坏基本就废了。3.3 Ubuntu Server 安装器的新流程22.04 的 Server 版安装界面和旧版差别很大不再是那个老式菜单而是用的 Subiquity 安装器。基本流程是选语言 - 选键盘 - 配置网络 - 配置代理不用填直接跳过- 配置镜像站默认即可也可以改成清华源- 分区 - 创建用户 - 勾选 SSH 服务 - 安装。最容易出错的是分区界面。新手直接选 Use entire disk 和 Set up this disk as a LVM group使用 LVM就行。LVM 的好处是以后扩容方便不用重新分区。等你玩熟了再手动分区不迟。我个人建议勾选 LVM因为 Ubuntu 默认 LVM 模式会在/dev/ubuntu-vg/ubuntu-lv上建逻辑卷以后磁盘满了用lvextend加容量就行。创建用户那一步注意用户名不要用root随便起一个比如admin。在 OpenSSH server 那里必须勾选不然后面没法远程连接。不要勾 允许 root SSH 登录不安全也没必要。安装完成后重启VM 会提示你移除安装介质。直接回车或确认即可ISO 文件会自动断开。3.4 装完系统之后的 VMware Tools 问题装完 Ubuntu Server你可能发现 VMware Workstation 提示未安装 VMware Tools。不用管它。Ubuntu 内核自带 open-vm-tools功能上一点不缺而且随内核更新自动升级。你可以验证一下systemctl status open-vm-tools如果没装手动装一下有备无患sudo apt update sudo apt install -y open-vm-tools装完之后VM 里的关机、重启、复制粘贴Server 模式其实没有剪贴板共享等 VMware 功能都正常。别去 VMware 里点Install VMware Tools那个对 Ubuntu 反而是多余的。4. 配置远程连接静态 IP、SSH 与那些年我踩过的坑4.1 为什么要设置静态 IP虚拟机默认 DHCP 模式重启之后 IP 会变。你要是远程连到一半机器一重启 IP 变了再找新 IP 又是一个过程。对服务器来说IP 漂移是不能接受的。所以在装完系统之后第一件事就是把 IP 固定下来。4.2 用 netplan 配置静态 IP 的实操Ubuntu Server 22.04 的网络配置在/etc/netplan/下面通常是一个 YAML 文件。我先用ip addr确认网卡名字一般是ens33或ens160。然后编辑配置文件network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.100.50/24 routes: - to: default via: 192.168.100.1 nameservers: addresses: - 192.168.100.1 - 223.5.5.5注意这里的192.168.100.x是 VMware NAT 网段具体看你的环境用ip addr看当前 IP 是多少网关一般是网段的.1。DNS 我用了阿里公共 DNS223.5.5.5加网关兜底。应用配置前记着先检查sudo netplan trynetplan try会在应用前给你 120 秒确认时间如果配置写错了网络断了它会自动回滚不会把你锁在门外。等你确认没问题了再sudo netplan apply正式启用。4.3 SSH 连接之前的防火墙问题装完系统的时候我们勾选了 OpenSSH server理论上 22 端口应该是通的。但 Ubuntu 默认 ufw 是关闭的如果你手贱开了 ufw就会发现自己连不上 SSH。这是新手最常见的坑。如果 ufw 处于 active 状态先放行sudo ufw allow OpenSSH sudo ufw allow 22/tcp如果你担心安全问题连 ssh 之前先把防火墙开开只放行 22 端口就够了。我这里给一个如果你一定要开 ufw的安全建议先加规则再 enable千万别先 enable 再加规则不然你瞬间就断线了只能去 VMware 控制台里救。4.4 远程连接软件的选型我试过很多 SSH 客户端最常用的还是 Xshell 和 MobaXterm。新手我更推荐 MobaXterm原因就一个自带 SFTP 文件管理拖拽上传文件特别方便。安装 Tomcat、JDK 的时候要传 tar.gz 包MobaXterm 直接拖过去就完事。连接时填虚拟机的 IP端口 22用户名是你前面创建的那个普通用户。重点提醒不要用 root 直接 SSH 登录Ubuntu 默认也禁止这个行为。要用 root 权限就在普通用户下执行sudo。4.5 远程连接常见问题清单我在帮同事排错的时候遇到最多的几个问题IP 不通先看 VMware 虚拟网络编辑器里的 NAT 网段和你配的静态 IP 在不在同一个网段。VMware Workstation 的虚拟网络编辑器里能看到 VMnet8NAT 模式的网段和网关。SSH 超时大概率是 ufw 把 22 端口挡了或者 OpenSSH 服务压根没装成功。用 VMware 控制台登录系统systemctl status ssh看看服务状态。连接被拒绝Connection refused先 ping 通 IP再检查 sshd 是否监听在 22 端口ss -tlnp | grep 22。如果没有输出说明 sshd 没起来。用户名密码正确还是连不上检查虚拟机的用户密码有没有输错。我记得创建用户时如果密码太简单少于 8 位安装器会强制你改所以一般不是这个问题。4.6 给 Xshell/MobaXterm 保存的会话设置密钥登录用密码登录固然省事但如果你要长期管理多台虚拟机我强烈建议配置 SSH 密钥。在宿主机Windows上执行ssh-keygen -t rsa -b 4096然后把公钥追加到 Ubuntu 的~/.ssh/authorized_keys文件里ssh-copy-id user192.168.100.50如果 Windows 没有ssh-copy-id命令就手动把.pub文件内容贴到 authorized_keys 里注意不要有多余空格。配好密钥后可以把 sshd 配置里的PasswordAuthentication改成no密码登录就关了。这一步不是必须但安全上属于一份付出一分回报的做法。5. 在 Ubuntu Server 上部署 JDK Tomcat5.1 JDK 版本选择和安装方式的权衡JDK 的版本选择看你的 Tomcat。Tomcat 10 要求 JDK 11 及以上Tomcat 9 要求 JDK 8/11。我这次直接用OpenJDK 17配合Tomcat 10.1这是目前比较主流的组合既不激进也不落后。JDK 的安装方式有两种方式一apt 直接安装 OpenJDKsudo apt update sudo apt install -y openjdk-17-jdk优点就是快一条命令搞定环境变量自动配置好。缺点也明显你没法精确控制 JDK 版本apt 源里是什么就是什么。如果你的应用依赖某些特定版本比如 Java 8 的老项目apt 装出来可能不对。方式二官网下载 tar.gz 手动安装我是从 Oracle 官网或者华为镜像下载 JDK tar.gz 包解压到/opt或/usr/local自己配置环境变量。这种方式的好处是版本完全可控升级路径清晰卸载也彻底删目录就行。缺点就是环境变量得自己配多一个步骤。我推荐方式二。原因很简单生产环境里JDK 版本是你应用的生命线由你掌控而不是由包管理器掌控出了问题你才知道锅在哪。而且手动配置环境变量这个操作学一次终身受益。JDK 下载地址建议用华为云镜像搜索 huaweicloud jdk比 Oracle 官网快还省去登录注册的麻烦。5.2 JDK 环境变量配置的步骤与验证把 JDK 解压到/optsudo mkdir -p /opt/jdk sudo tar -xzf jdk-17_linux-x64_bin.tar.gz -C /opt/jdk解压后目录名是jdk-17.0.x。然后编辑/etc/profile.d/java.sh这个文件是 Ubuntu 推荐放自定义环境变量的地方比直接改/etc/profile干净得多sudo nano /etc/profile.d/java.sh写入如下内容export JAVA_HOME/opt/jdk/jdk-17.0.x export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar然后让配置生效sudo chmod x /etc/profile.d/java.sh source /etc/profile.d/java.sh验证java -version如果输出类似openjdk version 17.0.x就成功了。这里有个新手常犯的错误改了 profile.d 文件之后你当前 SSH 会话不会立刻生效必须重新登录或者 source。如果你反复确认 JAVA_HOME 没生效大概率是你没有重新打开一个新会话。另外注意一个点CLASSPATH 在现代 JDK 里其实已经不太需要手动设置了大多数时候不配也没问题。我写上去是为了兼容一些老的部署脚本如果你只跑正规的 war 包不配完全没问题。5.3 Tomcat 下载、解压、配置、启动Tomcat 的安装同样推荐手动 tar.gz。去 Apache Tomcat 官网下载注意选core下面的 tar.gz 包一般叫apache-tomcat-10.1.x.tar.gz。解压到/opt并做目录简化sudo tar -xzf apache-tomcat-10.1.x.tar.gz -C /opt sudo mv /opt/apache-tomcat-10.1.x /opt/tomcat为了安全我不想用 root 启动 Tomcat所以创建一个专属用户sudo useradd -r -s /sbin/nologin tomcat sudo chown -R tomcat:tomcat /opt/tomcat启动sudo -u tomcat /opt/tomcat/bin/startup.sh然后验证sudo ss -tlnp | grep 8080如果看到 8080 端口 LISTENTomcat 就起来了。再打开浏览器访问http://虚拟机IP:8080如果看到 Tomcat 默认首页小黄猫那个页面这一路就通了。这里有个新坑Tomcat 10 的包结构和 9 完全不同。Tomcat 10 基于 Jakarta EE 9包名从javax.servlet变成了jakarta.servlet。如果你是从 Tomcat 9 直接复制 webapps 下的应用到 Tomcat 10编译报错大概率就是包名问题。老项目的 war 包如果想在 Tomcat 10 跑要么重新编译要么用 Tomcat 9没有第三条路。5.4 防火墙放行 8080 端口如果不放行端口你从浏览器访问不了。Ubuntu 默认 ufw 没开所以理论上能通但我建议还是把规则加上免得以后开了防火墙后悔sudo ufw allow 8080/tcp sudo ufw allow OpenSSH sudo ufw enable注意ufw enable要放在最后执行否则你在远程连的时候就断了而且新规则没加跑都跑不掉。这是我用 ufw 最痛的教训已经坑过我好几次了现在顺序记得死死的。5.5 Tomcat 基本配置端口、JVM 内存Tomcat 的主配置在/opt/tomcat/conf/server.xml。默认端口 8080想改的话搜Connector port8080这行。生产环境我一般会把port改成指定端口比如不常用的 18080并且加上URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 URIEncodingUTF-8 redirectPort8443 /JVM 内存参数在bin/catalina.sh或者bin/setenv.sh。Ubuntu 上 Tomcat 没有内置 setenv.sh你手动建一个sudo nano /opt/tomcat/bin/setenv.sh写入export CATALINA_OPTS-Xms512m -Xmx1024m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m sudo chmod x /opt/tomcat/bin/setenv.sh这里要说明一下-Xms是初始堆内存-Xmx是最大堆内存Metaspace是 JDK 8 及以后的元空间。给多少看你的物理内存我的虚拟机 4G 内存给 1G 堆是安全的。不要给满要留内存给操作系统使用否则系统卡死都不知道怎么回事。5.6 部署一个测试应用验证全链路如果这个时候你想验证整个环境是不是真的能跑 Java Web 应用最简单的办法就是放个空 war 包或者写一个小的 index.jsp。在/opt/tomcat/webapps/ROOT/下写一个测试页面% String javaVersion System.getProperty(java.version); String os System.getProperty(os.name); % html body h1Tomcat on Ubuntu Server/h1 pJava Version: % javaVersion %/p pOS: % os %/p /body /html然后重启 Tomcat后面讲为什么要重启。浏览器访问http://虚拟机IP:8080/看到 Java Version 和 OS 信息说明 JDK 和 Tomcat 的联动完全正常。6. 让 Tomcat 开机自启systemd 服务文件详解很多人在 Tomcat 跑起来之后就以为万事大吉了但我强烈建议你花五分钟做一个 systemd 服务让 Tomcat 开机自动启动别手动敲 startup.sh。我踩过最尴尬的一次把一台装了 Tomcat 的虚拟机重启结果 Tomcat 没起来远程教育平台直接挂了一个小时。从此我学到一件事凡是服务器上的常驻服务都必须有 systemd 托管没有例外。创建服务文件sudo nano /etc/systemd/system/tomcat.service内容如下[Unit] DescriptionApache Tomcat Web Application Container Afternetwork.target [Service] Typeforking Usertomcat Grouptomcat EnvironmentJAVA_HOME/opt/jdk/jdk-17.0.x EnvironmentCATALINA_PID/opt/tomcat/temp/tomcat.pid 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.target解释一下关键字段TypeforkingTomcat 的 startup.sh 会启动一个子进程然后退出这是典型的前台进程 fork 到后台的模式必须用forking而不是simple否则 systemd 会认为服务启动失败。Usertomcat以 tomcat 用户身份运行不管你是部署还是管理都不该用 root 跑 Java 应用。CATALINA_PID指定 PID 文件位置配合ExecStop/opt/tomcat/bin/shutdown.sh能实现优雅停机。Restarton-failure进程崩溃后 systemd 会自动拉起来10 秒后重试。这对生产服务非常重要。写完保存后sudo systemctl daemon-reload sudo systemctl enable tomcat sudo systemctl start tomcat验证状态sudo systemctl status tomcatenabled表示开机自启active (running)表示服务在跑。以后你对 Tomcat 的管理就统一用 systemctl 了不用再去敲 startup.sh 和 shutdown.sh。如果改了配置需要重启sudo systemctl restart tomcat如果改了 JVM 参数或 server.xml也可以直接restart因为 systemd 的ExecStop会先调用 shutdown.sh 优雅停机然后再启动不会出现端口占用。我还见过一些所谓的开机自启教程让用户改/etc/rc.local我不推荐。理由很简单rc.local 太裸没有依赖管理没有失败检测没有 PID 跟踪你用 systemd 一次配置以后管理起来何止舒服一倍。7. 几条从踩坑里换来的运维习惯文章写到这儿该讲的流程基本讲完了。但既然说了是实战经验帖我再补几条自己这些年养成的、确实能救命的习惯。第一快照是你最好的朋友。VMware Workstation 里在装系统前、系统装完刚重启时、配完 JDK 和 Tomcat 之后各拍一个快照。以后系统搞崩了回滚就是点一下的事。别心疼那点磁盘空间主机上多放几个快照比什么都稳。第二日志永远比报错文字有价值。Tomcat 起不来时控制台报错只是冰山一角真正的日志在/opt/tomcat/logs/catalina.out。经常有人截图给我说 Tomcat 起不来我第一句话永远是看 catalina.out。同理Ubuntu 的系统日志用journalctl -xe看比在 /var/log 底下瞎翻高效得多。第三不要用 root 维护一切。Ubuntu 默认就鼓励你用普通用户 sudo。这条习惯一旦养成真的能避免很多翻车事故比如误删了/etc、把某个目录权限改没了。普通用户加 sudo至少在删除和写配置这种危险操作面前多一道确认。第四把常用命令做成软链接。比如 Tomcat 的启动脚本路径太长我会在/usr/local/bin下做一个软链接以后直接敲tomcat-start、tomcat-stopsudo ln -s /opt/tomcat/bin/startup.sh /usr/local/bin/tomcat-start sudo ln -s /opt/tomcat/bin/shutdown.sh /usr/local/bin/tomcat-stop第五每次改完关键配置都做一次重启验证。改完 netplan 的静态 IP、改完 Tomcat 的端口、改完 systemd 服务都记得重启一次再确认一遍状态。这种破坏性验证能让你提前发现很多平时注意不到的问题比如某个配置在冷启动时才生效比如某个目录在重启后不在了。趁系统还没正式使用的时候把这些坑都踩完比以后在生产环境里出问题好一万倍。