2016-07-14 15 views
6

我在獲取504 GATEWAY_TIMEOUT http響應後60秒的頁面加載。獲取504 GATEWAY_TIMEOUT NodeJs

它不是一個正在加載的實際頁面,而是一個正在執行的進程。我期待它花費超過60秒,我試圖增加超時值,但它沒有幫助。

我正在使用快速框架進行路由,並在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"); 
    }); 

UPDATE:

除此之外,我已經嘗試了不同的方法。我將此代碼添加到app.js

var connectTimeout = require('connect-timeout'); 
var longTimeout = connectTimeout({ time: 600000 }); 
app.use(longTimeout); 

也沒有幫助。

UPDATE2: 我自己也嘗試增加超時在/bin/www這樣的:

var server = http.createServer(app); 
server.timeout=600000; 

UPDATE3: 我已經注意到,超時有關nginx的配置。正如我的日誌所說:upstream timed out (110: Connection timed out) while reading response header 但是,我不能找出一種方法來編輯Elastic beanstalk上的nginx配置。我做了一些研究,但對我來說這似乎都不是標準,對於這樣簡單的事情來說太僵化了。

+0

嘗試使用連接超時包的功能要求的參數裏面是這樣的: 'VAR超時=需要('連接-時間到'); app.post('/ test',timeout('6s'),function(req,res,next){console.log('test')})' –

+0

謝謝,但我看不到我在哪裏那樣做,因爲我在任何地方都沒有'app.post'。表達框架做了不同的處理。只有'應用程序。使用('/',routes);' –

+0

這只是你的第一個代碼在答案中的一個例子,它在請求函數之前就像這樣: '/ * GET主頁。 */ var timeout = require('connect-timeout'); (res), //res.send(「mainProcess()called」); })。 ;' –

回答

2

通常,當一項工作超過30秒或40秒時,我通常會通知正在執行的用戶,然後創建一個與數據庫一起工作的進程,而不是對服務器的正常請求,以避免用戶等待對於該請求,並避免超時問題,您可以在設置服務器監聽到指定的端口試試這個,例如:

//Create server with specified port 
var server = app.listen(app.get('port'), function() { 
    debug('Express server listening on port ' + server.address().port); 
}); 
//set timeout time 
server.timeout = 1000; 
+2

想要幫忙的豎起大拇指 –

+0

@OndrejTokar我昨天做了一些測試,我也找不到解決方案,如果你覺得它請發表回答! –

+0

感謝您投入您的時間。請參閱我的最新更新。 –

2

在你.ebextensions添加以下代碼:

container_commands: 
    change_proxy_timeout: 
    command: | 
     sed -i '/\s*location \/ {/c \ 
       location/{ \ 
        proxy_connect_timeout  300;\ 
        proxy_send_timeout   300;\ 
        proxy_read_timeout   300;\ 
        send_timeout    300;\ 
       ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 
+0

這完全解決了我的問題。如果您正在複製和粘貼上述內容(如我),則需要刪除container_commands – brendonparker

0

從你的Update3信息中,我認爲你應該c onfig你的nginx的配置文件,如:

server { 
    listen 80; 
    server_name  *.*; 
    location/{ 
      proxy_pass http://192.168.0.100:8001; 
      proxy_connect_timeout 60s; 
      proxy_read_timeout 5400s; 
      proxy_send_timeout 5400s; 
      proxy_set_header host $host; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_redirect default; 
    } 
} 

proxy_read_timeout和proxy_send_timeout是關係到你的問題。

0

我有同樣的問題,所以我試圖設置超時= 120000如下:

var server= http.createServer(app).listen(port, function() 
{ 
    console.log("Express server listening on port " + port) 
}) 
server.timeout = 120000; 
+0

之前的多餘空格上述代碼解決了我的問題 – HamidKhan