十一:部署上线——让你的后端真正跑在云端

一、回顾与本篇目标

上一篇我们完成了一个留言板后端项目。功能齐全——注册、登录、发表留言、查看列表、删除自己的留言。但有一个问题:它只能在你自己的电脑上访问localhost:3000 是你电脑里的小世界,出了你的电脑,没人能访问到它。

一个真正的后端服务,应该跑在服务器上——一台永远开机、有公网 IP 的电脑。用户在世界任何地方输入一个网址,请求就能到达这台服务器,服务器处理后返回数据。

这一篇,我们就把留言板项目从你的个人电脑,搬到云端的服务器上。这个过程叫部署。这是从“学习阶段”到“上线交付”的最后一步,也是最让人有成就感的一步——因为你的东西终于可以被别人用到了。

二、部署到底是在干什么

很多人觉得“部署”很神秘,其实拆开来看就几件事:

  1. 买一台服务器:在云服务商那里租一台虚拟机。本质上就是租了一台永远开机的电脑,它有一个固定的公网 IP 地址。
  2. 连接到服务器:通过 SSH(一种远程登录协议)从你的电脑登录到那台远在云端的主机上,可以执行命令。
  3. 在服务器上安装环境:装 Node.js、装 MySQL、装 Git,和你在自己电脑上做的事几乎一样。
  4. 把代码搬上去:用 Git 把代码克隆到服务器上,或者用 FTP 上传。
  5. 安装依赖并启动npm installnode app.js
  6. 让服务持续运行:用进程管理工具(如 PM2)保证服务不会因为你退出终端就挂掉。
  7. 配置域名:让你可以通过 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 的返回数据了。

十、部署后的更新流程

代码上线后,你还会继续修改和增加功能。每次更新代码的流程是:

  1. 在本地修改代码,测试通过。
  2. 推送到 GitHub。
  3. SSH 登录服务器,进入项目目录。
  4. git pull 拉取最新代码。
  5. npm install(如果新增了依赖)。
  6. 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 → 重启。

部署是连接“自己写的代码”和“用户实际使用”之间的桥梁。当你在浏览器里输入自己买的域名,看到自己写的后端返回的数据时,那是一种特别的成就感——你不再是一个“学习者”,而是一个能交付产品的开发者。

下一篇预告

下一篇是《后端零基础入门》的终篇。我们不再讲新技术,而是聊聊后端开发者的日常——代码规范、调试技巧、日志管理、安全常识,以及从入门到进阶的学习路线。为这个系列画上一个实在的句号。

后端零基础入门,每周更新。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容