2016-07-14 5 views
6

Я получаю 504 GATEWAY_TIMEOUT http-ответ после 60-х страниц загрузки страницы.Получение 504 GATEWAY_TIMEOUT NodeJs

Это не фактическая страница, которая загружается, а не процесс, который выполняется. Я ожидаю, что это займет больше 60 секунд, и я попытался увеличить значение тайм-аута, но это не помогло.

Я использую экспресс-фреймворк для маршрутизации, и я принимаю работу на EB (AWS Elastic Beanstalk). Поскольку я увеличил все значения таймаута, которые я мог бы найти на EB и Load Balancers в консоли AWS, я предполагаю, что это должно быть самое приложение, у которого установлен тайм-аут до 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 Однако я не могу найти способ редактировать конфигурацию nginx на эластичном beanstalk. Я провел некоторое исследование, но все это кажется мне нестандартным и слишком жестким для такой простой вещи.

+0

Попробуйте использовать пакет подключения тайм-аута в ваших аргументов запроса функции, как это: 'уаг таймаут = требуют (" подключения -timeout '); app.post ('/ test', timeout ('6s'), function (req, res, next) {console.log ('test')}) ' –

+0

Спасибо, но я не вижу, где я могу сделайте это, поскольку у меня нет «app.post» где угодно. Экспресс-каркас сделал это по-другому. Существует только «приложение».use ('/', routes); ' –

+0

Это был всего лишь пример в вашем первом коде в ответ, поставив его перед функцией запроса следующим образом: '/* GET домашняя страница. */ var timeout = require ('connect-timeout'); router.get ('/ main', timeout ('6s'), функция (req, res, next) { mainProcess (res); //res.send ("mainProcess() называется"); }) ; ' –

ответ

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

Thumbs up для попытки помочь –

+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

Смежные вопросы