Тайм-аут соединения с серверными событиями на Node.js через Nginx

У меня есть установка Node.js через Nginx, и она включает события, отправленные сервером.

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

Я бы хотел, чтобы на sse-соединение не было тайм-аута. Это возможно? Я пробовал настраивать send_timeout, keepalive_timeout, client_body_timeout и client_header_timeout, но это ничего не меняет. Ниже моя конфигурация Nginx.

upstream foobar.org {
   server 127.0.0.1:3201;
}

server {
  listen 0.0.0.0:80;
  server_name   example.org;

  client_max_body_size 0;
  send_timeout 600s;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://example.org/;
    proxy_redirect off;

    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
  }
}

person Mariusz Nowak    schedule 07.02.2014    source источник


Ответы (1)


Отвечая самому себе. На самом деле решение было не так уж сложно найти, просто требовалось внимательно изучить документацию nginx.

proxy_read_timeout - это директива, отвечающая за это, и по умолчанию она установлена ​​на 60 секунд. Так что это можно легко исправить, установив, например:

proxy_read_timeout 24h;

Установка 0 не сработает, это фактически приведет к разрыву всех ваших соединений, поэтому нам нужно придумать достаточно длительный таймаут.

После исправления я подошел к другой проблеме, но на этот раз связанной с тем, как браузеры обрабатывают соединение. Почему-то после 5 минут бездействия браузеры молча сбрасывают соединение. Что еще хуже, ни одна из сторон не проинформирована о том, что она отвергнута, поскольку обе стороны по-прежнему выглядят так, как будто соединение подключено к сети, но данные не проходят. Исправление для этого - посылать некоторый пинг для поддержания активности на интервальной основе (простой комментарий sse отлично работает).

person Mariusz Nowak    schedule 17.12.2014
comment
На случай, если кому-то интересно, директива proxy_connect_timeout - это директива, которая контролирует тайм-аут для установления соединения с прокси-сервером, поэтому использование только proxy_read_timeout не должно подавлять какие-либо подлинные 504-е (т.е. когда сервер приложений потерпел крах). - person ATG; 18.10.2018