
文章目录一、Linux 基础操作命令1. 查看目录文件2. 目录切换与查看路径3. 文件夹操作4. 文件操作5. 进程查看命令6. 软件安装命令区分7. 退出操作二、软件项目多环境与灰度发布流程1. 项目环境划分2. 灰度发布流程示例一共 100 台服务器三、SpringBoot 多环境配置1. 数据准备2. 程序配置文件修改3. 从 Maven 读取环境配置变量五、构建项目并打包本地 Maven 打包1. 跳过测试2. 打包步骤全文总结核心知识点复盘常见问题 / 避坑指南本文是一篇面向后端工程师的部署实战复盘覆盖 Linux 基础命令、多环境划分、灰度发布流程、SpringBoot 多环境配置、Maven 打包以及部署报错排查。内容从概念到原理再到实战适合刚接触服务器部署的同学系统学习也适合作为团队知识库沉淀。一、Linux 基础操作命令服务器部署的第一步是能在命令行里熟练地走来走去。下面这些命令是日常操作服务器时使用频率最高的建议全部上手敲一遍。1. 查看目录文件命令作用ls列出当前目录内的文件ls -a列出全部文件包含隐藏文件ls -l查看文件详细信息权限、大小、时间等llls -l的简写命令命令行前缀长这样root主机名:当前目录#其中root是当前登录用户。几个高频小技巧.代表当前目录..代表上一级目录按tab键可以命令自动补全敲一半按一下省时又避免手滑拼错ctrl c可以终止当前正在执行的命令比如某个命令卡住了第一时间按它。2. 目录切换与查看路径cd目录名# 进入指定目录例如cd spring-cloud-blogpwd# 查看、返回当前所在目录的完整路径pwd是 Print Working Directory 的缩写迷路时用它确认自己到底在哪个目录。3. 文件夹操作mkdir文件夹名# 创建文件夹例如mkdir java115_java116rm文件夹名/# 直接删除文件夹会报错提示这是目录无法删除rm-r文件夹名/# 递归删除文件夹以及内部全部内容这里有一个非常典型的踩坑点rm直接删除目录会失败因为rm默认只删除普通文件。必须加-rrecursive递归参数才能删除整个目录树。删除是不可逆的生产环境请务必三思而后行。4. 文件操作创建文件touchaa.log读取文件命令作用cat一次性读取全部内容more分页查看结束按ctrlcless分页查看结束输入:qhead -50 XXX读取文件前 50 行tail -50 XXX读取文件末尾 50 行这里有个很实用的组合用法查看日志时通常我们只关心最新的内容所以tail用得最多。配合tail -ffollow还能实时滚动查看追加的日志排查线上问题时几乎离不开它。编辑写入文件vi / vim 编辑器vi文件名进入编辑器后几个核心按键i进入编辑模式InsertEsc退出编辑模式:w仅保存:q退出:wq保存并退出:wq!强制保存并退出:q!强制退出不保存修改。初学者的最大困惑就是为什么按了半天没反应——因为 vi/vim 有三种模式刚打开时处于命令模式此时键盘输入的是命令而非文字需要先按i进入编辑模式才能打字。文件上传下载上传文件① 本地文件直接拖拽上传②rz命令上传下载文件sz命令下载。rz/sz需要先安装工具apt-getinstalllrzsz注rz/sz依赖终端工具支持如 XShell、SecureCRT、MobaXterm 等Windows 自带的 cmd 和部分终端可能不生效此时用 SFTP 图形工具或scp命令替代即可。5. 进程查看命令psaux|grepjava# 筛选查看 java 相关进程ps-ef# 查看全部进程|是管道符把左边命令的输出交给右边命令处理grep负责过滤。这个组合是排查服务到底有没有起来的第一步先看进程在不在再看日志报什么错。6. 软件安装命令区分系统安装命令Ubuntu 系统apt如apt-get install xxxCentOS 系统yum如yum install xxx两个发行版的包管理器不同用错命令会直接提示command not found。上手新服务器时先cat /etc/os-release确认系统版本再决定用哪套命令。7. 退出操作结束会话常用三种方式ctrlc、:q(!)vi/vim 中退出、exit。二、软件项目多环境与灰度发布流程掌握了基础命令接下来理解一个更大的背景一个软件从开发到上线为什么要分那么多环境以及如何安全地把新版本推上线1. 项目环境划分一般来说一个成熟的项目会划分出 5 种运行环境开发环境dev程序员本地或共享开发机写代码、自测用测试环境testQA 工程师做功能测试、回归测试预发布环境stage上线前最后一次彩排使用真实用户数据做最终验证灰度环境把新版本先切给一小部分真实流量验证线上/发布环境prod正式对外提供服务的环境。这里的关键点是预发布环境会使用真实用户数据。为什么因为很多线上 bug 只有在真实数据量级、真实数据分布下才会暴露——测试环境的假数据往往掩盖了问题。所以预发布环境也叫 staging承担了上线前最后一公里的把关职责。2. 灰度发布流程示例一共 100 台服务器灰度发布Gray Release / Canary Release的核心思想是分批上线新版本降低一次性全量上线带来的故障风险。假设集群一共 100 台机器灰度 1 台机器占总量 1%小范围验证——即便出问题影响面也极小灰度扩充到 10 台机器占总量 11%扩大验证范围灰度扩充到 40~50 台机器占总量 50%全部机器更新新版本全量上线。流量经过负载均衡分发到后端多台业务服务器集群。灰度时负载均衡按比例把一小部分真实流量导向已更新新版本的机器其余流量仍走旧版本从而实现边验证、边观察、随时可回滚。为什么不能直接全量新版本哪怕测试再充分也无法 100% 覆盖真实流量中的各种边界情况。灰度把全量上线失败这种大事故拆解成了1% 流量下的小问题把损失降到可控范围。这是互联网公司最核心的工程实践之一。三、SpringBoot 多环境配置回到代码层面程序要正常运行必须保证运行环境与程序配置匹配。也就是说同样一份代码跑在开发机上要连开发库跑在服务器上要连生产库——这些差异需要通过多环境配置来预先设置。1. 数据准备在服务器上执行数据库建表脚本生成和本地一致的数据表结构。代码跑得起来的前提是表结构存在这一步经常被忽略导致启动后一查数据就报表不存在。2. 程序配置文件修改实际工作中开发、测试、生产环境的配置不一样最典型的就是 MySQL 账号密码。为了不混用SpringBoot 支持给不同环境设置独立配置文件。命名规则多平台配置文件命名规则application-XXX.yml或application-XXX.properties中间的XXX用来标记环境。示例配置文件application.yml主配置文件application-dev.yml开发环境配置application-prod.yml生产环境配置。文件格式是固定的只有中间的环境标识可以修改不同配置文件内填写对应环境参数。配置示例application-dev.yml开发环境# 开发环境配置填写开发环境数据库连接地址、账号密码、驱动spring:datasource:url:jdbc:mysql://localhost:3306/mall_dev# 开发库地址username:dev_user# 开发库账号password:dev_pass_123# 开发库密码driver-class-name:com.mysql.cj.jdbc.Driver# 驱动类application-prod.yml生产环境# 生产环境配置填写生产环境数据库连接地址、账号密码、驱动spring:datasource:url:jdbc:mysql://10.0.0.8:3306/mall_prod# 生产库地址内网 IPusername:prod_user# 生产库账号权限最小化password:prod_pass_Strong!# 生产库密码driver-class-name:com.mysql.cj.jdbc.Driver在主配置中指定启用哪套环境在主配置文件application.yml中指定当前启用哪一套环境主配置内删除数据库相关配置因为数据库配置已经下沉到各环境文件里了# application.yml 主配置文件只负责指定激活哪套环境spring:profiles:active:prod# 激活生产环境配置这样SpringBoot 启动时会读取application.yml发现active: prod进而自动加载application-prod.yml把生产环境的数据库配置注入进来。切换环境只需改这一个值代码零改动。3. 从 Maven 读取环境配置变量更进阶的做法是把激活哪套环境这件事交给 Maven 管理。在pom.xml中定义环境变量管理 dev、prod 两套环境并把 prod 设为默认启用!-- pom.xml --profiles!-- 开发环境 --profileiddev/idpropertiesprofile.namedev/profile.name/properties/profile!-- 生产环境默认启用 --profileidprod/idpropertiesprofile.nameprod/profile.name/propertiesactivationactiveByDefaulttrue/activeByDefault!-- 默认激活 prod --/activation/profile/profiles之后在application.yml中通过profile.name读取 Maven 里定义的变量动态指定激活环境# application.yml通过 Maven 变量动态指定激活环境spring:profiles:active:profile.name# 打包时被 Maven 替换成 dev 或 prod这样做的好处是一次配置打包即切换。用mvn package -P dev打开发包用mvn package -P prod打生产包不用手动改配置文件。同时还要在pom.xml里开启资源过滤resource filtering否则profile.name不会被替换——这正是下面报错的根源。五、构建项目并打包本地 Maven 打包配置无误后就可以把项目打成可执行的 jar 包上传到服务器运行了。1. 跳过测试如果测试Test代码里存在数据库等环境相关的操作打包时执行测试会失败。此时可以点击图标跳过测试或在命令行加参数-DskipTestsmvn package-DskipTests注意区分-DskipTests与-Dmaven.test.skiptrue前者跳过测试执行但仍编译测试代码后者连测试代码都不编译。日常打包用前者即可。2. 打包步骤打包遵循先清理、再打包的顺序mvn clean# 先清理旧构建产物mvn package# 再打包也可以合并成一条mvn clean package打包成功标志控制台输出BUILD SUCCESS产物位置打包完成后生成 jar 包存放在项目target目录下如shopping-system-1.0.1.jar之后可以上传到服务器运行。拿到 jar 后在服务器上运行# 前台运行关闭终端即停止适合临时调试java-jartarget/shopping-system-1.0.1.jar# 后台运行生产环境推荐配合日志重定向nohupjava-jartarget/shopping-system-1.0.1.jarapp.log21全文总结本文沿着命令 → 环境 → 配置 → 打包 → 报错 → 上线这条主线完整还原了一次 SpringBoot 项目的部署流程Linux 基础命令是操作服务器的手和脚从查看、切换、增删文件到进程查看、包管理构成了日常运维的基本功多环境划分dev / test / stage / 灰度 / prod解决了同一份代码在不同环境跑不同配置的问题预发布环境用真实数据做最终验证灰度发布用分批上线的策略把全量上线的风险拆解成可控的小范围验证是互联网工程的核心方法论SpringBoot 多环境配置通过application-XXX.yml隔离环境差异主配置用spring.profiles.active指定激活哪套环境进阶做法是用 Maven 变量profile.name动态注入部署报错大多源于配置占位符未解析核心是开启资源过滤 变量名严格一致Maven 打包遵循clean → package的流程跳过测试、确认BUILD SUCCESS、拿到 jar 即可部署。核心知识点复盘命令行基础ls -a/-l、cd、pwd、mkdir、rm -r、touch、cat/more/less/head/tail、vi/vimi进入编辑、:wq保存退出、rz/sz、ps aux | grep、apt/yum删除注意rm删目录必须加-r且删除不可逆vi/vim 三模式命令模式 →i编辑模式 →Esc回命令模式 →:wq保存退出环境体系dev / test / stage / 灰度 / prod预发布用真实数据灰度节奏1% → 11% → 50% → 100%由负载均衡按比例切流多环境配置application-{env}.yml 主配置spring.profiles.activeMaven 变量注入profile.nameresource filtering 变量名严格一致打包流程mvn clean package跳过测试用-DskipTests产物在target目录。常见问题 / 避坑指南rm 目录报错因为rm默认只删文件删目录必须用rm -r。生产环境操作前先pwd确认路径避免误删。vi 里打字没反应刚打开 vim 处于命令模式要先按i进入编辑模式才能输入文字编辑完按Esc退回命令模式再:wq保存退出。打包时测试报错测试代码依赖数据库等环境时用-DskipTests跳过测试执行但要注意跳测试只是权宜之计核心逻辑建议仍保留自动化测试。环境切错导致连错库上线前务必核对spring.profiles.active的值并确认对应application-{env}.yml里的数据库地址、账号密码是否为预期环境。用 Maven 变量注入时打包命令记得带对-P参数。jar 前台运行终端一关就停生产环境用nohup java -jar ... 后台运行并把输出重定向到日志文件方便后续tail -f排查。