01. 部署架构与服务器准备
1. 本章目标
本章完成一台 Ubuntu 云服务器的基础准备,并理解 Nginx、PM2、Express 和 MySQL 的分工。完成后服务器应具备 Git、Node.js 22.20.0+、Nginx、MySQL 8.x 和解压工具。
2. 先理解各组件
Nginx
Nginx 是公网入口。它负责:
- 监听 80 和 443;
- 把 HTTP 重定向到 HTTPS;
- 使用证书建立 TLS 连接;
- 直接返回
client/dist中的前端文件; - 把
/api/和/health转发给 Express。
生产环境不使用 Vite 开发服务器。Vite 的任务是开发期热更新和生成 dist,Nginx 更适合稳定地提供构建后的静态文件。
PM2
PM2 管理 Node.js 进程。它可以在 SSH 退出后继续运行应用、收集日志、异常后重启,并配合 systemd 在服务器重启后恢复进程。PM2 不负责 HTTPS、域名或数据库备份。
Express
Express 只处理 API。后端监听 127.0.0.1:3000,意味着只有服务器本机可以连接它。公网请求必须先经过 Nginx。
MySQL
MySQL 保存 AirportDB。应用使用只读账号查询 airportdb_training。数据库管理、导入和索引实验由另一个管理账号执行。
3. 创建日常部署用户
首次连接服务器时可能使用 root。创建一个普通用户,后续部署使用这个用户。以下把用户名设为 deploy:
sudo adduser deploy
sudo usermod -aG sudo deploy
从本地把 SSH 公钥加入该用户的 ~/.ssh/authorized_keys。先打开一个新终端验证 deploy 能登录并使用 sudo,再考虑修改 SSH 密码登录策略。不要在唯一会话中直接关闭密码登录,以免把自己锁在服务器外。
检查当前身份:
whoami
groups
后续示例默认使用 deploy。只在安装系统包和修改 /etc 时使用 sudo。
4. 配置京东云安全组
在京东云控制台为实例配置入站规则:
| 端口 | 协议 | 来源 | 用途 |
|---|---|---|---|
| 22 | TCP | 最好限制为你的固定公网 IP | SSH |
| 80 | TCP | 0.0.0.0/0 和需要时的 ::/0 |
HTTP、Certbot HTTP-01 |
| 443 | TCP | 0.0.0.0/0 和需要时的 ::/0 |
HTTPS |
不要开放 3000 和 3306。安全组是云平台外层防火墙;Ubuntu 上如果启用了 UFW,还要配置本机防火墙:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status verbose
启用 UFW 前确认 SSH 规则已经存在:
sudo ufw enable
5. 安装基础软件
sudo apt update
sudo apt upgrade
sudo apt install -y git curl unzip ca-certificates nginx mysql-server
检查服务:
systemctl status nginx --no-pager
systemctl status mysql --no-pager
检查监听端口:
sudo ss -lntp
现在 Nginx 通常监听 80,MySQL 应只监听本机地址。若 MySQL 监听 0.0.0.0:3306,需要检查 /etc/mysql/mysql.conf.d/mysqld.cnf 中的 bind-address,并确认安全组没有开放 3306。
6. 安装 Node.js 22
Node.js 必须至少为 22.20.0。可使用你信任的 Node 版本管理方式。对于单用户学习服务器,推荐使用 nvm,因为切换和升级版本直观。按照 nvm 官方仓库 当前安装说明安装后执行:
nvm install 22.20.0
nvm alias default 22.20.0
nvm use 22.20.0
node --version
npm --version
预期 Node 输出不低于:
v22.20.0
注意:通过 nvm 安装的 Node 路径属于当前 Linux 用户。稍后执行 pm2 startup 时,必须使用 PM2 输出的完整命令,让 systemd 知道正确的 PATH。
安装 PM2:
npm install --global pm2
pm2 --version
7. 安装 MySQL Shell
官方 airport-db.zip 是 MySQL Shell dump,不能用普通 mysql < airport-db.zip 导入。Ubuntu 软件源中的包版本可能不同,先尝试:
sudo apt install -y mysql-shell
mysqlsh --version
如果找不到包,应按照 MySQL APT Repository 当前说明添加 Oracle 官方软件源,再安装 mysql-shell。不要下载来源不明的二进制文件。
8. 准备目录和权限
创建项目父目录:
sudo mkdir -p /var/www/airport-operations-explorer
sudo chown -R deploy:deploy /var/www/airport-operations-explorer
数据库压缩包和解压目录可以放在空间更充足的 /srv/airportdb-import:
sudo mkdir -p /srv/airportdb-import
sudo chown deploy:deploy /srv/airportdb-import
导入前检查磁盘:
df -h
free -h
nproc
压缩包约数百 MB,不代表只需要数百 MB 空间。磁盘要同时容纳压缩包、解压后的 dump、MySQL 数据、索引、二进制日志和临时空间。至少预留数倍于最终数据库大小的空间更稳妥。
9. 本章验收
逐项确认:
git --version
node --version
npm --version
nginx -v
mysql --version
mysqlsh --version
pm2 --version
还要确认:
- 能以
deploy通过 SSH 登录; - 80 和 443 对公网开放;
- 3000 和 3306 不对公网开放;
- Nginx 和 MySQL 处于 running 状态;
- 磁盘有足够空间。