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);
});
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
.
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.
Définir le port en cours d'exécution sur 8081
app.set('port', 8081);
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.
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
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;
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"
}
}