【发布时间】:2014-05-12 18:52:09
【问题描述】:
我使用 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 在 npm start 之前正在做 node app.js。 node app.js 没有给出错误,但它没有打开任何端口。所以解决方案是将 app.js 重命名为其他任何内容(我使用 main.js)并在 bin/www 中引用它。它现在工作正常。
-
这个解决方案非常有用(我为此花了几个小时)。谢谢一堆。请详细说明您是如何发现“AWS 在 npm start 之前正在执行 node app.js”
-
通过 AWS 教程使用 express docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 我不仅需要将 app.js 重命名为其他名称,而且还必须在我的 /bin/www 文件中指向它:'var app = require ('../应用程序');'到 'var app = require('../main');'
-
感谢这帮助了很多!当我试图解决这个问题时,我犯了另一个巨大而愚蠢的错误......我正在使用 git aws.push 推送我的更改,但没有将我的更改提交到 git/github。所以我正在推送没有更改的旧代码。 :/ 不管怎样,在你的帮助下终于把它修好了。 --您认为您可以将其作为官方答案而不仅仅是评论吗?
标签: node.js amazon-web-services nginx express