【问题标题】:Using PM2, how can I deploy my node.js app to multiple environments and ports on the same server?使用 PM2,如何将我的 node.js 应用程序部署到同一服务器上的多个环境和端口?
【发布时间】:2016-07-09 07:26:14
【问题描述】:

我有一个使用 PM2 部署的节点应用程序的生态系统.json 文件。

我尝试了很多不同的方式来配置它,但没有运气实现我的目标:

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

发生的情况是我首先运行的部署命令获胜。

因此,如果我执行pm2 deploy production 然后pm2 deploy staging,则只有生产应用程序/端口组合在服务器上运行,反之亦然,如果我切换顺序。

编辑:如果我使用下面的配置,pm2 status 中将运行 2 个应用程序,但如果我执行netstat,我只会看到第一个的端口。 (centos 6)

我觉得我一定遗漏了一些明显的东西。这是我的生态系统.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
      }
    }
  }
}

【问题讨论】:

    标签: node.js express deployment environment pm2


    【解决方案1】:

    在这里回答我自己的问题。虽然不是一个完美的解决方案,但我(目前)完成此任务的方式是使用 2 个独立的生态系统.json 文件,每个环境一个。我有用于暂存的生态系统.json 设置和用于生产的生态系统-prod.json 设置。

    所以现在要部署到登台,我做了一个标准:pm2 deploy staging,而对于生产,我做了一个稍微罗嗦的:pm2 deploy ecosystem-prod.json production

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

    【讨论】:

    • 我得出了同样的结论,并期待找到更好的解决方案。优点是名称以不同的名称出现在 pm2 列表中。例如。 app-staging 和 app-prod
    【解决方案2】:

    您可以使用 shell 环境变量,然后在 pm2 配置文件中使用 javascript。 例如,如果您的配置文件有 ...

        "apps": [
        {
            "script": "app/server.js",
            "PORT" : process.env.NODE_ENV == "development" ? 8888 : 9999,
            "name": "MemsharpWeb-" + process.env.NODE_ENV,
    

    然后你像这样从命令行运行 pm2

       NODE_ENV=production pm2 start config.json
    

    端口号将设置为 9999。

    【讨论】:

      【解决方案3】:

      你的 nodejs 版本是多少?
      我可以看到您正在使用 1 个实例以集群模式运行 pm2。
      集群模式下的pm2使用nodejs的custer模块,直到0.12.x版本才有效开发。
      如果是这种情况,您的节点版本

      升级你的节点版本,问题就解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        相关资源
        最近更新 更多