LINUX.ORG.RU

Как правильно проксировать вебсокеты через nginx?

 , ,


1

2

https://gist.github.com/puzrin/7bac87a7064576e78b8a347101bfea35#file-dev-rcop...

Вроде все сделал по советам в интернетах. Но есть один досадный косячок. Если перезапустить нодовский бакенд, то FAYE перестает устанавливать соединение с сервером, даже если страничку перегрузить.

При этом перезапуск nginx вроде бы помогает, и кажется без nginx подобного не было.

Это можно как-то побороть?

★★★★★

Убедиться что такого действительно небыло без nginx.

Кстати, а зачем все эти proxy set header?

redixin ★★★★
()

зачем там break в конце location?

drsm ★★
()

мимокрокодил proxy_read_timeout на сколько стоит?

Dron ★★★★★
()

http://nginx.org/ru/docs/http/websocket.html тут же вроде сказано что клиент не в курсе как там у сервера дела и при любом переподключении нужно делать магию со сменой протокола на стороне сервера

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)

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

TBEPDb
()
Ответ на: комментарий от TBEPDb

Это не решение, это костыль - c таким же успехом можно советовать выкинуть nginx.

Хотелось бы разобраться с тем что есть. Конфигурация стандартная, но почему-то о проблемах в интернетах никто не пишет.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit
location /socket.io/ {
    proxy_buffering off;
    proxy_ignore_client_abort on;
    proxy_buffer_size   128k;
    proxy_buffers   8 256k;
    proxy_busy_buffers_size   256k;
    proxy_cache off;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header  Cookie;
    proxy_pass_header  Set-Cookie;
    proxy_pass_header  X-Requested-With;
    proxy_pass_header  x-requested-with;
    proxy_pass_header  Access-Control-Allow-Origin;
    proxy_pass_header  Access-Control-Allow-Methods;
    proxy_pass_header  Access-Control-Allow-Headers;
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    proxy_pass http://prod.others.upstream/socket.io/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }



У меня socket.io. Проверил, страница продолжает общаться с сервером при рестарте бекенда. Если с таким конфигом, проблема повторится то дело наверно в FAYE.

TBEPDb
()
Ответ на: комментарий от TBEPDb

Сенькс, позырю. Есть у меня тоже насчет faye подозрение.

А у тебя socket.io не течет и стабилен? Или онлайна мало совсем? Когда выбирал библиотеку транспорта, socket.io имел кучу совершенно адских не закрытых репортов.

Я уже с горя почти созрел взять sockjs и написать к нему свой мультиплексор каналов :(.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

socket.io гадит в логи nginx ошибками вида

2016/10/27 10:58:29 [error] 17638#17638: *1020778 upstream prematurely closed connection while reading response header from upstream, client: ...

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

TBEPDb
()

Браузер перестает пытаться создать ws соединение после N неудачных попыток. Т.е. скрипт просит создать соединение, а браузер возвращает ошибку даже не пытаясь подключться. Через какое то время он конечно попытки возобновляет (как раз пока ты нжинкс рестартишь)

redixin ★★★★
()
Ответ на: комментарий от TBEPDb

https://github.com/socketio/socket.io/issues/2732 вот из-за таких багов мне сцыкотно было связываться. Был еще на rust сервер с поддержкой истории сообщений. Буду думать, что делать.

Кстати, если у тебя юзеры имеют привычку открывать много табов, то есть вот такая штука https://github.com/nodeca/tabex. Правда если канал упадет некрасиво как у меня, то стопорнутся все вкладки.

Vit ★★★★★
() автор топика
Ответ на: комментарий от redixin

Там реконнекты с экспоненциальной задержкой. Я понимаю, если б оно на 5 минут заткнулось, но ведь с концами бахается, я очень долго ждал.

У меня создалось впечатление, что в nginx залипает протухшее соединение к бакенду. С другой стороны, у него дефолтный таймаут 60 секунд по неактивности. Не должно такого случаться.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.