【发布时间】:2016-11-17 09:05:11
【问题描述】:
页面加载 60 秒后,我收到 504 GATEWAY_TIMEOUT http 响应。
它不是正在加载的实际页面,而是正在执行的进程。我预计它需要超过 60 秒,并且我尝试增加超时值,但它没有帮助。
我正在使用 express 框架进行路由,并将作业托管在 EB (AWS Elastic Beanstalk) 上。由于我增加了我可能在 AWS 控制台中的 EB 和负载均衡器上找到的所有超时值,我假设它必须是应用程序本身的超时设置为 60 秒。但是,我可能错了。
我的代码:
/* GET home page. */
router.get('/main',function(req, res, next) {
req.connection.setTimeout(600000);
mainProcess(res);
//res.send("mainProcess() called");
});
更新:
除此之外,我还尝试了另一种方法。我将此代码添加到app.js:
var connectTimeout = require('connect-timeout');
var longTimeout = connectTimeout({ time: 600000 });
app.use(longTimeout);
也没有用。
更新 2:
我也尝试过像这样增加/bin/www 的超时时间:
var server = http.createServer(app);
server.timeout=600000;
更新3:
我注意到超时与nginx配置有关。正如我的日志所说:upstream timed out (110: Connection timed out) while reading response header
但是,我想不出在 Elastic beanstalk 上编辑 nginx 配置的方法。我做了一些研究,但对我来说这一切似乎都不标准,而且对于这么简单的事情来说太死板了。
【问题讨论】:
-
尝试在函数请求参数中使用 connect-timeout 包,如下所示:
var timeout = require('connect-timeout'); app.post('/test', timeout('6s'), function(req, res, next) {console.log('test')}) -
谢谢,但我看不到在哪里可以这样做,因为我在任何地方都没有
app.post。 express 框架的做法不同。只有app.use('/', routes); -
这只是您的第一个代码中的一个示例,将其放在请求函数之前,如下所示:
/* GET home page. */ var timeout = require('connect-timeout'); router.get('/main', timeout('6s'), function(req, res, next) { mainProcess(res); //res.send("mainProcess() called"); }); -
试过了,还是一样的问题。
-
你检查过请求是否命中 nodejs 吗?如果您可以访问您的 nginx 配置文件,例如:
location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 60s; //Here is where you put the timeout }
标签: node.js amazon-web-services express