@Jahsmine

Как убрать disconnect вебсокета на Nginx?

Добрый день!

Существует следующая проблема:

Есть backend написанный на Python Flask - через вебсокет присылаются данные. Если запустить сервер локально или удаленно через gunicorn или werkzeug, то все работает хорошо, соединение не прерывается.

Как только это все дело запускается через Nginx - вебсокеты отваливаются через 30-60 секунд.

Для поддержки соединения добавили отсылку "ping" через каждые 2 секунды, но это все равно не помогло, вебсокеты по прежнему отваливаются через 30-60 секунд.

Конфигурация nginx

server {
    listen 213.189.217.11:80;

    location / {
        include proxy_params;
        proxy_redirect off;
        proxy_pass              http://unix:/home/mv-proto-backend/mv-proto-backend.sock;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "upgrade";
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;
        proxy_headers_hash_max_size 512;
        proxy_headers_hash_bucket_size 128;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        keepalive_timeout 90;
        proxy_cache off;
        proxy_buffering off;
        tcp_nodelay on;
    }
}


Пример из postman

6166d18672fc8830400280.png
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
karabanov
@karabanov Куратор тега Ubuntu
Системный администратор
Проксирование WebSocket через Nginx не даёт преимуществ - протокол бинарный и проксируется, как есть.
Лучше повесить приложение на отдельный порт и позволить клиентам подключаться напрямую.

Между тем, чтобы правильно настроить проксировние, воспользуйся официальной документацией: Проксирование WebSocket

У тебя в конфигурации смешано все, ты настраиваешь буфра (зачем?) потом выключаешь буферизацию proxy_buffering off; Добавляешь лишние http заголовки. Используешь keepalive_timeout но он тут бесполезен... И так далее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы