代码写完以后,卡住人的常常是怎么把它稳定地放到服务器上,让别人能打开。前段时间我给一个小型电商后台做上线,从买服务器、配域名到搭自动发布,前后花了两天。这篇文章按顺序把过程讲一遍,照着做应该能跑起来。

一、先确定要部署什么
动手前先回答三个问题:应用用的什么技术栈,大概有多少访问量,数据需不需要长期保存。我那个项目是 Spring Boot 后端加 Vue 前端,日活几百,数据存在 MySQL 里。这个规模不需要 Kubernetes,一台轻量应用服务器加一个云数据库就够用了。
不少人一开始就想搭容器集群,结果光配环境就耗掉一周。我的判断标准很简单:用最少的组件解决问题,能不加的组件就不加。
二、购买并初始化 ECS
在阿里云控制台选择 ECS 云服务器。地域尽量选离用户近的节点,面向华东用户就选杭州或上海,延迟会明显低一些。系统镜像我用的是 Ubuntu 22.04 LTS,长期支持版本,资料多,遇到问题容易找到解法。
服务器开通后,先改安全组规则。我只放行 22(SSH)、80 和 443 端口,数据库端口不对公网开放。3306 一旦暴露在外网,很快就会被扫描器盯上并尝试爆破,这类事故见得不少。
登录后做基础初始化:
- 创建普通用户,并禁止 root 远程登录
- 配置 SSH 密钥登录,然后关闭密码登录。做这一步前,先确认密钥能正常登录,否则会把自己锁在外面
- 执行系统更新,安装 Nginx、Git 等常用工具
- 把时区设为 Asia/Shanghai,否则日志时间对不上,排查问题时很费劲
三、数据库交给 RDS,不要自己装在服务器上
我最开始把 MySQL 直接装在 ECS 上,想省几十块钱。结果有一次磁盘写满,数据库直接挂掉,排查用了半天。后来迁到阿里云 RDS,备份、主从和监控都由平台托管,心里踏实很多。
迁移时有两点要注意。第一,RDS 的白名单只加 ECS 的内网 IP。第二,应用连接串使用内网地址,流量不走公网,速度更快,也更安全。另外,账号密码不要写死在代码里,放到环境变量或配置中心里。
四、打包并上传产物
本地打包最省事。后端用 Maven 生成 jar 文件,前端执行构建生成 dist 目录。我的做法是在 CI 里完成这两步,再通过 scp 把产物传到服务器的 /opt/app 目录下。
如果团队大一些,可以把代码推到阿里云云效或 GitHub,用流水线自动构建。个人项目用脚本就够了。关键在于每次部署的产物都能追溯到对应的代码版本,出问题时才知道该回退到哪一版。
五、用 systemd 和 Nginx 把服务跑起来
后端不能直接用 java -jar 挂在终端里,关掉终端服务就停了。我用 systemd 管理,写一个 service 文件,同时设置开机自启和崩溃后自动重启:
- ExecStart 里写明 java 命令和 jar 的路径
- Restart 设为 always,异常退出后会自动拉起
- 环境变量通过 EnvironmentFile 读取,敏感信息集中放在一个文件里,权限设为只有服务用户可读
Nginx 做两件事:托管前端静态文件,并把 /api 请求反向代理到后端的 8080 端口。这样对外只有一个域名和一个端口,跨域问题也不用额外处理。
六、域名、HTTPS 与备案
服务器在中国大陆的话,网站要绑定域名,必须先完成 ICP 备案。这一步通常要一到两周,尽早提交,别等到上线当天才发现卡住。备案通过后,在域名解析里添加一条 A 记录,指向 ECS 的公网 IP。
HTTPS 可以直接在阿里云 SSL 证书服务申请免费的 DV 证书。下载后配置到 Nginx,再把 http 请求强制跳转到 https。证书到期前要续期,我在日历里设了提醒,这个小习惯已经帮我避开过一次线上故障。
七、上线后的检查
部署完成不等于结束。我会按下面的顺序过一遍:
- 用电脑浏览器和手机分别打开首页、登录页和核心接口,确认功能正常。两种终端都要测,因为移动端的样式和接口行为有时不一样
- 查看 journalctl 和 Nginx 日志,确认没有异常报错。上线初期的错误往往藏在日志里,页面上看不出来
- 在云监控里配置 CPU、内存和磁盘的告警。磁盘写满是最常见的隐患,也是我踩过的第一个坑
- 打开 RDS 自动备份,并实际演练一次恢复。没恢复过的备份,等于没有备份
八、写在最后
部署到阿里云没有想象中复杂,核心就是选对资源、守住安全边界,再用工具让部署可以重复执行。第一次上线手动做也可以,但一定要把每一步记下来,下次就能改成脚本。熟悉之后,再逐步引入自动化和容器化,节奏会更稳。