Проксирование 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