news 2026/10/1 17:50:08

CentOS停更后如何迁移:VMware上部署Ubuntu Server+JDK+Tomcat全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CentOS停更后如何迁移:VMware上部署Ubuntu Server+JDK+Tomcat全指南

最近总有人问我同一个问题: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 的默认防火墙是ufw,CentOS 是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.cn@g' /etc/apt/sources.list sudo sed -i 's@//security.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /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而不是 Desktop,Desktop 带图形界面,服务器用不上,纯粹浪费资源。
  • 选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 我用了阿里公共 DNS(223.5.5.5)加网关兜底。

应用配置前记着先检查:

sudo netplan try

netplan 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 的虚拟网络编辑器里能看到 VMnet8(NAT 模式)的网段和网关。
  • 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 user@192.168.100.50

如果 Windows 没有ssh-copy-id命令,就手动把.pub文件内容贴到 authorized_keys 里,注意不要有多余空格。配好密钥后,可以把 sshd 配置里的PasswordAuthentication改成no,密码登录就关了。这一步不是必须,但安全上属于"一份付出,一分回报"的做法。

5. 在 Ubuntu Server 上部署 JDK + Tomcat

5.1 JDK 版本选择和安装方式的权衡

JDK 的版本选择看你的 Tomcat。Tomcat 10 要求 JDK 11 及以上,Tomcat 9 要求 JDK 8/11。我这次直接用OpenJDK 17配合Tomcat 10.1,这是目前比较主流的组合,既不激进也不落后。

JDK 的安装方式有两种:

方式一:apt 直接安装 OpenJDK

sudo 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 解压到/opt:

sudo 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 端口 LISTEN,Tomcat 就起来了。再打开浏览器访问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 port="8080"这行。生产环境我一般会把port改成指定端口(比如不常用的 18080)并且加上URIEncoding="UTF-8":

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />

JVM 内存参数在bin/catalina.sh或者bin/setenv.sh。Ubuntu 上 Tomcat 没有内置 setenv.sh,你手动建一个:

sudo nano /opt/tomcat/bin/setenv.sh

写入:

export CATALINA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m" 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> <h1>Tomcat on Ubuntu Server</h1> <p>Java Version: <%= javaVersion %></p> <p>OS: <%= 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] Description=Apache Tomcat Web Application Container After=network.target [Service] Type=forking User=tomcat Group=tomcat Environment="JAVA_HOME=/opt/jdk/jdk-17.0.x" Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid" Environment="CATALINA_HOME=/opt/tomcat" Environment="CATALINA_BASE=/opt/tomcat" ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target

解释一下关键字段:

  • Type=forking:Tomcat 的 startup.sh 会启动一个子进程然后退出,这是典型的前台进程 fork 到后台的模式,必须用forking而不是simple,否则 systemd 会认为服务启动失败。
  • User=tomcat:以 tomcat 用户身份运行,不管你是部署还是管理,都不该用 root 跑 Java 应用。
  • CATALINA_PID:指定 PID 文件位置,配合ExecStop=/opt/tomcat/bin/shutdown.sh能实现优雅停机。
  • Restart=on-failure:进程崩溃后 systemd 会自动拉起来,10 秒后重试。这对生产服务非常重要。

写完保存后:

sudo systemctl daemon-reload sudo systemctl enable tomcat sudo systemctl start tomcat

验证状态:

sudo systemctl status tomcat

enabled表示开机自启,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-stop:

sudo 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 服务,都记得重启一次再确认一遍状态。这种"破坏性验证"能让你提前发现很多平时注意不到的问题,比如某个配置在冷启动时才生效,比如某个目录在重启后不在了。趁系统还没正式使用的时候把这些坑都踩完,比以后在生产环境里出问题好一万倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 17:49:22

三模型同台:DeepSeek、Qwen、GLM 只改两行配置的聚合工作台

1. 为什么要把三个模型塞进同一个工作台先说结论&#xff1a;单独用一个模型&#xff0c;和同时用三个模型&#xff0c;体验差距不是"多两个选项"那么简单&#xff0c;而是从"问一个答一个"变成"三个不同脑回路同时给你答案"。DeepSeek、Qwen、G…

作者头像 李华
网站建设 2026/10/1 17:49:18

LLM长周期任务工程化:状态管理、异步编排与可观测性实践

1. 项目概述&#xff1a;当大模型开始“跑马拉松”&#xff0c;我们该怎么陪它跑完全程&#xff1f;“Notes on long-running LLM tasks”——这个标题乍看像一份随手记下的会议纪要&#xff0c;但在我过去三年深度参与十几个生产级大模型落地项目的实操经验里&#xff0c;它直…

作者头像 李华
网站建设 2026/10/1 17:48:06

Kafka消息队列实战:从核心概念到生产部署与故障排查

清晨五点&#xff0c;我盯着监控面板上堆积到几百万的日志数据&#xff0c;第一次意识到原来"消息队列"不是一道面试题&#xff0c;而是每天都要面对的现实。那会儿公司日志系统还是服务之间直接 HTTP 调用&#xff0c;一到流量高峰整个调用链就卡成幻灯片。后来引入…

作者头像 李华
网站建设 2026/10/1 17:47:24

CAP定理实战:分布式系统一致性与可用性的取舍之道

带分布式系统的人都明白一句话&#xff1a;分布式系统没有银弹&#xff0c;一切设计都是取舍。做大数据平台这些年&#xff0c;不管处理什么数据链路&#xff0c;最后绕不开的理论底子就是CAP定理。它像一面镜子&#xff0c;把我们在高并发、多副本、跨机房场景下做的每一个取舍…

作者头像 李华
网站建设 2026/10/1 17:47:24

OpenClaw(AI小龙虾)保姆级部署教程:从Docker到智能助理

1. 先搞清楚OpenClaw是什么&#xff0c;以及它为什么叫AI小龙虾 1.1 我为什么把OpenClaw叫成AI小龙虾 最近后台一直有人问&#xff1a;你说的AI小龙虾到底是个啥&#xff1f;是聊天机器人吗&#xff1f;其实它的大名是OpenClaw&#xff0c;是一个开源的AI Agent跑起来之后的个…

作者头像 李华
网站建设 2026/10/1 17:45:29

银行家算法实战:从死锁预防到Linux资源管理

1. 这不是“银行家”&#xff0c;是操作系统里最硬核的资源守门人你打开实验指导书&#xff0c;看到“银行家算法”四个字&#xff0c;第一反应可能是&#xff1a;这名字怎么这么土&#xff1f;跟操作系统有什么关系&#xff1f;是不是又一个教科书里画饼充饥的理论模型&#x…

作者头像 李华