Spec-Zone.ru › nginx

Проксирование WebSocket

Для переключения соединения между клиентом и сервером с HTTP/1.1 на WebSocket используется механизм переключения протокола, доступный в HTTP/1.1. протокол переключения.

Однако есть одна тонкость: так как заголовок «Upgrade» является переходным заголовком, он не передаётся от клиента к прокси-серверу. При прямом проксировании клиенты могут использовать метод CONNECT для решения этой проблемы. Однако это не работает с обратным проксированием, поскольку клиенты не знают о каких-либо прокси-серверах, и требуется специальная обработка на прокси-сервере.

С версии 1.3.13 nginx реализует специальный режим работы, который позволяет установить туннель между клиентом и прокси-сервером, если прокси-сервер вернул ответ с кодом 101 (Переключение протоколов), а клиент запросил переключение протокола через заголовок «Upgrade» в запросе.

Как указано выше, переходные заголовки, включая «Upgrade» и «Connection», не передаются от клиента к прокси-серверу, поэтому для того, чтобы прокси-сервер знал о намерении клиента переключиться на WebSocket, эти заголовки необходимо передать явно:

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Более сложный пример, в котором значение поля заголовка «Connection» в запросе к прокси-серверу зависит от наличия поля «Upgrade» в заголовке запроса клиента:

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

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

По умолчанию соединение будет закрыто, если прокси-сервер не передаёт никаких данных в течение 60 секунд. Это время ожидания можно увеличить с помощью директивы proxy_read_timeout. В качестве альтернативы, прокси-сервер можно настроить так, чтобы он периодически отправлял кадр ping WebSocket для сброса таймаута и проверки, всё ли ещё соединение активно.

© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/websocket.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API