2015-07-22 17 views
6

Ho problemi durante la configurazione di due diverse applicazioni Node.js con domini diversi. Avere due directoryOspita più siti Web utilizzando Node.js Express

"/abc/" -> express-admin setup (backend) -> admin.abc.com 

e

"/xyz/" -> express setup (frontend) -> abc.com 

ho bisogno admin.abc.com per puntare a esprimere-admin e la configurazione abc.com per esprimere l'installazione. Ho vhost installato e sia il sito in ascolto sulla porta 80.

hanno aggiunto

app.use(vhost('abc.com', app)); // xyz/app.js file 
app.use(vhost('admin.abc.com', app)); // abc/app.js file 

I miei problemi:

  • sempre è installato, ogni volta che comincio sia le app, la seconda è sempre ferma. Ho provato a utilizzare diverse porte per entrambe le app, ma ho ancora lo stesso errore. Individualmente corrono senza problemi.

  • Penso che la mia configurazione sia troppo complicata per l'inoltro del dominio. Qualche suggerimento migliore? Potrei avere un master app.js che posso utilizzare per indirizzare i domini alle rispettive app senza utilizzare app.js di ciascuna applicazione.

+3

Stai ancora ospitare le applicazioni sulla stessa porta, utilizzando la stessa rete interfaccia. Quindi, quando inizia la seconda app, troverà sempre la porta in uso. Non dovresti usare una porta diversa da ospitare, anche quando usi vhost? Vedi [questo esempio] (http://stackoverflow.com/questions/9332865/how-should-i-organize-multiple-express-servers-on-the-same-system) per i dettagli. Forse stai meglio usando node-http-proxy, per mantenere le app totalmente indipendenti? Vedi [questo post] (http://nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/) per un confronto. – veggiesaurus

+0

Grazie @veggiesaurus node-http-proxy dovrebbe essere la strada da percorrere. Ti farò sapere, come va. – Pradino

+0

Si prega di fare. Ho aggiunto una risposta alla domanda con un po 'più di dettaglio, nel caso in cui qualcun altro si imbattesse in questa domanda. – veggiesaurus

risposta

6

Non sono sicuro di come stai usando il vhost. Prima di tutto con l'approccio vhost, è necessario eseguire solo un'app express. Non due. Ecco un esempio.

var express = require('express'); 
var vhost = require('vhost'); 

/* 
edit /etc/hosts: 

127.0.0.1  api.mydomain.local 
127.0.0.1  admin.mydomain.local 
*/ 

// require your first app here 

var app1 = require("./app1"); 

// require your second app here 

var app2 = require("./app2"); 

// redirect.use(function(req, res){ 
// if (!module.parent) console.log(req.vhost); 
// res.redirect('http://example.com:3000/' + req.vhost[0]); 
// }); 

// Vhost app 

var appWithVhost = module.exports = express(); 

appWithVhost.use(vhost('api.mydomain.local', app1)); // Serves first app 

appWithVhost.use(vhost('admin.mydomain.local', app2)); // Serves second app 

/* istanbul ignore next */ 
if (!module.parent) { 
    appWithVhost.listen(8000); 
    console.log('Express started on port 8000'); 
} 

Hai solo bisogno di eseguire l'app Express principale con vhost abilitato usando per sempre.

+1

ci sarebbero problemi di prestazioni o altri problemi se questo la stessa impostazione è stata utilizzata per eseguire un numero maggiore (ad esempio 20) di app express? E, supponiamo che 19 di questi siano molto leggeri (esprimenti semplici modelli di rendering Jade) - ma il 20 è un po 'più complesso e richiede un po' di CPU in più. Se avessi 10 utenti attivi su ciascuno dei 20 siti, i 10 che stanno visualizzando quelli più complicati causerebbero rallentamenti per gli spettatori degli altri 19? –

+0

@StandardQuality. Il problema con vhost è che tutte queste app * separate * sono in esecuzione nello stesso spazio utente. È probabile che sia necessario eseguirli in spazi separati (come suexec in apache), in modo che se un sito viene hackerato/si blocca, non può infettare gli altri. Tuttavia, potrebbe non avere molta importanza in questo esempio. Dai un'occhiata a pm2: http://pm2.keymetrics.io/docs/usage/startup/#user-permissions – cmroanirgo

6

Stai ospitando le applicazioni sulla stessa porta, utilizzando la stessa interfaccia di rete. Quindi, quando inizia la seconda app, troverà sempre la porta in uso. Se si desidera utilizzare più applicazioni sulla stessa porta, ciascuna deve disporre di una propria interfaccia di rete. Quando si utilizza vhost, è comunque necessario ascoltare su una porta diversa per ogni app. Vedi this example per i dettagli. Se desideri che le tue app siano completamente indipendenti, è meglio utilizzare node-http-proxy. Ciò consente di ospitare un proxy sulla porta 80 che inoltra le richieste di esprimere app in ascolto su porte diverse. Se una di queste app si arresta in modo anomalo, non si bloccherà l'altra app, diversamente dall'approccio di vhost. This post fornisce un esempio dell'implementazione utilizzando node-http-proxy.

6

Grazie a @veggiesaurus per indicare fino a node-http-proxy. Mi scuso per il post in ritardo.

Ecco come ho risolto il mio problema utilizzando node-http-proxy

struttura di cartelle:

  • www/
    • server.js
    • abc/[Express Setup]
      • app.js
    • /[Express Setup-admin] xyz
      • node_modules/esprimere-admin/app.js

"abc "e" xyz "hanno la propria configurazione e in esecuzione sulla porta x.x.x.x: 3001 e x.x.x.y: 3002

Ho installato node-http-proxy e aggiunto il file server.js con i seguenti codici. Deferito tale link

var http = require('http'); 
var httpProxy = require('http-proxy'); 

var proxy = httpProxy.createProxy(); 
var options = { 
    'abc.com': 'http://x.x.x.x:3001', 
    'xyz.com': 'http://x.x.x.y:3002' 
} 

http.createServer(function(req, res) { 
    proxy.web(req, res, { 
    target: options[req.headers.host] 
    }); 
}).listen(80); 

Infine, utilizzato sempre per eseguire tutte le 3 applicazioni di installazione per funzionare sempre in porto 3001, 3002 e 80.

Problemi correlati