一、回顾与本篇目标
上一篇我们完成了一个留言板后端项目。功能齐全——注册、登录、发表留言、查看列表、删除自己的留言。但有一个问题:它只能在你自己的电脑上访问。localhost:3000 是你电脑里的小世界,出了你的电脑,没人能访问到它。
一个真正的后端服务,应该跑在服务器上——一台永远开机、有公网 IP 的电脑。用户在世界任何地方输入一个网址,请求就能到达这台服务器,服务器处理后返回数据。
这一篇,我们就把留言板项目从你的个人电脑,搬到云端的服务器上。这个过程叫部署。这是从“学习阶段”到“上线交付”的最后一步,也是最让人有成就感的一步——因为你的东西终于可以被别人用到了。
二、部署到底是在干什么
很多人觉得“部署”很神秘,其实拆开来看就几件事:
- 买一台服务器:在云服务商那里租一台虚拟机。本质上就是租了一台永远开机的电脑,它有一个固定的公网 IP 地址。
- 连接到服务器:通过 SSH(一种远程登录协议)从你的电脑登录到那台远在云端的主机上,可以执行命令。
- 在服务器上安装环境:装 Node.js、装 MySQL、装 Git,和你在自己电脑上做的事几乎一样。
- 把代码搬上去:用 Git 把代码克隆到服务器上,或者用 FTP 上传。
- 安装依赖并启动:
npm install、node app.js。 - 让服务持续运行:用进程管理工具(如 PM2)保证服务不会因为你退出终端就挂掉。
- 配置域名:让你可以通过
www.你的网站.com而不是123.45.67.89:3000来访问。
本篇会逐步带你完成这七步。即使你暂时不打算真的买服务器,也请读完——理解部署的流程,对你理解“网站到底是怎么跑起来的”这件事有巨大的帮助。
三、选择云服务器
国内主流的云服务商有:阿里云、腾讯云、华为云。国外有 AWS、Google Cloud、Azure。对于学习和小型项目来说,选择哪家差异不大。以下操作以阿里云为例,其他平台大同小异。
如果只是想体验一下,很多平台对新用户有免费试用或低价体验套餐。选择最低配置就够——1 核 CPU、1GB 内存、20GB 硬盘,跑 Node.js + MySQL 完全没问题,一个月几十块钱。
购买时的几个关键选择:
- 地域:选离你用户最近的地方。国内用户选上海、北京、杭州等节点。
- 操作系统:选 Ubuntu 20.04 或 22.04(Linux 发行版)。不要选 Windows Server——后端服务器几乎都用 Linux。
- 带宽:学习阶段 1M 或按流量计费就行。
购买完成后,你会得到一个公网 IP 地址(如 47.100.xxx.xxx)和一个 root 用户的密码。保存好这两个信息,下面要用。
四、连接到服务器
服务器购买好了,现在需要用 SSH 登录上去。
Windows 用户
推荐安装 Git Bash。安装完 Git for Windows 后,右键桌面选“Git Bash Here”,就可以使用 SSH 命令了。打开 Git Bash,输入:
ssh root@你的服务器IP地址
第一次连接会询问“是否信任这个主机”,输入 yes 回车。然后输入 root 密码。注意输入密码时屏幕不会显示任何字符,连星号都没有——这是 Linux 的安全设计,不是卡住了。输完回车即可。
Mac 用户
打开终端,直接输入:
ssh root@你的服务器IP地址
同样输入 yes 和密码。
登录成功后,终端提示符会变成类似 root@iZwz9f8g7h6i5j4k3l2m1n0:~#,表示你已经在服务器上了。你现在执行的任何命令,都是在云端那台电脑上执行的。
五、在服务器上安装环境
登录到服务器后,需要安装 Node.js、MySQL 和 Git。
第 1 步:更新系统包列表
apt update
apt 是 Ubuntu 的包管理工具,相当于手机上的应用商店。apt update 是更新应用列表。
第 2 步:安装 Node.js
# 安装 Node.js 20.x LTS 版本
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
安装完成后验证:
node -v
npm -v
两个命令都应该输出版本号。
第 3 步:安装 MySQL
apt install -y mysql-server
安装完成后,启动 MySQL 并设置密码:
# 启动 MySQL 服务
systemctl start mysql
systemctl enable mysql # 设置开机自启
# 登录 MySQL(初始没有密码)
mysql -u root
# 在 MySQL 命令行中设置密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
EXIT;
设置密码后,以后登录需要用 mysql -u root -p 然后输入密码。
第 4 步:创建数据库
mysql -u root -p
输入密码后:
CREATE DATABASE message_board;
EXIT;
数据库名和上篇保持一致。
第 5 步:安装 Git
apt install -y git
六、把代码搬上服务器
有多种方式可以把代码搬到服务器上。最常用的是 Git 克隆。
如果你的代码已经推到了 GitHub,在服务器上直接克隆:
cd /root
git clone https://github.com/你的用户名/message-board.git
cd message-board
如果你还没有把代码推送到 GitHub,可以用 scp 命令从本地上传(在你自己电脑的终端执行,不是在服务器上):
# 在你的电脑上执行:把整个项目文件夹上传到服务器
scp -r /path/to/message-board root@你的服务器IP:/root/message-board
上传完成后,回到服务器终端,进入项目文件夹:
cd /root/message-board
七、在服务器上运行项目
第 1 步:创建 .env 文件
服务器的环境配置和你本机不同。创建 .env 文件:
nano .env
nano 是 Linux 上的文本编辑器。输入以下内容:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=你在MySQL中设置的密码
DB_NAME=message_board
JWT_SECRET=随便打一串乱码作为密钥
PORT=3000
按 Ctrl + O 然后回车保存,Ctrl + X 退出。
第 2 步:创建数据库表
你本机开发时已经创建过 users 和 messages 表,但服务器的数据库是空的。需要重新创建表结构。最方便的方式是用 mysql 命令执行一个 SQL 文件。
在项目文件夹里创建一个 init.sql 文件:
nano init.sql
输入:
USE message_board;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(200) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS messages (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
保存退出。然后执行:
mysql -u root -p < init.sql
输入密码后,表就创建好了。
第 3 步:安装依赖
npm install
第 4 步:启动服务
node app.js
终端显示“留言板后端已启动,端口:3000”。
现在打开浏览器,访问 http://你的服务器IP:3000/api/messages。如果返回 [](空数组),恭喜,部署成功!
但是如果什么都不返回呢? 很可能是云服务器的安全组没有开放 3000 端口。云服务商默认只开放了 22(SSH)等少数端口,3000 端口需要手动放行。
在云服务商的控制台找到“安全组”设置,添加入站规则:
- 协议:TCP
- 端口:3000
- 授权对象:0.0.0.0/0(允许所有人访问)
添加后再访问,应该就能看到数据了。用 Postman 测试注册、登录、留言功能,和本机开发时完全一样。
八、让服务持续运行:PM2
现在有一个关键问题:你通过 SSH 登录到服务器,执行 node app.js,服务启动了。但当你关闭 SSH 窗口,服务就停了。因为 node app.js 是前台运行的,它绑定了你的 SSH 会话。会话结束,进程被杀。
我们需要一个工具,让 Node.js 服务在后台持续运行,即使 SSH 断开也不停,即使服务崩溃也能自动重启。这个工具就是 PM2。
安装 PM2
npm install -g pm2
-g 表示全局安装,安装后可以在任何目录使用 pm2 命令。
用 PM2 启动服务
cd /root/message-board
pm2 start app.js --name message-board
输出类似:
[PM2] Starting /root/message-board/app.js in fork_mode
[PM2] Done.
┌─────────────┬────┬──────┬──────┬────────┐
│ name │ id │ mode │ status │ ↺ │
├─────────────┼────┼──────┼──────┼────────┤
│ message-board│ 0 │ fork │ online │ 0 │
└─────────────┴────┴──────┴──────┴────────┘
status: online 表示服务正在运行。现在关闭 SSH 终端,服务依然在跑。
PM2 常用命令
| 命令 | 作用 |
|---|---|
pm2 list |
查看所有运行的服务 |
pm2 logs message-board |
查看日志(console.log 的内容会在这里显示) |
pm2 restart message-board |
重启服务(修改代码后需要重启) |
pm2 stop message-board |
停止服务 |
pm2 delete message-board |
从 PM2 列表中移除 |
pm2 save |
保存当前 PM2 列表,重启服务器后自动恢复 |
pm2 startup |
设置 PM2 开机自启 |
建议执行 pm2 startup 然后 pm2 save。这样即使服务器重启,PM2 也会自动启动并恢复你的留言板服务。
九、配置域名
现在访问你的服务需要通过 http://47.100.xxx.xxx:3000 这样的 IP 加端口号。IP 很难记,端口号暴露在外面也不优雅。我们希望用户只需要输入 http://www.my-site.com 就能访问。
这需要两步:买域名和配置 DNS 解析。
第 1 步:购买域名
可以在阿里云、腾讯云等服务商购买域名。一个普通的 .com 域名一年几十块钱,.cn 更便宜。
第 2 步:添加 DNS 解析记录
在域名服务商的控制台,找到“DNS 解析”或“域名解析”,添加一条记录:
- 记录类型:A
- 主机记录:
@(表示根域名,如 my-site.com)或者www(表示 www.my-site.com) - 记录值:你的服务器公网 IP 地址
- TTL:默认即可
保存后等几分钟,ping 你的域名 应该就能解析到你的服务器 IP 了。
第 3 步:把 3000 端口映射到 80 端口
HTTP 协议的默认端口是 80。用户在浏览器输入 http://www.my-site.com,浏览器实际访问的是 www.my-site.com:80。但我们的服务跑在 3000 端口。可以通过 Nginx 做端口转发,也可以简单粗暴地让 Express 直接监听 80 端口。
修改 .env:
PORT=80
然后用 PM2 重启:
pm2 restart message-board
同时,在安全组中开放 80 端口。现在浏览器直接访问你的域名,就能看到留言板 API 的返回数据了。
十、部署后的更新流程
代码上线后,你还会继续修改和增加功能。每次更新代码的流程是:
- 在本地修改代码,测试通过。
- 推送到 GitHub。
- SSH 登录服务器,进入项目目录。
git pull拉取最新代码。npm install(如果新增了依赖)。pm2 restart message-board重启服务。
整个过程不到一分钟。
十一、本篇动手练习
练习 1:部署留言板项目
如果你有条件购买云服务器,按照本篇的步骤完整走一遍。从购买服务器到域名解析,直到能用 Postman 通过域名访问你的留言板 API。
练习 2:模拟部署
如果你暂时不想花钱买服务器,可以:
- 在本地安装 PM2,用 PM2 启动你的留言板项目。
- 熟悉 PM2 的常用命令。
- 练习 .env 环境变量管理。
练习 3:了解 Nginx
搜索“Nginx 反向代理 Node.js”,了解如何使用 Nginx 将 80 端口的请求转发到 3000 端口的 Node.js 服务。这是生产环境中最常用的部署架构。
十二、本篇小结
这一篇我们把一个本地项目成功部署到了云服务器上:
- 云服务器:一台永远开机的远程电脑,有公网 IP。
- SSH:远程登录服务器,执行命令。
- 环境安装:在 Linux 上用 apt 安装 Node.js、MySQL、Git。
- 代码上传:Git 克隆或 scp 上传。
- 数据库初始化:执行 SQL 文件创建表。
- 安全组:云服务商的防火墙,需要手动开放端口。
- PM2:进程管理工具,让服务持续运行、崩溃自动重启、开机自启。
- 域名配置:购买域名 → DNS 解析 → 开放 80 端口。
- 更新流程:本地改代码 → 推 GitHub → 服务器 pull → 重启。
部署是连接“自己写的代码”和“用户实际使用”之间的桥梁。当你在浏览器里输入自己买的域名,看到自己写的后端返回的数据时,那是一种特别的成就感——你不再是一个“学习者”,而是一个能交付产品的开发者。
下一篇预告
下一篇是《后端零基础入门》的终篇。我们不再讲新技术,而是聊聊后端开发者的日常——代码规范、调试技巧、日志管理、安全常识,以及从入门到进阶的学习路线。为这个系列画上一个实在的句号。
后端零基础入门,每周更新。













暂无评论内容