Going Live With Node

Nel mio precedente articolo ho parlato della mia gioia di scoprire la struttura Express. Express è ciò che mi fa sentire come se potessi davvero creare qualcosa con Node e divertirmi a farlo. E infatti - l'ho fatto! Ho creato alcune app web di esempio e mi sono divertito molto. Ma alla fine ho deciso che era tempo di arrendersi e diventare serio. Mi è piaciuto Nodo, ho apprezzato Express e, se mi stavo davvero impegnando a impararlo, allora perché non fare il passo finale e creare effettivamente un vero sito Web che lo utilizza.

Un'altra cosa che ho imparato all'inizio durante il mio corso di formazione sul nodo (Nodacation?) È stata che dovendo fermarsi e riavviare un'app Node è stato un vero dolore nella parte posteriore. Ho avuto un grande successo usando Nodemon di Remy Sharp. Noterà gli aggiornamenti del tuo codice e riavvierà automaticamente l'app Node.

Questo sembra banale, suppongo, ma per me la mia intera esperienza con Node era alla riga di comando. Mi piacerebbe semplicemente correre nodo app e testare via sulla porta 3000. Non sapevo davvero in che cosa consistesse ottenere la stessa applicazione su un server reale e rispondere a un dominio. In questo articolo descriverò due diversi tentativi che ho fatto per spostare un'app Node in produzione. Ovviamente ci sono molti altri modi (e cerca altri articoli qui su Nettuts +!) Quindi tieni presente che questo è quello che ho provato e ho avuto successo con.


Tentativo uno: Apache FTW!

Il mio tipico processo per far avanzare un nuovo sito ColdFusion è stato semplicemente spingere i miei file via FTP e modificare manualmente il mio Apache httpd.conf file per aggiungere il nuovo server virtuale.

Una delle cose che ho menzionato nel mio precedente articolo è che la maggior parte della mia esperienza con lo sviluppo lato server coinvolge Adobe ColdFusion. Se non lo hai mai usato, una delle sue caratteristiche principali è l'integrazione con il tuo server web (molto simile a PHP). Ciò significa che posso dire al server dell'app di consentire ad Apache (o IIS, ecc.) Di sapere che qualsiasi richiesta per un file di una certa estensione dovrebbe essere trasferita al server ColdFusion.

Ovviamente il nodo è un po 'diverso - in pratica stai già assumendo il ruolo di un server web. Quindi non sapevo come avrei potuto prendere un'app Node e pubblicarla sul mio server di produzione esistente. Il mio tipico processo per far avanzare un nuovo sito ColdFusion è stato semplicemente spingere i miei file via FTP e modificare manualmente il mio Apache httpd.conf file per aggiungere il nuovo server virtuale. (Se avessi usato IIS sarebbe praticamente lo stesso, tranne che avrei usato il loro strumento grafico.)

Ho iniziato da Google su questo argomento e ho trovato alcune risposte. Quello che ha davvero aiutato di più è stato un articolo di Davy Brion, "Hosting di un sito Node.js tramite Apache". (Per vedere come ciò può essere fatto con IIS, vedere l'articolo approfondito di Scott Hanselman.) Il suo articolo suddivide in due aspetti: assicurarsi che lo script del nodo venga eseguito all'avvio del server e alla configurazione di Apache. Ho ignorato l'aspetto di avvio dello script poiché la sua soluzione riguardava Linux e il mio server di produzione utilizzava Windows. (Sono un grande fan di OS X ma per qualche motivo mi sono sempre sentito più a mio agio su Windows. Non so perché, ma funziona per me. Essenzialmente la sua soluzione si riduce al fatto che Apache proxy le richieste (back e avanti) tra se stesso e l'applicazione Node. Ecco un esempio che ho usato per testare:

  ServerName nodetest.dev ProxyRequests Off ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/ 

Si noti che questo è leggermente diverso dall'esempio di Davy. Vuoi assicurarti di averlo abilitato mod_proxy e mod_proxy_http che dovrebbe essere semplice come garantire che non siano commentati nel tuo file conf. Infine, ho riavviato Apache e aggiunto una voce al mio file hosts locale per il dominio che ho specificato sopra. E ha funzionato!

Ora, mentre questo ha funzionato, farò notare che molti dei risultati che otterrete da Google su questo argomento discuteranno su come la gente non pensa che questa sia una soluzione molto performante. Per essere onesti, mi aspettavo di ospitare un sito che avrebbe ottenuto - nel migliore dei casi - un migliaio di visite al giorno, quindi non mi riguardava veramente. Ciò che mi preoccupava però era impostare la mia app in modo che fosse avviata automaticamente e riavviata su Windows. Ho visto alcune soluzioni, ma prima di staccare la spina e lanciare il mio sito, ho deciso di scavare un po 'e vedere se un'altra opzione potrebbe funzionare meglio per me.


Tentativo due: rilevamento di AppFog


Ho scoperto AppFog dopo averlo letto da un mio collega. AppFog è un servizio basato su cloud (ciò che non è in questi giorni) che semplifica l'hosting delle applicazioni utilizzando una varietà di motori popolari. Da PHP a Grails a Ruby e - ovviamente - Node. Insieme al supporto per vari motori, si integra bene anche con vari database e provider SCM. Ha un ottimo supporto da riga di comando, ma quello che mi ha davvero venduto è che puoi testarlo gratuitamente. AppFog ha una varietà di livelli di servizio, ma puoi testare con un URL un po 'brutto pubblico gratuitamente, subito. Diamo un'occhiata a quanto velocemente puoi andare in diretta usando AppFog.

Per prima cosa, ti consigliamo di iscriverti. Una volta completata la registrazione e la verifica, tieni nella console di AppFog:


C'è molto qui che non copriremo l'articolo, ma per ora, basta cliccare su applicazioni.


Per la tua prima app, colpisci il lucido Nuova app pulsante. Ora hai una decisione da prendere. Con quale delle molte app di avviamento vedrai la tua applicazione? Nota che per ognuna delle app di partenza puoi effettivamente dare un'occhiata a quale codice verrà usato per inizializzare la tua applicazione. Per essere chiari, se hai un'app di Node esistente, come ho fatto io, il codice usato qui non interferirà. Lo farai semplicemente saltare via più tardi. Ho selezionato Node Express.


Successivamente dovrai selezionare come è ospitata la tua applicazione. Sarò onesto qui e dirò che quando ho giocato con AppFog per la prima volta non sapevo davvero cosa selezionare qui. Sono andato con AWS US East perché avevo più familiarità con AWS che con HP o con le soluzioni Microsoft.


Alla fine, ti viene chiesto di selezionare un nome di dominio. Nota che stai selezionando solo una parte del nome del dominio. Una volta eseguito l'upgrade a un livello a pagamento, è possibile aggiungere domini "reali" alle proprie applicazioni. Ma per i test, questo va bene. Sono andato con nettutshelloworld.


Clicca il Crea app e torna indietro mentre AppFog va in città ...


Dopo che tutto è stato fatto, ti ritrovi nella console di amministrazione principale della tua applicazione. Ci sono alcune opzioni disponibili qui, inclusa la possibilità di aggiungere cose come supporto per database e pacchetti di registrazione. Puoi anche avviare, interrompere e riavviare la tua applicazione da qui.


Come passaggio finale, vai avanti e fai clic su Visita il sito Live pulsante solo per confermare che - sì - in circa un minuto in cui hai implementato un'app Node sul Web senza problemi:


Woot! Ok, quindi le parti difficili fatte. Come possiamo ottenere la nostra applicazione sulla piattaforma AppFog? Potresti aver notato un pulsante "Scarica codice sorgente". Questo ti dà una copia dell'applicazione "seme" Node Express, ma vogliamo invece distribuire la nostra applicazione. Se leggi il mio precedente articolo, ti ricorderai che ci siamo ritrovati con una semplice applicazione per blog. Aveva due viste (una lista di voci e una voce particolare) basate su un elenco statico di dati del blog. Nel file zip che puoi scaricare da quell'articolo, la cartella "blog4" è quella con cui lavorerò.

Per distribuire il codice su AppFog, utilizzare un semplice programma a riga di comando, af. Questo strumento può essere installato su Windows, OS X e Linux. Le istruzioni di installazione sono dettagliate qui (https://docs.appfog.com/getting-started/af-cli) ma essenzialmente si riduce a:

 gem installare af

Una volta installato, puoi, per la maggior parte, dimenticarti della console AppFog. Sicuramente dovrai tornare lì alla fine, ma per il mio sito di produzione l'ho usato raramente. Lo strumento af supporta, per quanto ne so, tutto ciò che supporta anche la console. Per iniziare, prima devi effettuare il login.


Questo login sembra persistere per un po ', ma in generale faccio sempre il login per primo quando inizio a lavorare con la mia applicazione. Ora ho intenzione di passare alla cartella contenente la mia applicazione.


Ora per la parte interessante. Spingere il tuo codice su AppFog è semplice come inviare un comando di aggiornamento, in questo modo:


Lo screenshot qui sopra non ti dà un'idea di quanto tempo impiega il processo. Ognuna di quelle linee è stata sputata via via che accadeva. Nei miei test, questo processo dura circa 10 secondi. Le mie applicazioni sono piccole, quindi il tuo chilometraggio può variare. Nel caso in cui sei curioso, sì, la mia domanda era inattiva durante questo processo. Nel processo di aggiornamento di 10 secondi, i tempi di inattività ammontavano a circa 2 secondi. Penso che vada bene, ma se questo ti infastidisce, allora c'è una soluzione eccellente descritta sul blog di AppFog: Come aggiornare l'app AppFog con il tempo di inattività ZERO.

Ha funzionato? Vedi di persona. Apri il tuo browser su http://nettutshelloworld.aws.af.cm/ e dovresti vedere il meraviglioso, se statico, blog che ho costruito:



È proprio questo?

La prima volta che ho attraversato questo processo ho quasi gridato di gioia. Non potevo credere quanto fosse semplice. Per me, questa era davvero la "connessione finale" tra la scrittura di applicazioni Node e la loro effettiva condivisione con il mondo. Certo, c'erano alcuni avvertimenti a cui mi sono imbattuto. Il primo è che mentre la mia applicazione funzionava come su AppFog, dovresti legare la porta che ascolta attraverso una variabile di ambiente. Quindi ho dovuto cambiare questa linea:

 app.listen (3000);

A questo:

 app.listen (process.env.VCAP_APP_PORT || 3000);

Come ho detto, la mia applicazione ha funzionato così com'è, ma immagino che 3000 potrebbero non essere sempre disponibili, quindi assicurati di fare questo piccolo aggiustamento. Se si utilizzano altri servizi, come MySQL o Mongo, sarà necessario apportare modifiche simili. (Anche se nella mia applicazione di produzione, devo ancora aggiornare la connessione Mongo e non è stato ancora un problema. Ma è nella mia lista delle cose da fare!)

Quindi, come ha funzionato per me? Per la maggior parte - perfetto. Ora ho lanciato due siti su AppFog, JavaScript Cookbook e CajunIpsum. Se dovessi fare una critica, sarebbe stato il primo - e solo il tempo - che dovevo contattare il supporto, non ero contento di quanto tempo ci fosse voluto per ottenere una risposta. Fino ad ora ho avuto solo una richiesta di supporto, quindi sono pronto a scommettere (o sperare) che si tratti di una situazione insolita.

.