← Настройки сети / сеть
WebSockets
Cloudflare поддерживает проксирование соединений WebSocket без дополнительной настройки.
Контекст
WebSockets - это открытые соединения, которые поддерживаются между клиентом и сервером источника. Внутри соединения WebSockets клиент и источник могут обмениваться данными в обе стороны без необходимости повторно устанавливать сессии. Благодаря этому обмен данными в рамках соединения WebSockets происходит быстро. WebSockets часто используются в приложениях реального времени, например в чатах и играх.
Включить WebSockets
Чтобы включить WebSockets подключения к серверу источника в панели управления:
-
На панели управления Cloudflare перейдите к разделу Сеть страницу.
Перейдите в Сеть ↗ -
Для WebSockets, переключите тумблер в положение Включено.
Чтобы включить WebSockets подключения к серверу источника через API отправьте PATCH запрос с websockets в качестве имени настройки в пути URI, а также value параметр со значением "on".
Примечания о совместимости
| Продукт | Compatible | Примечания |
|---|---|---|
| Argo | Нет | Argo несовместим с WebSocket. |
| SSL | Да | |
| WAF | Да* | Начальный запрос HTTP 101 подпадает под управляемые правила WAF, пользовательские правила, правила ограничения скорости и другие функции WAF, как и любое другое соединение WebSockets. Однако после установления соединения WAF больше не выполняет никаких проверок. |
| Workers | Да | Также можно использовать Durable Objects в качестве конечной точки для сессий WebSocket, что дает полный контроль над сообщениями, отправляемыми клиентам и получаемыми от них. |
Доступность
WebSockets поддерживаются на всех тарифных планах Cloudflare.
Измерение запросов и трафика
Из-за особенностей соединений WebSocket вы можете заметить, что по числу запросов и объему трафика они отличаются от обычного HTTP-трафика. Если вы клиент тарифного плана Enterprise, важно учитывать, как Cloudflare измеряет запросы и трафик, чтобы точно оценить свое использование.
Cloudflare измеряет одно соединение WebSocket следующим образом:
-
Запросы: Cloudflare учитывает как HTTP запрос только первоначальный запрос на обновление протокола для каждого соединения WebSocket. Хотя через установленное соединение WebSocket можно передавать двунаправленный поток сообщений, он засчитывается как один длительный HTTP запрос.
-
Пропускная способность: Cloudflare измеряет объем данных, передаваемых от Cloudflare к клиенту. Как правило, это означает, что сообщения от сервера WebSocket за Cloudflare к клиенту WebSocket учитываются в объеме потребленного трафика.
После закрытия соединения WebSocket вы можете просмотреть совокупные данные об использовании WebSocket через Traffic Analytics, GraphQL Analytics API, а также Логи HTTP-запросов.
Техническое примечание
Когда Cloudflare развертывает новый код в своей глобальной сети, серверы могут перезапускаться, что приводит к разрыву соединений WebSockets.
Рекомендации
- Реализуйте keepalive ↗.
- Проверьте настройки тайм-аута на исходном сервере и/или на клиенте, а затем удалите их или увеличьте значение.
Устранение неполадок
Изучение проблем с WebSocket упрощают такие клиентские инструменты, как wscat ↗. Возможность воспроизвести проблему на одном URL с помощью минимального набора инструментов помогает точнее определить ее причину.
EdgeStartTimestamp и EdgeStopTimestamp поля в Логи HTTP-запросов отражают продолжительность соединения WebSocket (а не исходного HTTP соединения).
Лимиты подключений
Тайм-аут простоя
Cloudflare закрывает соединение WebSocket, если в течение некоторого времени данные не передаются ни в одном направлении. Клиенты тарифного плана Enterprise могут обратиться к своей команде по работе с аккаунтом, чтобы настроить особый тайм-аут простоя. Чтобы поддерживать долгоживущие соединения в периоды бездействия, реализуйте на стороне клиента механизм heartbeat (ping/pong).
Привязка сессий для источников WebSocket с балансировкой нагрузки
Если ваш источник WebSocket находится за Cloudflare Load Balancer, включите Привязка сессии чтобы все запросы от одного клиента направлялись на один и тот же сервер источника. Без привязки сессии повторное подключение WebSocket может попасть на другой источник, у которого нет состояния этой сессии.