2016-06-24 48 views
13

Ho un'applicazione Web completa che utilizza NodeJS, MongoDB (Mongoose come driver) e ExpressJS.Google App Engine 502 (Gateway non valido) con NodeJS

Il progetto funziona perfettamente sul mio computer locale. Oggi ho deciso di spostare tutto alla produzione. Sto utilizzando Google App Engine per ospitare la mia applicazione e Compose (formalmente MongoHQ) per ospitare il mio database.

App Engine server perfettamente la mia applicazione, anche se la mia API non sembra funzionare. La mia API viene pubblicata da example.com/api e ogni richiesta (GET, POST, DELETE e PUT) restituisce un errore 502 (gateway non valido).

Ho provato a eseguire l'applicazione sul mio computer locale mentre ero connesso al mio database MongoDB remoto e questo ha funzionato perfettamente. Quindi deve essere un problema con App Engine o NodeJS, non con MongoDB.

Ho provato a controllare tutti i log degli errori in Google Cloud, anche se non ci sono errori.

Perché App Engine/NodeJS serve perfettamente il contenuto statico della mia applicazione, sebbene non consenta alcuna richiesta alla mia API?

risposta

10

502 Bad Gateway è in genere un errore sul lato Nginx. Sfortunatamente quei log non sono ancora disponibili per il Cloud Logging.

Un sacco di volte il problema è che i pacchetti HTTP sono troppo grandi per i buffer o qualcosa di simile. Il modo in cui è possibile visualizzare il registro nginx è qualcosa del tipo:

  • Utilizzare solo 1 VM. Questo non è strettamente necessario, ma molte volte rende più facile il debug dell'applicazione se si conoscono le richieste su una macchina. È possibile raggiungere questo obiettivo con l'aggiunta di questo alla vostra app.yaml:

manual_scaling: instances: 1 poi ri-distribuire

  • Passa la VM da "Google di proprietà" per autogestita. Questo può essere fatto nella console cloud. Andare su Compute Engine, istanze, fare clic sul nome dell'istanza che corrisponde alla versione App Engine e dovresti visualizzare un'opzione per impostarlo su autogestito.

  • gcloud compute ssh <instance name> a ssh alla macchina

  • docker ps per vedere i vostri contenitori in esecuzione. Cerca il contenitore chiamato nginx e prendi il suo id.

  • Una volta che si dispone di un ID contenitore, si dovrebbe essere in grado di docker exec -it <container id> -- cat /var/log/nginx/error.log. Si potrebbe voler ls quella directory di registro intero.

Probabilmente vedrete un errore lì che sarà un suggerimento più grande su cosa non va.

So che questo è molto più complicato di quanto dovrebbe essere: - \ Se hai qualche problema con i passaggi precedenti, lascia un commento. Se trovi un errore e non sei sicuro di cosa farne, lascia un commento.

+0

Ebbene ecco un colpo di scena. Semplicemente aggiungendo 'manual_scaling: instances: 5' al mio file' app.yaml' e la sua distribuzione ha risolto l'intero problema. Qualche idea sul perché sarebbe? – Fizzix

+0

Sebbene, durante il tentativo di accedere a una delle mie API più avanzate, come il caricamento delle immagini, non riesce ancora. Questo è probabilmente perché sto inviando una grande stringa Base64 alla mia API. C'è un modo per aumentare la quantità di dati che possono essere inviati all'API dei miei server? – Fizzix

+0

Wow, ho appena realizzato che intendevo manual_scaling: istanze impostate su 1, non su 5! In questo modo sai per certo quale richiesta stai guardando. Seguirò comunque il resto di questi passaggi per vedere se non riesci a trovare i log degli errori. Ad ogni modo, se i tuoi pacchetti sono troppo grandi per il buffer, non c'è modo di aumentare direttamente, quindi la soluzione migliore è capire come interrompere i dati che devi trasmettere in più pacchetti. –