Назад | Перейти на главную страницу

Прокси-сервер Nginx для веб-сокета: требуется ли закрывать соединение с серверной частью после обновления до веб-сокета?

Основываясь на том, что я мог прочитать на сайте nginx https://www.nginx.com/blog/websocket-nginx/

Приведенный ими пример закроет все соединения с серверной частью. Это не совсем то, что мы хотим при настройке прокси, заставляя повторно открывать соединение с серверной частью на каждом новом клиенте.

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
 
    upstream websocket {
        server 192.168.100.10:8010;
    }
 
    server {
        listen 8020;
        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Host $host;
        }
    }
}

Но нужно ли закрывать соединение после обновления до веб-сокета?

не можем ли мы изменить карту, чтобы она поддерживала «keepalive» соединение с серверной частью? (для всех запросов, отличных от веб-сокетов)

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

Будучи единственным пользователем в тестовой среде, похоже, не возникло никаких проблем, но будет ли то же самое в производственной среде?

это map не приводит к закрытию соединений с веб-сокетами.

На самом деле он проверяет, Upgrade: заголовок запроса содержит любое значение. Если да, то возвращается upgrade, который затем передается в восходящем направлении как заголовок Connection: upgrade.

Он только возвращается close когда Upgrade: заголовок запроса отсутствует. Этого не должно происходить при нормальной работе, но если это произойдет, вы все равно не сможете надежно (или вообще) установить соединение через веб-сокет с браузером.