2012-02-17 10 views
44

Sto utilizzando un server per ospitare più app web Node.js, che sono distribuite su più domini. La mia pratica corrente è di eseguire un server Express per ogni app su una porta diversa e di eseguire un server di base che instradi semplicemente (reindirizza) le richieste al server di porta/Express corretto. Funziona, ma significa che il mio server di base sta indirizzando ogni singola richiesta HTTP (e reindirizzandolo manualmente), e che i miei utenti vedono le mie app come ospitate su [hostname.com]: 8000.Come dovrei organizzare più server Express sullo stesso sistema?

Dopo un po 'di ricerche, ho scoperto che posso utilizzare http-proxy per le mie esigenze di routing, ma mi piacerebbe comunque sapere se esiste una procedura ottimale per l'esecuzione di più server Express sullo stesso sistema. Ecco come ho intenzione di farlo:

Ogni app Web avrà una propria cartella, con una struttura di cartelle Express completa (app.js, percorsi, viste, ecc.) Le app saranno raggruppate per dominio, quindi struttura di cartella di esempio potrebbe essere:

hostname.com/ 
     app.js 
     routes/ 
     views/ 
     ... 
     app1/ 
      app1.js 
      routes/ 
      views/ 
      ... 
     app2 
     ... 
    hostname2.com/ 
     app.js 
     routes/ 
     views/ 
     ... 

dovrò eseguire ciascuna app.js separatamente con nodo (o con forever, che sono attualmente in uso), e ognuno dovrà utilizzare una porta diversa internamente , con i reindirizzamenti cross-app puntati verso la porta dell'app target.

Quindi, questo è il mio piano attuale. Quali sono i problemi con esso e quali sono le insidie ​​dovrei cercare di evitare? Ancora più importante, esiste una soluzione consolidata a questo problema: il problema di ospitare più app Web sullo stesso sistema con Node.js/Express?

EDIT: Ho intenzione utilizzare per eventualmente WebSockets e HTTPS, e la quantità di larghezza di banda in grado di supportare la mia configurazione è di poca importanza per me - questo è un server di sviluppo (almeno per ora). Grazie a David Ellis per aver sollevato il problema di WebSockets.

SECONDA EDIT: Grazie a EhevuTov e David Ellis per le loro risposte, entrambi hanno aiutato molto. Sto ancora sistemando su una struttura generale per la mia applicazione, e sembra che la domanda sia affrontata in dettaglio da this StackOverflow question

TERZO EDIT: Sono arrivato un modo da quando ho postato questa domanda (anche se ho molto più da partire). Dai un'occhiata a this file in my GitHub repository, che sfrutta ciò che ho imparato dalle risposte a questa domanda!

risposta

35

Poiché Express utilizza Connect, sono abbastanza sicuro che è possibile utilizzare il middleware host virtuale di Connect. Funziona in modo simile ad altri moduli vhost su altri prodotti. Non ho più domini per testare e mostrare il codice corretto, ma vorrei pensare che è qualcosa di simile:

express.createServer() 
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app) 
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app) 
.listen(80) 

Se si arriva al punto in cui un server Express non è sufficiente, allora considerare di usare il nodo.Cluster dall'API. Se anche questo non è sufficiente, la pratica corrente consiste nel mettere un proxy inverso asnyc come Nginx davanti ai server Express e indirizzare i proxy verso i server Express.

+0

Grazie per il commento. Ho iniziato a usare vhost (con l'aiuto di alcuni utili utenti IRC in #express), e funziona come un fascino. Inoltre, grazie per l'heads up, la possibilità di passare a Node.Cluster. – Aaron

+2

@aaron Sei il benvenuto. Ci vediamo su IRC, forse – EhevuTov

+0

@'Aaron Hai del codice che potresti condividere per mostrarci come lo fai? – Matt

6

Se non è necessario utilizzare WebSockets (o qualsiasi funzione HTTP 1.1, in realtà), you can use NginX as your proxy instead.

Il vantaggio è il carico totale che NginX è in grado di gestire rispetto a Nodo è più elevato (essendo staticamente compilato e specializzato per questo genere di cose, in pratica), ma si perde la capacità di trasmettere dati (inviando blocchi più piccoli alla volta).

Per un sito più piccolo, o se non si è sicuri di quali funzionalità saranno necessarie in futuro, è probabilmente meglio attenersi a node-http-proxy e passare a NginX solo se è possibile dimostrare che il proxy è il collo di bottiglia sul server. Fortunatamente NginX non è difficile da configurare se ne hai bisogno in seguito.

+0

Ho in programma di utilizzare eventualmente WebSockets e HTTPS e la quantità di larghezza di banda supportata dalla mia installazione è di scarsa importanza per me: si tratta di un server di sviluppo (almeno per ora). Grazie per aver sollevato il problema di WebSockets. Tuttavia, la mia domanda riguarda l'organizzazione del mio sistema un passaggio _after_ server proxy inverso - come dovrei configurare e organizzare i server Express per le mie app web multiple? – Aaron

+0

Direi che Node.js è abbastanza giovane da non avere uno schema * stabilito * per più app Express sullo stesso server. Node.js condivide di più in comune con Tomcat/Getty e altri server Web basati su Java; un'app per server, mentre l'hosting di più siti web è stato tradizionalmente fatto con un singolo server web (Apache/NginX/Lighttpd/etc). Ogni webapp Node.js deve essere configurata per non utilizzare una porta TCP utilizzata da un'altra webapp, quindi non c'è un modo "drag-n-drop" per farlo configurare. –

+2

Da aggiungere, perché un server Node.js HTTP può essere configurato per l'ascolto su una porta [solo per un nome host specifico] (http://nodejs.org/docs/v0.6.10/api/http.html# server.listen), si * potrebbe * avere il tutto configurato come un processo Node.js che esegue simultaneamente più server Express. Ovviamente questo ha poco senso quando questi server non toccano mai il codice tra loro e il sovraccarico del processo Node.js è solo una manciata di megabyte, ma è anche una "opzione". –