node.js - node - 502 Bad Gateway Despliegue de la plantilla de Express Generator en Elastic Beanstalk
node js server on amazon ec2 (7)
Usé el generador express para crear una aplicación express simple, que cuando se inicia en dev funciona bien en localhost: 3000.
Cuando presiono esto en beanstalk elástico usando el comando eb-- git aws.push, sin embargo, recibo un error 502 en el servidor de producción.
Al examinar los registros, el error que obtengo es:
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"
Estoy usando la configuración predeterminada de nginx. Cuando ejecuto una aplicación de ejemplo node.js sin Express, funciona bien. Aquí está el código expreso en 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;
Y aquí está el archivo 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"
}
}
Y aquí está 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);
});
En caso de que alguien hiciera la tontería que hice, asegúrate de que tu carpeta ''bin'' esté activada si estás usando Express. Tenía el mío en mi archivo ''.gitignore'' y esta es la razón por la que recibí un error 502.
Simplemente elimine ''/ bin'' de ''.gitignore'', confirme y despliegue los cambios en EB.
En realidad, hay otra opción.
En la consola Elastic Beanstalk, dentro de la sección del entorno de la aplicación, hay un elemento del menú de configuración en el lado izquierdo (a la derecha en la opción de menú del panel). Si hace clic allí, encontrará muchas opciones de configuración. Haga clic en Configuración de software y luego defina cuál es su comando de nodo . Explica el orden de los comandos que realmente intenta: "Comando para iniciar la aplicación Node.js. Si se especifica una cadena vacía, se usa app.js, luego server.js, luego" npm start "en ese orden"
Mi error fue en mi script de comando de inicio. Estaba comenzando nodemon:
"scripts": {
"start": "NODE_ENV=production && nodemon ./bin/www"
Luego cambié al nodo y funcionó:
"scripts": {
"start": "NODE_ENV=production && node ./bin/www"
Espero haber ayudado a alguien
Establezca el puerto en funcionamiento en 8081
app.set(''port'', 8081);
Nota: me encontré con este problema y ninguna de las soluciones me funcionaba.
Mi solución fue asegurarme de que las devDependencies en package.json estuvieran realmente en dependencias.
Por ejemplo:
{
"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"
}
}
No:
{
"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"
}
}
Para mayor claridad, declararé la respuesta de los comentarios.
AWS ELB ejecuta el node app.js
ANTES de la npm start
. node app.js
no da un error, pero no abre ningún puerto.
La solución es simplemente renombrar app.js
a cualquier otra cosa que no sea server.js
(es decir, main.js
) y hacer referencia a eso en bin / www señalando en el archivo / bin / www: var app = require(''../app'');
var app = require(''../main'');
¡Entonces debería estar funcionando correctamente!
Para mayor claridad, aquí está mi directorio:
package.json
llamará al archivo package.json
cuando inicie el servidor de aplicaciones. Aquí tiene la instrucción de ejecutar el node bin/www
script de inicio node bin/www
Este es el archivo bin/www
que se ejecuta. Vemos el requerimiento de ../main
y la app.set(''port''...)
Luego, el archivo main.js
que ejecuta el enrutamiento y todo:
Cuando creé el proyecto, el archivo main.js
se llamó app.js
El problema que esto causó se basó en las secuencias de inicio de ELB de prioridad. ELB lanzará la aplicación y verificará primero si existe app.js
; si existe, ejecuta el node app.js
; de lo contrario, verificará si package.json
existe e intentará ejecutar npm start
. Cuando main.js
tenía el nombre app.js
ELB intentó iniciar toda la aplicación ejecutándola. Sin embargo, este archivo no abre ningún puerto.
Si usa el puerto 8081 para ejecutar su aplicación exprés y utiliza sudo para ejecutar el servidor de nodos, se accederá a su aplicación directamente desde la URL del elástico sin números de puerto, de lo contrario mostrará 502 Error de puerta de enlace desde nginx.
Nginx proxying 8081 port por defecto para la aplicación de nodo en elastibeanstalk.
Crea un archivo - . ebextensions / nodecommand.config y poner opciones de configuración a continuación -
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeCommand: sudo pm2 start server.js (server command with sudo ie. sudo node /bin/www)
Puede crear otro archivo para comandos de contenedor -. ebextensions /01_init.config y poner los comandos deseados que se ejecutarán antes de la implementación. Por ejemplo -
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
Una alternativa para cambiar el nombre de app.js
es crear un archivo de configuración elástico beanstalk. Agregue un archivo .config
en la carpeta .ebextensions
, por ejemplo, .ebextensions/34.config
. Cambie la configuración de NodeCommand
en el espacio de nombres aws:elasticbeanstalk:container:nodejs
a cualquier comando que desee ejecutar para iniciar el servidor. Por ejemplo, este es un archivo .config
mínimo para ejecutar npm start
lugar de app.js
:
option_settings:
- namespace: aws:elasticbeanstalk:container:nodejs
option_name: NodeCommand
value: "npm start"
Consulte http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_custom_container.html y http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-options-nodejs para más información.
Editar: una forma aún más fácil: utilizando la consola de AWS, Configuración / Software tiene la opción "Comando de nodo", simplemente npm start
para npm start
.