簡體   English   中英

使用PM2,如何將node.js應用程序部署到同一服務器上的多個環境和端口?

[英]Using PM2, how can I deploy my node.js app to multiple environments and ports on the same server?

我有一個使用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
      }
    }
  }
}

在這里回答我自己的問題。 雖然不是一個完美的解決方案,但我完成這個(現在)的方法是使用2個獨立的ecosystem.json文件,每個環境一個。 我有用於staging和ecosystem-prod.json設置的ecosystem.json設置用於生產。

所以現在要部署到分段我做一個標准: pm2 deploy staging和生產我做了一個更多的羅嗦: pm2 deploy ecosystem-prod.json production

顯然不理想,但除非有人告訴我,否則可能是在不同端口的同一個盒子上進行此操作的唯一方法。

你的nodejs版本是什么?
我可以看到你在群集模式下使用1個實例運行pm2。
集群模式下的Pm2使用nodejs的custer模塊,直到版本0.12.x才開發得非常有效。
如果是這種情況,您的節點版本<0.12.x,那么這是一個已知問題。

升級您的節點版本,問題將得到解決。

您可以使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM