2015-04-28 17 views
9

PM2 kullanarak dağıttığım düğüm uygulamam için bir ekosistem.json dosyası var.PM2'yi kullanarak, node.js uygulamamı aynı sunucudaki birden çok ortam ve bağlantı noktasına nasıl dağıtabilirim?

ben o farklı şekillerde bir demet yapılandırılması denedim ama etmektir benim amacı gerçekleştirmek şansları olmadı:

  • üretim veya şu anda evreleme çevre (aynı sunucuda her ikisine dağıtmak mümkün).
  • Bire dağıtım yaparken, diğeri de çalışmaya devam etmelidir.
  • 2 farklı ortamlar farklı portlar (prod = 8000, evreleme = 3000) İlk kazanır çalıştırmak komutu dağıtmak hangisi ne olur

olmalıdır.

pm2 deploy production ve sonra pm2 deploy staging yaparsam, yalnızca üretim uygulaması/bağlantı noktası combo sunucuda çalışıyor ve siparişi değiştirirsem tam tersi.

DÜZENLEME: Aşağıdaki conf'ı kullanırsam, pm2 status'da çalışan 2 uygulama olur, ancak bir netstat yaparsam, yalnızca ilk bağlantı noktasını görürüm. (centos 6)

Açık bir şey eksik olmalıyım gibi hissediyorum. İşte benim ecosystem.json dosyası, üstte birden çok uygulama bildirimi olmadan ve denedim.

{ 
    /** 
    * 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 : "[email protected]: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 : "[email protected]: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 
     } 
    } 
    } 
} 

cevap

6

Burada kendi sorumu yanıtlama. Mükemmel bir çözüm olmasa da, bunu (şu an için) gerçekleştirdiğim yol, her ortam için bir tane olmak üzere 2 ayrı ekosistem.json dosyası kullanmaktır. Üretim için ekosistem.json kurulum ve ekosistem prod.json kurulumu için ekosistemim var. pm2 deploy staging ve üretim için ben biraz daha ağız yapın::

Yani şimdi sahnelenişini dağıtmak için bir standart yapmak pm2 deploy ecosystem-prod.json production

Açıkçası ideal değil ama birisi bana aksini söyleyene kadar, bunu yapmanın tek yolu olabilir farklı portlarla aynı kutuda.

+0

Aynı sonuca vardım ve daha iyi bir çözüm bulmayı sabırsızlıkla bekliyorum. Avantaj, isimlerin farklı isimlerle birlikte pm2 listesinde görünmesini sağlamaktır. Örneğin. uygulama aşaması ve uygulama – Bryan

0

nodejs sürümünüz nedir?
1 örnekle küme modunda pm2 çalıştırdığınızı görüyorum.
Kümeleme modunda Pm2, 0.12.x sürümüne kadar çok etkili bir şekilde geliştirilmeyen düğüm düğümlerini kullanır.
Bu durumda, düğüm sürümünüz < 0.12.x sonra bu bilinen bir sorundur.

Düğüm sürümünüzü yükseltin ve sorun çözülecektir.

0

Bir kabuk ortamı değişkeni kullanabilir ve daha sonra pm2 yapılandırma dosyasında javascript kullanabilirsiniz. Örneğin Yapılandırma dosyası varsa ...

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

Ve port numarası 9999 olarak ayarlanır bu

NODE_ENV=production pm2 start config.json 

gibi komut satırından PM2 çalıştırın.

İlgili konular