502 Bad Gateway Déploiement d'Exprimer un Modèle de Générateur sur Elastic Beanstalk
J'ai utilisé l'express générateur pour créer une simple express app, qui, lorsqu'il a commencé à dev fonctionne très bien sur localhost:3000.
Quand je le pousser à l'elastic beanstalk à l'aide de l'eb commande-- git aws.pousser, cependant, je reçois une erreur 502 sur le serveur de production.
À la recherche dans les journaux, l'erreur que j'obtiens est:
2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET /HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com"
2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8081/favicon.ico", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com"
Je suis en utilisant la valeur par défaut de configuration de nginx. Lorsque je lance un node.js exemple d'application, sans l'autorisation Expresse, il fonctionne très bien. Voici l'express code app.js:
var express = require('express');
var http = require('http');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes');
var users = require('./routes/user');
var app = express();
//view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
app.get('/', routes.index);
app.get('/users', users.list);
///catch 404 and forwarding to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
///error handlers
//development error handler
//will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.render('error', {
message: err.message,
error: err
});
});
}
//production error handler
//no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
Et voici le colis.fichier json:
{
"name": "macEnvExp",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "DEBUG=macEnvExp node bin/www"
},
"dependencies": {
"express": "~3.4.8",
"static-favicon": "~1.0.0",
"morgan": "~1.0.0",
"cookie-parser": "~1.0.1",
"body-parser": "~1.0.0",
"debug": "~0.7.4",
"jade": "~1.3.0"
}
}
Et voici bin/www:
#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');
app.configure(function(){
app.set('port', process.env.PORT || 3000);
});
console.log(app.get('port'));
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
- Résolu. Je crois que le problème ici est que AWS était en train de faire de noeud app.js AVANT de mnp commencer. nœud app.js ne donne pas une erreur, mais il n'a pas d'ouvrir tous les ports. Donc la solution est de renommer app.js à autre chose (j'ai utilisé main.js) et de référence que dans/bin / www. Il travaille maintenant correctement.
- Cette solution a été extrêmement utile (j'ai passé plusieurs heures sur ce sujet). Merci un tas. Veuillez préciser comment vous trouver "AWS était en train de faire de noeud app.js AVANT de mnp démarrer"
- Avec express via AWS tutoriel docs.aws.amazon.com/elasticbeanstalk/latest/dg/... je n'ai pas seulement eu pour renommer app.js à autre chose, mais j'ai également eu à point dans mon /bin/www fichier: var app = require('../app');' pour 'var app = require('../main');'
- Merci cela a contribué à une tonne! J'ai fait un autre énorme & erreur stupide que j'essayais de résoudre ce problème... j'ai été en utilisant git aws.pousser à pousser mes modifications, mais n'avait pas fait commis de mes changements de git/github. J'ai donc été faire un vieux code, sans aucune modification. :/ De toute façon finalement obtenu il fixé avec votre aide. --Pensez que vous pouvez faire que la réponse officielle au lieu de simplement un commentaire?
Vous devez vous connecter pour publier un commentaire.
Pour plus de clarté, je vais dire la réponse dans les commentaires.
AWS ELB s'exécute
node app.js
AVANTnpm start
.node app.js
ne donne pas une erreur, mais il n'a pas d'ouvrir tous les ports.La solution est tout simplement de renommer
app.js
de tout, sauf de laserver.js
(c'est à diremain.js
) et de référence que dans/bin /www en le montrant du doigt dans le /bin/www fichier:var app = require('../app');
àvar app = require('../main');
Alors il devrait fonctionner correctement!
Pour plus de clarté, voici ce que mon répertoire ressemble:
La
package.json
fichier sera appelé par ELB quand il lance le serveur d'application. Ici, il a l'instruction à exécuter le script de démarragenode bin/www
C'est le
bin/www
fichier est exécuté. Nous voyons le besoin de../main
et laapp.set('port'...)
Puis le
main.js
fichier qui exécute le service de routage et tous:Quand j'ai créé le projet, le
main.js
fichier a été nomméapp.js
. Le problème de cette causés était fondée sur la priorité ELB début des séquences. ELB permettra de lancer l'application et de vérifier tout d'abord siapp.js
existe, s'il n'existe pas, il s'exécutenode app.js
, sinon, il va vérifier sipackage.json
existe et essayez d'exécuternpm start
.Lorsque le
main.js
avait le nom deapp.js
ELB essayé de démarrer l'ensemble de l'application en cours d'exécution. Cependant, ce fichier n'a pas d'ouvrir tous les ports.recibel
dans mon cas, zip OU le contenu à l'intérieur derecibel
.server.js
avec mon projet. Donc, au lieu de s'appuyer sur l'exemple, pour exécuternpm
dans cet ordre, nous avons pu contourner que par la fourniture personnalisée commande de démarrage de l'environnement, c'est à direnpm start
.Une alternative au changement de nom des
app.js
est de créer un elastic beanstalk fichier de configuration. Ajouter un.config
fichier dans le.ebextensions
dossier, par exemple,.ebextensions/34.config
. Modifier laNodeCommand
paramètre dans l'espace de nomsaws:elasticbeanstalk:container:nodejs
à la commande que vous souhaitez exécuter pour démarrer le serveur. Par exemple, c'est un minimum.config
fichier pour l'exécuternpm start
au lieu deapp.js
:Voir http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_custom_container.html et http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-options-nodejs pour plus d'informations.
Edit:
Une façon encore plus facile - à l'aide de la console AWS, la Configuration/le Logiciel est le "Nœud de commande" option suffit de le régler qu'à
npm start
.Courir le port 8081
En fait, il ya une autre option.
À la console d'aws Elastic Beanstalk, à l'intérieur de votre application-section de l'environnement, il y a un Configuration élément de menu sur votre gauche (à droite soufflet menu du tableau de bord en option). Si vous cliquez là, vous trouverez de nombreuses options de configuration. Cliquez à Logiciel de Configuration puis de définir quelle est votre nœud de commande. Il y expliquer l'ordre des commandes, il essaie, en effet: "Commande pour démarrer l'Node.js application. Si une chaîne vide est spécifié, app.js est utilisé, alors server.js puis "npm démarrer" dans l'ordre"
Mon erreur était à ma commande de démarrage du script. Il commençait nodemon:
Puis j'ai changé de nœud et il a travaillé:
Espère que j'ai aidé quelqu'un.
Si vous utilisez le port 8081 pour l'exécution de vos express application et l'utilisation sudo pour le nœud en cours d'exécution du serveur, Votre demande sera accessible directement à partir elasticbean url sans les numéros de port sinon il affichera 502 Passerelle erreur de nginx.
L'utilisation de proxy Nginx 8081 port par défaut pour le nœud application sur elastibeanstalk.
Créer de fichier .ebextensions/nodecommand.config et mettre l'option paramètres ci-dessous -
Vous pouvez créer un autre fichier contenant des commandes .ebextensions/01_init.config et mettre souhaité les commandes qui seront exécutées avant le déploiement. Par exemple -
Au cas où quelqu'un a fait la betise que j'ai fait, assurez-vous que votre dossier "emplacement" est engagée si vous utilisez express. J'ai eu le mien dans mon".gitignore fichier et c'est pourquoi j'ai été faire une erreur 502.
Juste enlever '/bin' de '.gitignore', de valider, et de le déployer les modifications à EB.
Note: j'ai rencontré ce problème et aucune des solutions ont été de travailler pour moi.
Ma solution était de s'assurer de la devDependencies dans le paquet.json ont été fait dans les dépendances.
Par exemple:
Pas:
nouveau sur AWS et a été un moment depuis que j'ai webdeved, mais a été bloqué ce soir sur la même question, et merci à tout le monde dans le thread, je suis très heureux de dire que la base de socket.io tutoriel fonctionne maintenant comme un charme, j'étais juste un oubli de la ligne dans le paquet.json :
oh, et le port !
la seule chose que j'ai gardé de elasticbean échantillon node.js app est cette valeur à la place de pure 3000 valeur :