web-dev-qa-db-fra.com

502 passerelle incorrecte Déploiement du modèle Express Generator sur Elastic Beanstalk

J'ai utilisé le générateur express pour créer une application express simple qui, une fois démarré sur dev, fonctionne correctement sur localhost: 3000.

Quand j'applique cela à un haricot élastique à l'aide de la commande eb - git aws.Push, cependant, j'obtiens une erreur 502 sur le serveur de production.

En regardant dans les journaux, l'erreur que je reçois 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"

J'utilise la configuration nginx par défaut. Lorsque je lance un exemple d'application node.js sans Express, cela fonctionne correctement. Voici le code express dans 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 fichier package.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);
});
56
user3486588

Une alternative à renommer app.js consiste à créer un fichier de configuration élastique. Ajoutez un fichier .config dans le dossier .ebextensions, par exemple, .ebextensions/34.config. Modifiez le paramètre NodeCommand dans l'espace de nom aws:elasticbeanstalk:container:nodejs en choisissant la commande à exécuter pour démarrer le serveur. Par exemple, il s'agit d'un fichier .config minimal pour exécuter npm start au lieu de app.js:

option_settings:
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"

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: Un moyen encore plus simple - en utilisant la console AWS, Configuration/Software a l’option "Node command" - il suffit de le définir sur npm start.

27
Logan Pickup

En fait, il y a une autre option.

Dans la console Elastic Beanstalk, dans la section Environnement de votre application, un élément de menu Configuration se trouve sur votre gauche (option de menu Tableau de bord ci-dessous, à droite). Si vous cliquez dessus, vous trouverez de nombreuses options de configuration. Cliquez sur Configuration logicielle, puis définissez quelle est votre commande node. Il explique ici l’ordre des commandes qu’il essaie effectivement: "Commande permettant de démarrer l’application Node.js. Si une chaîne vide est spécifiée, app.js est utilisé, puis server.js, puis" npm start "dans cet ordre"

Mon erreur était à mon script de commande de démarrage. Il commençait nodemon:

"scripts": {
    "start": "NODE_ENV=production && nodemon ./bin/www"

Puis j'ai changé en noeud et cela a fonctionné:

"scripts": {
    "start": "NODE_ENV=production && node ./bin/www"

J'espère que j'ai aidé quelqu'un.

3

Définir le port en cours d'exécution sur 8081

app.set('port', 8081);
3
Can

Si quelqu'un a fait la bêtise que j'ai faite, assurez-vous que votre dossier 'bin' est validé si vous utilisez Express. J'avais le mien dans mon fichier '.gitignore' et c'est pourquoi je recevais une erreur 502.

Il suffit de supprimer "/ bin" de ".gitignore", de valider et de déployer les modifications apportées à EB.

2
Gaz_Edge

Si vous utilisez le port 8081 pour exécuter votre application express et que Sudo pour exécuter le serveur de nœud, votre application sera directement accessible à partir de l'url de l'élastique, sans numéro de port, sinon il affichera l'erreur 502 Gateway de nginx.

Nginx servant de proxy au port 8081 par défaut pour l'application de nœud sur elastibeanstalk.

Créer un fichier - . ebextensions / nodecommand.config et mettre les paramètres d’option ci-dessous -

option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: Sudo pm2 start server.js (server command with Sudo ie. Sudo node /bin/www)

Vous pouvez créer un autre fichier pour les commandes de conteneur - . ebextensions / 01_init.config et définir les commandes souhaitées à exécuter avant le déploiement. Par exemple -

container_commands:
  01_node_v6_install:
    command: Sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
  02_install_node:
    command: Sudo yum -y install nodejs
  03_npm_install_gulp_webpack:
    command: Sudo npm install -g gulp webpack pm2
  04_npm_install:
    command: Sudo npm install
  05_webpack_run:
      command: Sudo webpack
2
maniyadv

nouveau sur AWS et un certain temps depuis que j'ai webdeved, mais je suis resté bloqué ce soir sur le même problème et, grâce à tout le monde dans le fil, je suis très heureux de dire que le tutoriel de base sur socket.io fonctionne maintenant à merveille, j'en oublie un ligne dans package.json: 

"scripts":
{
"start": "node app.js"
}

oh, et le port! la seule chose que j’ai conservée dans l’application exemple.bb de node.js, c’est cette valeur au lieu de la valeur pure 3000: 

var port = process.env.PORT || 3000;
0
khalil

Remarque: j'ai rencontré ce problème et aucune des solutions ne fonctionnait pour moi.

Ma solution était de m'assurer que les devDependencies de package.json étaient réellement dans des dépendances.

Par exemple:

{
  "name": "whaler-test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
    "delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
    "load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
    "read-data": "cd dynamodb && node readDataTest.js && cd .."
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "nodemon": "1.17.5",
    "cors": "2.8.4",
    "aws-sdk": "^2.270.1"
  }
}

Ne pas: 

{
  "name": "whaler-test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
    "delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
    "load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
    "read-data": "cd dynamodb && node readDataTest.js && cd .."
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "nodemon": "1.17.5"
  },
  devDependencies {
    "cors": "2.8.4",
    "aws-sdk": "^2.270.1"
  }
}
0
Luis Pedraza