全栈 RBAC 实战 (13):阿里云 Ubuntu + Nginx + PM2 + HTTPS 完整部署指南

54 阅读4分钟

摘要:开发完成只是第一步,上线才是硬道理。本文是为后端小白准备的“保姆级”部署教程。我们将在一台全新的 Ubuntu 服务器上,搭建 Node.js 环境、MySQL 数据库,使用 PM2 守护后端进程,配合 Nginx 实现“静态官网+子路径后台+后端API”在同一域名下的完美共存,并加上一把 HTTPS 的绿锁。

学习之前先浏览 前置专栏文章

基本的部署步骤在第四篇文章,pm2部署到服务器已经有基本的配置了,已经在服务器安装了nginx node nvm pm2 和数据库,也创建了数据库叫mydb_prod,也上传了一个sql文件到服务器的/tmp目录。接下来要对sql文件进行更新,并且对nginx重新配置。

步骤一:登录服务器链接数据库

  1. 先登录服务器 ssh root@47.101.129.155 输入密码

  2. 链接数据库

    mysql -u root -p 输入数据库root密码

  3. 在mysql workbench导出数据库的结构和初始化数据,导出sql文件,随便命名,我的命名my_db.sql

  4. 把导出的sql文件通过ssh命令或者FileZila客户端上传到服务器 /tmp目录下,或者其他目录也行

  5. *回到服务器终端,导入表结构和本地数据到 mydb_prod 数据库,执行命令:

USE mydb_prod

SOURCE /tmp/my_db.sql

上面的命令是在服务器终端执行my_db.sql的所有sql语句,包括创建表和导入初始化数据,比如 菜单管理和管理员这个用户。

步骤二 拉取代码并部署

在服务器终端,切换到后端项目的目录:cd /root/projeccts/node-api-test 执行

git pull

npm install

再执行pm2运行 pm2 start ecosystem.config.cjs --env production

# 首次启动(生产):

pm2 start ecosystem.config.cjs --env production

# 平滑重载(零停机

pm2 reload ecosystem.config.cjs --env production

# 完全重启

pm2 restart ecosystem.config.cjs --env production

步骤三:nginx配置

为了让前端能运行在ifxia.xyz/vue-admin-t…

修改vite.config.ts

export default defineConfig({

// 核心:设置子路径,注意前后都要有斜杠

base: '/vue-admin-template/',

// ...

})

修改src/router/index.ts:


const router = createRouter({

// 核心:路由历史模式带上基准路径

history: createWebHistory('/vue-admin-template/'),

routes: [...constantRoutes],

})

本地打包

npm run build

上传到服务器

登录服务器,先在服务器创建目录,前面已经配置了/var/www/html为根目录

mkdir -p /var/www/html/vue-admin-template

使用 FTP/SCP 把本地dist里面的所有内容(index.html, assets 等)上传到服务器的/var/www/html/vue-admin-template/目录下。

Nginx 配置 (最终串联)

我们需要修改/etc/nginx/sites-available/ifxia.xyz.conf,

因为我们的根目录/var/www/html下有index.html 当访问域名ifxia.xyz,会访问这个index.html,但是当前的后台接口没有添加/api ,nginx配置的 / 会重定向到后台接口那里,所以当访问https://ifxia.xyz时,无法访问到index.html了,所以

打开/sites-available/ifxia.xyz.conf,完整内容如下

# HTTP 强制跳转 HTTPS (保持不变)

server {

listen 80;

server_name ifxia.xyz;

return 301 https://$host$request_uri;

}

# HTTPS 服务器

server {

listen 443 ssl;

server_name ifxia.xyz;

# SSL 配置 (保持你原来的)

ssl_certificate /etc/letsencrypt/live/ifxia.xyz/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/ifxia.xyz/privkey.pem;

# 这样 /var/www/html 下的 index.html 就变成了官网

root /var/www/html;

index index.html index.htm;

# --- 1. 前端配置 (子路径) ---

location /vue-admin-template {

# 使用 alias 指向存放前端代码的实际目录

alias /var/www/html/vue-admin-template;

index index.html;

# 解决 Vue Router 刷新 404 问题

try_files $uri $uri/ /vue-admin-template/index.html;

}

# --- 2. 后端配置 (根路径) ---

# 因为你不想用 /api 前缀,所以我们将根路径直接转发给 Node

location / {

try_files $uri $uri/ @backend;

}

location @backend {

proxy_pass http://localhost:3000;

# 代理头信息

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection 'upgrade';

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

重启并验证

nginx -t

如果显示successful,继续下一步。

重启 Nginx

systemctl reload nginx
访问前端:打开浏览器访问 https://ifxia.xyz/vue-admin-template应该能看到你的登录页面。

登录测试:输入账号密码登录。*查看 F12 Network,* *请求地址应该是 https://ifxia.xyz/auth/login*

现在,你的服务器处理逻辑变成了这样:

访问 https://ifxia.xyz/

Nginx 检查 /var/www/html/index.html 是否存在? -> 存在。

结果:直接显示你的官网介绍页面。

访问 https://ifxia.xyz/style.css (假设官网有样式)

Nginx 检查 /var/www/html/style.css 是否存在? -> 存在。

结果:返回 CSS 文件。

访问 https://ifxia.xyz/auth/login (后端接口)

Nginx 检查 /var/www/html/auth/login 文件是否存在? -> 不存在。

Nginx 检查 /var/www/html/auth/login/ 目录是否存在? -> 不存在。

结果:触发 @backend 规则,请求被转发给 localhost:3000,Node.js 处理并返回登录结果。

访问 https://ifxia.xyz/vue-admin-template

匹配到 location /vue-admin-template。

结果:显示 Vue 后台管理系统。

这样,官网、后台、API就在同一个域名、同一个端口下完美共存了!