使用PM2,我怎样才能将我的node.js应用程序部署到同一台服务器上的多个环境和端口?

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

我已经试过configuration了一堆不同的方式,但没有运气完成我的目标是:

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

发生什么事是我运行的第一个胜利的部署命令。

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

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

我觉得我一定是错过了一些明显的东西。 这是我的ecos.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 } } } } 

在这里回答我自己的问题。 虽然不是一个完美的解决scheme,但我已经完成了这个(现在)的方式是使用两个独立的ecos.json文件,每个环境一个。 我有生产阶段和生态系统prod.json安装ecos.json设置。

所以现在要部署到分期我做一个标准: pm2 deploy staging和生产我做一个稍微罗嗦: pm2 deploy ecosystem-prod.json production

显然不理想,但直到有人告诉我,否则,可能是在不同的端口在同一个盒子上做的唯一方法。

你的nodejs版本是什么?
我可以看到,您正在使用1个实例在集群模式下运行pm2。
集群模式下的Pm2使用nodejs的custer模块,直到版本0.12.x才开发得非常有效。
如果是这样,您的节点版本<0.12.x,那么这是一个已知的问题。

升级你的节点版本和问题将被解决。

您可以使用shell环境variables,然后在pm2configuration文件中使用javascript。 例如,如果你的configuration文件有…

  "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。