LINUX.ORG.RU

Nginx и websocket

 , ,


1

3

Добрый день! Используем в компании вебсокеты для работы нашего приложения. Одной из моих задач было «переехать» на православный nginx вместо действующего Apache2. Первой проблемой, с которой удалось столкнуться, была невозможность публикации вебсокетов в корневом location (статика - ок, вебсокет не видит), перенёс на другой location, внёс корректировки на фронте, ок, проблема ушла. Но всплыла другая, с которой сейчас решить проблему не очень получается: при нагрузочном тестировании работы сокетов (через https://github.com/observing/thor) удаётся добиться перегрузки приложения и отвала сокета по тайм-ауту. Через примерно 20-30 секунд как приложение «очнётся», апач заново подключается к сокету и продолжает работать, а вот nginx без перезагрузки уже не поднимается. Прошу указать направление, куда копать в плане восстановления соединения без рестарта всего веб-сервера, чтобы не городить костыли.


  1. Какова реальная причина замены веб-сервера? Пока единственным костылем здесь мне видится замена работающего Апача на неработающий Nginx

  2. Апач в рабочей конфигурации используется чисто как реверс-прокси? Какой MPM используется (prefork, event, …)?

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

prefork. Причина - сертифицироваться под фстэк и использовать nginx plus. Нужен его продвинутый балансировщик. Моя задача состоит в получении стабильного реконнекта к сокету сейчас.

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

Возможно, в рабочем процессе nginx переполняется лимит открытых файловых дескрипторов. У prefork’а такой проблемы быть не может, так как на каждого клиента запускается отдельный процесс.

Можно попробовать задать worker_connections (на небольшое число - если в продакшене использовался prefork, значит при типовой нагрузке параллельных клиентов немного, по крайней мере не десятки тысяч), и/или поиграть с другими настройками воркеров.

annulen ★★★★★
()
Ответ на: комментарий от shell-script

Через php-шный yii поднимаются локальные tcp-сокеты, nginx проксирует их наружу через фронт.

server {
server_name                 myapp.testdomain;
index                       index.html index.php;
access_log                  /opt/myapp/log/nginx-access.log;
error_log                   /opt/myapp/log/nginx-error.log;
listen                      443 ssl;

### SSL ###
include                     /etc/nginx/ssl.d/myapp.conf;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;

### Кеширование ###
proxy_cache                 all;
proxy_cache_valid           any 6h;

location / {
root                        /opt/myapp/frontend/;
index                       index.html;
try_files                   $uri $uri/ /index.html?$query_string;
}

location /websocket {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://balancer;
}
s13
() автор топика
Последнее исправление: s13 (всего исправлений: 2)
Ответ на: комментарий от shell-script

balancer.conf

    map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
    }

    upstream balancer {
    least_conn;
    server 127.0.0.1:7001;
    server 127.0.0.1:7002;
    server 127.0.0.1:7003;
    server 127.0.0.1:7004;
    }
s13
() автор топика
Последнее исправление: s13 (всего исправлений: 4)
Ответ на: комментарий от s13

статику отдаёт

Тогда это больше похоже на баг, чем на нехватку дескрипторов, так как открыть соединение с клиентом ему ничего не мешает, а с бэкэендом не коннектится. В логах нет ничего интересного?

А так, я бы смотрел в сторону апача, если у ФСТЭК нет на него аллергии (хотя с чего бы?). Prefork, конечно, плохой вариант для этой задачи, я бы посмотрел, что будет с Event (мб ситуация повторится:) В плане балансировщиков на nginx свет клином не сошелся, есть и для апача балансировщик, и сторонние решения типа haproxy

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

Если это действительно так. Nginx на самом деле весьма стабильная и предсказуемая штука. Вообще никаких проблем в его эксплуатации кроме проксирования сокетов не встретил.

s13
() автор топика