我有一个使用PM2部署的节点应用程序的ecosystem.json文件。
我尝试过一些不同的方式配置它,但没有运气实现我的目标是:
无论我首先运行哪个部署命令,都会发生什么。
因此,如果我执行pm2 deploy production
然后pm2 deploy staging
,则只有生产应用程序/端口组合在服务器上运行,反之亦然,如果我切换订单。
编辑:如果我使用下面的配置文件,则会在pm2 status
中运行2个应用,但如果我执行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
}
}
}
}
答案 0 :(得分:6)
在这里回答我自己的问题。虽然不是一个完美的解决方案,但我实现这一目标(目前)的方法是使用2个独立的ecosystem.json文件,每个环境一个。我有用于staging和ecosystem-prod.json设置的ecosystem.json设置用于生产。
所以现在要部署到分段我做一个标准:pm2 deploy staging
并且为了制作我做了一个更多的罗嗦:pm2 deploy ecosystem-prod.json production
显然不理想,但在有人告诉我之前,可能是在不同端口的同一个盒子上进行此操作的唯一方法。
答案 1 :(得分:0)
您的nodejs版本是什么?
我可以看到你在集群模式下使用1个实例操作pm2
集群模式下的Pm2使用nodejs的custer模块,直到版本0.12.x才开发得非常有效
如果是这种情况,您的节点版本< 0.12.x然后这是一个已知的问题。
升级您的节点版本,问题将得到解决。
答案 2 :(得分:0)
您可以使用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。