使用PM2,如何将node.js应用程序部署到同一服务器上的多个环境和端口?

k00*_*00k 12 deployment environment node.js express pm2

我有一个使用PM2部署的节点应用程序的ecosystem.json文件.

我已经尝试过一些不同的方式配置它,但没有运气实现我的目标是:

  • 能够部署到生产环境或登台环境(当前都在同一台服务器上).
  • 当部署到一个时,另一个应该保持运行.
  • 2个不同的环境应该在不同的端口上(prod = 8000,staging = 3000)

无论我首先运行哪个部署命令都会发生什么.

因此,如果我这样做pm2 deploy production,那么pm2 deploy staging只有生产应用程序/端口组合在服务器上运行,反之亦然,如果我切换订单.

编辑:如果我使用下面的conf,将会有2个应用程序运行pm2 status,但如果我这样做netstat,我只看到第一个端口.(centos 6)

我觉得我必须遗漏一些明显的东西.这是我的ecosystem.json文件,我在顶部尝试了多个应用程序声明.

{
  /**
   * Here we declare the apps that must be managed by PM2
   * All options are listed here:
   * https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#json-app-declaration
   *
   */
  apps : [
    {
      "name"       : "myapp-staging",
      "script"     : "app.js",
      "instances"  : "1",
      "error_file" : "/var/log/nodejs/myapp.mydomain.com-staging-err.log",
      "out_file"   : "/var/log/nodejs/myapp.mydomain.com-staging-out.log",
      "pid_file"   : "/home/node/myapp.mydomain.com-staging.pid",
      "exec_mode"  : "cluster_mode",
      "env_staging" : {
        "NODE_ENV": "staging", "PORT": 3000
      },
      "env_production" : {
        "NODE_ENV": "production", "PORT": 8000
      }
    },
    {
      "name"       : "myapp-production",
      "script"     : "app.js",
      "instances"  : "1",
      "error_file" : "/var/log/nodejs/myapp.mydomain.com-staging-err.log",
      "out_file"   : "/var/log/nodejs/myapp.mydomain.com-staging-out.log",
      "pid_file"   : "/home/node/myapp.mydomain.com-staging.pid",
      "exec_mode"  : "cluster_mode",
      "env_production" : {
        "NODE_ENV": "production", "PORT": 8000
      }
    }

  ],


  /**
   * PM2 help you to deploy apps over your servers
   * For more help go to :
   * https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#deployment-pm2--090
   */
  deploy : {
    production : {
      user : "node",
      host : "node01.mydomain.com",
      ref  : "origin/master",
      repo : "git@bitbucket.org:mydomain/mydomain-myapp.git",
      path : "/var/production/myapp.mydomain.com-production/",
      "post-deploy" : "npm prune && npm install -l && pm2 startOrGracefulReload ecosystem.json --env production",
      env  : {
        NODE_ENV: "production",
        PORT: 8000
      }
    },
    staging : {
      user : "node",
      host : "node01.mydomain.com",
      ref  : "origin/master",
      repo : "git@bitbucket.org:mydomain/mydomain-myapp.git",
      path : "/var/production/myapp.mydomain.com-staging/",
      "post-deploy" : "npm prune && npm install -l && pm2 startOrGracefulReload ecosystem.json --env staging",
      env  : {
        NODE_ENV: "staging",
        PORT: 3000
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

k00*_*00k 7

在这里回答我自己的问题.虽然不是一个完美的解决方案,但我完成这个(现在)的方法是使用2个独立的ecosystem.json文件,每个环境一个.我有用于staging和ecosystem-prod.json设置的ecosystem.json设置用于生产.

所以现在要部署到分段我做一个标准:pm2 deploy staging而对于制作我做了一个更多的罗嗦:pm2 deploy ecosystem-prod.json production

显然不理想,但除非有人告诉我,否则可能是在不同端口的同一个盒子上进行此操作的唯一方法.