2012-04-18 15 views
10

Il mio obiettivo finale è rendere node.js più conveniente per ogni istanza del server.Come rendere Node.js multi-tenant per i siti Web sulla porta 80?

Non sto utilizzando un gioco o una chat ma piuttosto semplici siti Web per i clienti. Mi piacerebbe ospitare più client su un singolo server ma avere più siti web che scappano dalla porta 80 usando la mappatura dell'intestazione dell'host. Mi piacerebbe comunque usare express come sto facendo, ma è più come una cosa di routing dalla porta 80 alle altre app di nodo, se ciò è possibile. Il nodo può essere più economico se è fatto in questo modo ma attualmente è più costoso per i miei scopi dato che ogni cliente avrebbe bisogno della propria scatola se in esecuzione sulla porta 80. Inoltre, la mia motivazione è concentrarsi sullo sviluppo dei nodi ma ci deve essere un motivo per farlo quindi in termini di costi.

Lo faccio parecchio per ASP.NET in Windows come IIS supporta questo fuori dalla scatola e so che questo è qualcosa di normale anche per Apache.

Sentitevi liberi di spostarlo in un altro forum nello stack exchange se questa non è la domanda giusta o se dare una critica costruttiva piuttosto che un downvot casuale. Grazie.

aggiornamento

L'approccio che ho preso è stato quello di utilizzare l'hosting statico (via gatspy e s3) poi un'API invece che domini registrati attraverso un messaggio di posta del chiavi del client e API dal server e genera periodicamente siti statici come cambiano i siti ma grazie per tutti i suggerimenti!

+1

Dalla tua domanda sembra che tu sappia già la risposta di base - usa 'req.headers.host' per decidere tra diverse catene di routing per diversi vhosts - quindi stai chiedendo un modo integrato per farlo? O una biblioteca per astrarre i dettagli? – jimw

+0

integrato sarebbe preferibile, il nodo è ottimo in quanto è possibile eseguire il rollover ma preferirei qualcosa di attivamente costruito a sé stante –

+1

C'è [questo] (https://github.com/coolaj86/connect-vhoster), ma non è un progetto molto attivo. Altrimenti [node-http-proxy] (https://github.com/nodejitsu/node-http-proxy), che è molto più attivo ma forse molto più del necessario. – jimw

risposta

25

In teoria, è possibile creare un server Web puramente Node che abbia emulato la funzionalità di Apache/Lighttpd/Nginx, ma non lo consiglierei. In effetti, per servizi di produzione seria, ti consiglio SEMPRE di affrontare il tuo servizio con Nginx o un equivalente (vedi this e this).

Ecco come un semplice Nginx config avrebbe funzionato per due sottoservizi esposti sulla porta 80.

worker_processes 4; 

events { 
    worker_connections 1024; 
} 

http { 
    include  mime.types; 
    default_type text/html; 

    server { 
    listen 80; 
    server_name service1.mydomain.com 
    location/{ 
     proxy_pass   http://127.0.0.1:3000/; 
    } 
    } 
    server { 
    listen 80; 
    server_name service2.mydomain.com 
    location/{ 
     proxy_pass   http://127.0.0.1:3001/; 
    } 
    } 
} 

Ho visto la produzione di scatole di kernel panic, perché il nodo non lo fa carico della valvola a farfalla per default ed è stato dando la priorità accettare nuove connessioni superando le richieste esistenti - concesse, "non dovrebbe" aver arrestato il kernel, ma lo ha fatto. Inoltre, eseguendo sulla porta 3000, è possibile eseguire il servizio di nodo come non root con pochissime autorizzazioni (e comunque proxyarlo in modo che appaia sulla porta 80). Puoi anche distribuire il carico tra più lavoratori, servire statiche, richieste di registri, riscrivere gli URL, ecc. Ecc. Ecc. Nginx è molto veloce (molto più leggero di Apache). Il sovraccarico dello stesso proxy forwarding è minimo e ti offre tanta funzionalità e robustezza che è uno schianto nel mio libro. Anche cose minori, come quando faccio crash o sovraccarico il mio servizio di nodo, l'utente ottiene un buco nero, o un "perdono la polvere, i nostri server vengono mantenuti" splash.

+1

Ho visto anche questa risposta. http://stackoverflow.com/questions/5009324/node-js-nginx-and-now Controllerò il tuo perché sono d'accordo che questo è l'approccio migliore che ho visto. Grazie. –

+0

Proprio come una domanda: questa non è una multitenancy in quanto c'è più di un software in esecuzione ma si tratta di avere diversi siti Web che usano la stessa porta su un server giusto? – IroNEDR

5

Per quanto riguarda l'utilizzo di un proxy inverso corretto, ad esempio HAProxy, il proxy deve ascoltare sulla porta 80 e delegare a più istanze di nodo su porte non pubbliche (ad esempio 10000, 10001 ecc.), In base a headers.host?

+0

sì che ha senso –

+0

Il problema principale con questo è che non avrei accesso a questo livello affinché HAProxy funzioni. Sto cercando una soluzione Node.js direttamente, ma questo è sicuramente utile. Metto questo nella mia mente per idee future. –

+3

Personalmente non mi fiderei di una soluzione solo per il nodo, specialmente perché stai parlando di diversi siti di clienti. Il nodo è a thread singolo, il che significa che i siti interferiranno facilmente tra di loro e/o si guasteranno quando muoiono (se sono tutti in esecuzione nella stessa istanza). Come stai attualmente distribuendo il nodo? – UpTheCreek

Problemi correlati