node.js - 502 Bad Gateway 在 Elastic Beanstalk 上部署 Express Generator 模板

标签 node.js amazon-web-services nginx express

我使用 express 生成器创建了一个简单的 express 应用程序,当在 dev 上启动时,它在 localhost:3000 上运行良好。

但是,当我使用 eb 命令(git aws.push)将其推送到弹性 beanstalk 时,我在生产服务器上收到 502 错误。

查看日志,我得到的错误是:

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"

我正在使用默认的 nginx 配置。当我在没有 Express 的情况下运行 node.js 示例应用程序时,它运行良好。这是 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;

这是 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"
  }
}

这里是 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);
});

最佳答案

为清楚起见,我将从评论中说明答案。

AWS ELB 在 npm start 之前运行 node app.jsnode app.js 没有报错,但是没有打开任何端口。

解决方案是简单地将 app.js 重命名为 server.js 以外的任何其他名称(即 main.js)并在bin/www 通过在/bin/www 文件中指向它: var app = require('../app');var app = require('../main' );

那么它应该可以正常工作了!


为了清楚起见,我的目录如下所示:

package.json 文件将在 ELB 启动应用程序服务器时被调用。这里有运行启动脚本 node bin/www 的指令 enter image description here

这是运行的 bin/www 文件。我们看到对 ../mainapp.set('port'...) 的要求 enter image description here

然后是运行路由的 main.js 文件和所有: enter image description here

当我创建项目时,main.js 文件被命名为 app.js。这导致的问题是基于优先级 ELB 启动序列。 ELB 将启动应用程序并首先检查 app.js 是否存在 -- 如果存在,则运行 node app.js,否则将检查 >package.json 存在并尝试运行 npm start。 当 main.js 的名称为 app.js 时,ELB 试图通过运行它来启动整个应用程序。但是这个文件没有打开任何端口。

关于node.js - 502 Bad Gateway 在 Elastic Beanstalk 上部署 Express Generator 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795357/

相关文章:

node.js - 如何在node.js上集成redis-sentinel-client和socket.io?

Node.js 服务器不可见

amazon-web-services - AWS IAM PowerUser 适用于特定区域

amazon-web-services - Redshift 查询花费太多时间

nginx - 如何使用 NGINX 作为反向代理来路由第一个 URI 段?

javascript - 使用 Sequelize.js 创建简单的 PUT 请求时出错

javascript - 为什么我在 node.js 类中得到未定义的实例?

node.js - Mongoose bulkWrite - 'q' 的错误类型

apache - Nginx 重定向与其他端口冲突

windows - nginx Windows : setting up sites-available configs