本章节以realworld-nuxtjs项目为例,将项目部署在ucloud服务器上,主要学习项目的最简单的部署方式、使用PM2启动Node服务、自动化部署方式,以及在部署过程中遇到的问题和解决方案。
项目打包
项目部署的前提是打包,Nuxt.js 提供了一系列常用的命令, 用于开发或发布部署
命令 | 描述 |
---|---|
nuxt | 启动一个热加载的 Web 服务器(开发模式) localhost:3000 |
nuxt build | 利用 webpack 编译应用,压缩 JS 和 CSS 资源(发布用) |
nuxt start | 以生产模式启动一个 Web 服务器 (需要先执行nuxt build) |
nuxt generate | 编译应用,并依据路由配置生成对应的 HTML 文件 (用于静态站点的部署) |
可以将这些命令添加至 package.json
中
1 | "scripts": { |
这样可以通过 npm run <command>
来执行相应的命令。如:npm run dev
表示以开发模式启动带热加载特性的 Nuxt 服务。
提示: 要将参数传递给 npm 命令,您需要一个额外的
--
脚本名称(例如:npm run dev --参数 --spa
)
执行 npm run build
打包项目,打包后的文件存放在 .nuxt/dist
最简单的部署方式
配置 Host + Post
nuxt.config.js
:
1 | module.exports = { |
压缩发布包
把下面图中标识的文件,进行压缩(realworld-nuxtjs.zip)
- .nuxt:Nuxt打包生成的资源文件
- static:项目静态资源
- nuxt.config.js:提供给Nuxt服务
- package.json:用于服务端第三方包的安装
- package-lock.json:用于服务端第三方包的安装
把发布包传到服务端
查看服务器IP地址:(ucloud服务器为例)
连接服务器(cmd 命令行、XShell、git …)
1
$ ssh root@106.75.181.60 # ssh root@公网IP
- 在服务器中创建realworld-nuxtjs文件,将打包后压缩的文件realworld-nuxtjs.zip传递到服务器中
创建文件夹,并进入文件夹,查看当前文件的路径
1
2
3
4
5$ mkdir realworld-nuxtjs
$ cd realworld-nuxtjs/
# 查看当前的目录路径path
$ pwd执行 exit 命令退出服务器,或者新开一个 cmd 窗口,将压缩包上传到服务器
1
2# scp realworld-nuxtjs.zip root@xxx.xxx.xxx.xxx:path
$ scp realworld-nuxtjs.zip root@106.75.181.60:/root/realworld-nuxtjs
解压
重新连接服务器,并进入压缩包存放的目录,进行解压
1
2
3$ ssh root@106.75.181.60
$ cd realworld-nuxtjs/
$ unzip realworld-nuxtjs.zip查看解压后的文件,-a 表示查看全部(包括隐藏目录)
1
$ ls -a
安装依赖
1 | npm i |
安装成功后如图所示:
需要注意:如果没有安装 node,先要在服务器上安装 node,否则会报错,详情查看服务器端node安装章节
启动服务
1 | npm run start |
使用http://106.75.181.60:3000/
(公网IP:端口号)在浏览器中查看部署成功项目如下所示:
当在浏览器中访问106.75.181.60:3000
报如下错误时候,表明3000端口并未开放,需要在服务器中开放 3000 端口
具体操作步骤查看下面的UCloud服务器防火墙设置部分
服务器端node安装
使用自己封装的脚本安装
封装脚本和下载的安装包查看:node和pm2安装包
服务器端上传文件执行脚本,安装成功后测试
1 | # 新建nodejs目录用于存放安装包 |
使用命令安装
UCloud服务器防火墙设置
防火墙设置两个地方:
- 外网防火墙 (通过服务器厂商提供的页面进行设置 )
- 服务器内部防火墙服务配置 ( 通过服务器命令行 )
外网防火墙
登录 官网
新建防火墙规则组
通过复制已有规则新建
编辑新防火墙规则
添加具体新规则
前端项目喜欢用 3000 端口, 要用哪个端口就仿照这个操作即可
给服务器设置新防火墙规则
内部设置
依次执行下面指令
1 | # 1.查看防火墙状态 |
服务器内部防火墙服务配置
使用PM2启动Node服务
PM2 是什么?
刚才我们在服务端是直接通过npm run start命令来启动了Web服务,如果我们通过这种方式启动起来以后,此时占用了命令行。我们希望它在后台运行这个应用,因此就需要用到pm2工具。
PM2 是一个带有负载均衡功能的 Node 应用进程管理器。
使用 PM2 启动服务
- GitHub 仓库地址
- 官网文档
安装
1
$ npm install --global pm2
配置软连接,类似于 环境变量
1 | # ln -s pm2 二进制执行文件所在路径 /usr/local/bin(建立软连接的路径--环境变量) |
- 进入项目所在目录,使用命令启动服务
1 | $ pm2 start npm --start |
pm2 start npm --start
相当于给npm传参start,通过npm启动服务,服务被pm2进行管理
启动成功后如下图所示:
- 关闭 pm2
1 | pm2 stop id |
运行结果如下图所示:
启动成功后使用http://106.75.181.60:3000/
(公网IP:端口号)在浏览器中查看
pm2 常用的命令
命令 | 说明 |
---|---|
pm2 list | 查看应用列表 |
pm2 start | 启动应用 |
pm2 stop | 停止应用 |
pm2 reload | 重载应用(保证在进程激活的状态下一个一个重启) |
pm2 restart | 重启应用(修改文件后重启) |
pm2 delete | 删除应用 |
pm2 kill | 服务退出(关闭全部进程) |
自动化部署
传统的部署方式需要反复地更新、构建、发布,显得很麻烦。我们希望这件事情能够自动化,即使用现代化的部署方式(CI/CD)
CI/CD 服务
- Jenkins
- Gitlab CI
- GitHub Actions
- Travis CI
- Circle CI
- …
GitHub Actions 自动部署
环境准备
- Linux 服务器
- 把代码提交到 GitHub 远程仓库
配置 GitHub Access Token
https://github.com/settings/tokens
登录 GitHub,点击图像,选择 Settings,点击 Developer settings,如图所示:
然后,选择 Personal access tokens,点击Generate new token,创建Token,如图所示:
填写生成 Token 的相关信息,以及选择相关权限,点击最下面Generate token按钮来生成Token,如图所示:
生成的Token记得复制一份,因为页面刷新后就看不到具体的值
最终生成Token,如图所示:
配置到项目的 Secrets 中:项目所在的 GitHub 地址realworld-nuxtjs
进入仓库,选择 settings,点击 Secrets,再点击 New repository secret,填入生成的TOKEN,如图所示:
配置 GitHub Actions 执行脚本
- 在项目根目录创建 .github/workflows/main.yml 目录
1 | name: Publish And Deploy Demo |
将所需用到的 HOST 、PORT、USERNAME、PASSWORD ,配置到 Secrets 中,和添加TOKEN方式一样
配置 PM2 配置文件
根目录下,新建 pm2.config.json
1 | { |
- 提交更新
1 | $ git add . |
提交成功后如下图所示
在项目仓库中也可以看到
- 查看自动部署状态
1.登录 GitHub,查看新建的 tag:
2.点击 actions ,在All workflows中可以看到部署的版本,如图所示:
3.部署成功,如图所示:
使用http://106.75.181.60:3000/
(公网IP:端口号)在浏览器中查看
在部署过程中可能会使用的其他命令
创建文件与删除文件
命令 | 说明 |
---|---|
mkdir test | 建立新的目录 |
rmdir test | 删除已建立的目录(只能删除空文件夹) |
rm -rf test | 删除非空的文件夹 |
scp相关命令
scp命令可以实现本地与远程服务器之间的双向传输,本地文件可以传输到远程服务,也可以把远程服务器上的文件传输到本地,而且是加密的。
scp [options] source dest
- 从服务器上下载文件
scp username@servername:/path/filename /var/www/local_dir(本地目录)
1 | $ scp root@xx.xx.xx.xx:/var/test.txt /var/www/local_dir |
- 上传本地文件到服务器
scp /path/filename username@servername:/path
1 | $ scp /var/www/test.html root@xx.xx.xx.xx:/var/www/ |
- 从服务器下载整个目录
scp -r username@servername:/var/www/remote_dir(远程目录) /var/www/local_dir(本地目录)
1 | $ scp -r -P 2333 root@xx.xx.xx.xx:/var/www/test /var/www/ /var/www/local_dir |
- 上传本地文件到服务器
scp -r local_dir username@servername:remote_dir
1 | $ scp -r test.html root@xx.xx.xx.xx:/var/www/ |
- 指定密钥文件
这里指定了密钥文件id_rsa.1做为ssh的连接参数,不使用默认的密钥文件。
1 | $ scp test.txt root@xx.xx.xx.xx:/home/ -i ~/.ssh/id_rsa.1 |
- scp命令常用的参数有三个:
-P 是端口号 放在 scp后面
1 | -P 数据传输默认端口,默认是22 |
github中删除 release/tag
找到本地目录下
- 创建 tag
1 | git tag [tag] |
- 删除 tag
1 | git tag -d [tag] |