如何在Nuxt项目中给pm2配置生产环境和测试环境
在 Nuxt.js 项目中,我们有一个全局的环境变量 process.env.NODE_ENV,默认情况下,这个变量的值要么是 production,要么是 development,分别表示生产环境和开发环境。而如果我们使用 pm2 来部署我们的项目,我们需要的环境可能不止这两种,我们还需要测试环境、预生产环境等等。这时候,就需要做一些配置工作才能正常使用,本篇文章就记录一下如何在 Nuxt 项目中给 pm2 配置生产环境和测试环境。
如果要使用 pm2 来部署我们的项目,首先需要在项目根目录中创建一个名为 ecosystem.config.js 的生态系统配置文件,这个文件导出一个对象,这个对象包含两部分:apps 和 deploy。其中 apps 是一个数组,包含我们需要部署的项目信息,一般这个数组只有一个对象,我们在一个生态系统配置文件里只部署一个项目。而 deploy 是一个对象,包含一些项目部署到服务器所需的配置。
module.exports = {
apps: [{}, {}],
deploy: {}
}
假设我们要部署的项目名称为 mydemo,项目总共有三个环境,生产环境 production,测试环境 test,开发环境 development,其中要使用 pm2 部署 production 和 test 两个环境(development 环境只在我们本地开发调试的时候使用,而不用部署)。那么我们的 ecosystem.config.js 文件应该这样写:
module.exports = {
apps: [
{
name: 'mydemo',
script: 'start.js',
env: {
COMMON_VARIABLE: 'true'
},
env_production: {
NODE_ENV: 'production'
},
env_test: {
NODE_ENV: 'test'
}
}
],
deploy: {
production: {
user: '你的服务器登录名',
host: ['你的服务器 IP'],
port: '你的服务器登录端口,默认 22',
ref: 'origin/master',
repo: '你的 git 仓库地址',
path: '/www/mydemo/production',
ssh_options: 'StrictHostKeyChecking=no',
'post-deploy': 'yarn install && npm run build && pm2 startOrRestart ecosystem.config.js --env production'
},
test: {
user: '你的服务器登录名',
host: ['你的服务器 IP'],
port: '你的服务器登录端口,默认 22',
ref: 'origin/test',
repo: '你的 git 仓库地址',
path: '/www/mydemo/test',
ssh_options: 'StrictHostKeyChecking=no',
'post-deploy': 'yarn install && npm run build && pm2 startOrRestart ecosystem.config.js --env test'
}
}
}
可以看到,在 apps 数组的第一个对象中,我们有项目名称,项目入口,以及两个环境,一个是生产环境 env_production,里面 NODE_ENV 的值为 production,另一个是测试环境 env_test,里面 NODE_ENV 的值为 test。在 deploy 中,我们有两个对象,一个是 production,里面是部署生产环境用到的配置,其中 ref 要使用我们项目在 git 仓库的生产分支,path 是我们的生产代码在服务器上存储的路径,post-deploy 中最后指定 --env production 表示我们会用到 apps 中 env_production 的配置。另一个是 test,里面是部署测试环境用到的配置,其中 ref 要使用我们项目在 git 仓库的测试分支,path 是我们的测试代码在服务器上存储的路径,post-deploy 中最后指定 --env test 表示我们会用到 apps 中 env_test 的配置。
写好了 pm2 的生态系统配置文件 ecosystem.config.js,还有一个很重要的地方也要修改,那就是 nuxt.config.js,这个文件是 nuxt 项目的配置文件。我们需要在里面添加一个对象 env,然后在这个对象里面添加名为 NODE_ENV 的字段,字段的值为 process.env.NODE_ENV。这样,我们在程序里面通过 process.env.NODE_ENV 就能获取当前环境是生产环境还是测试环境。如果不写这个的话,即使我们在 ecosystem.config.js 的 env_test 里面配置了测试环境的 NODE_ENV 为 test,我们在代码里面获取到的仍然是 development,而不是 test(默认只有 production 和 development,非 production 的一律按 development 处理)。
module.exports = {
env: {
NODE_ENV: process.env.NODE_ENV
}
}
当我们把这些配置都写好之后,我们就可以通过 pm2 deploy ecosystem.config.js production 命令来部署生产环境,通过 pm2 deploy ecosystem.config.js test 命令来部署测试环境。这两句命令里面的 production 和 test 指的是 ecosystem.config.js 中 deploy 里面的 production 对象和 test 对象,而 post-deploy 里面的 production 和 test 指的是 apps 里面的 env_production 和 env_test,注意不要混淆。
为了方便部署,我们通常在 package.json 文件的 scripts 里面添加两句命令来指代上面的部署命令,这样当我们要部署生产服务时我们只需要输入 npm run prd,当我们要部署测试服务时我们只需要输入 npm run test。
"scripts": {
"prd": "pm2 deploy ecosystem.config.js production",
"test": "pm2 deploy ecosystem.config.js test"
}
就在你以为万事大吉,大功告成的时候,你会发现你没法同时在一台服务器上部署生产环境和测试环境。当你使用 npm run prd 部署好生产服务后,你服务器上的 pm2 会有一个名为 mydemo 的进程。当你使用 npm run test 部署完测试服务后,你服务器上的 pm2 的进程还是只有一个 mydemo,虽然名字相同,但其实它现在已经是你测试环境的服务了。由于名字相同,所以每次它都会替换之前的服务,而不会共存。那么为了可以让生产服务和测试服务同时运行,我们还需要在 ecosystem.config.js 的 apps 的对象里面添加一句 append_env_to_name: true,这表示会把当前环境的名字跟在我们进程的名字后面,最后当我们使用 npm run prd 部署完生产服务后,会发现我们生产服务的名字为 mydemo-production,当我们使用 npm run test 部署完测试服务后,会发现我们测试服务的名字为 mydemo-test,这样就可以让一个项目的生产环境和测试环境同时运行在一个服务器上了。
module.exports = {
apps: [
{
name: 'mydemo',
script: 'start.js',
append_env_to_name: true,
env: {
COMMON_VARIABLE: 'true'
},
env_production: {
NODE_ENV: 'production'
},
env_test: {
NODE_ENV: 'test'
}
}
],
deploy: {}
}
以上就是在一个 Nuxt 项目中给 pm2 配置生产环境和测试环境的过程