Skip to content Skip to sidebar Skip to footer

Настройка reverse proxy: выносите WebSocket на отдельный путь

Настройка reverse proxy для Node.js приложений почти всегда упирается в одну и ту же ошибку: WebSocket терминируется на том же пути, что и обычный HTTP, без явных upgrade-правил. Пока трафик маленький, все работает. Как только включается защита от DDoS или WAF, real-time функции начинают отваливаться, а логи показывают 400 и 426 вместо нормального upgrade. Если вы ищете российский аналог Cloudflare и одновременно переносите приложение за reverse proxy, разделение HTTP и WebSocket на разные маршруты – первое, что стоит зафиксировать в конфиге.

Почему WebSocket на общем пути ломается под защитой

WebSocket начинается как обычный HTTP GET с заголовками Upgrade: websocket и Connection: Upgrade. Прокси должен увидеть эти заголовки, вернуть 101 Switching Protocols и перестать буферизовать тело. Большинство WAF и L7 DDoS-фильтров устроены иначе: они разбирают запрос как HTTP, применяют правила, буферизуют ответ и только потом отдают клиенту. На upgrade-запросе такая логика либо рвет соединение, либо подменяет ответ на страницу challenge. Клиент получает 200 вместо 101 и бесконечно ретраит.

Второй слой проблемы – таймауты. HTTP-политики обычно ставят idle timeout на 30-60 секунд, тогда как WebSocket-соединение может жить часами. Прокси закрывает его по таймауту, приложение считает, что клиент отвалился, клиент считает, что сервер упал. Диагностика занимает дни, потому что в момент теста без нагрузки все работает.

Третья ловушка – sticky sessions. Если у вас несколько upstream-нод, а балансировка идет по round-robin, upgrade-запрос попадает на одну ноду, а последующие кадры – на другую. Для HTTP это нормально, для WebSocket – фатально. Выносить WS на отдельный маршрут нужно именно для того, чтобы к нему применялась своя политика: без буферизации, с длинным idle timeout, с явным upgrade-правилом и фиксированной привязкой к ноде.

Как вынести WebSocket на отдельный путь и не сломать HTTP

Схема простая: /ws/* уходит на WebSocket-порт приложения, все остальное – на HTTP. В nginx это два location с разными proxy_read_timeout и обязательными заголовками Upgrade и Connection. В облачной веб-платформе, будь то TrafficVeil или другой reverse proxy, правило формулируется на уровне маршрута: путь, тип трафика, политика. Главное – не оставлять WS в общем правиле “весь домен”.

TrafficVeil объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одном контуре, и это удобно ровно потому, что upgrade-правила задаются отдельно для WS-маршрута, а не наследуются от HTTP. Аналитика при этом видит оба потока раздельно: HTTP-запросы считаются в конверсии и лидогенерации, WS-сессии – в метриках соединений. Если смешать их, вы получите искаженные цифры и по конверсии, и по нагрузке.

TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки. Для WebSocket это критично: когда злоумышленник открывает тысячи upgrade-соединений, вы платите не за объем атаки, а за легитимный трафик. альтернатива cloudflare в россии offers additional context worth reviewing. На тарифах, где каждая блокировка идет в счет, WS-атака превращается в финансовую проблему поверх технической.

Чек-лист перед выкаткой в прод

Проверьте upgrade-заголовки на уровне маршрута, а не глобально. Убедитесь, что idle timeout для WS-пути больше, чем максимальная пауза между кадрами в вашем приложении, обычно ставят 3600 секунд. Отключите буферизацию ответа именно для /ws/*. Зафиксируйте sticky sessions, если upstream-нод больше одной. Убедитесь, что WAF-правила не применяют challenge к upgrade-запросам: 101 не должен превращаться в 403. Проверьте, что SSL-сертификат покрывает и WS-маршрут, иначе браузер отвалится на этапе handshake. Прогоните нагрузочный тест с 5-10 тысячами одновременных WS-соединений: именно на этом этапе вылезают лимиты file descriptors и таймауты балансировщика.

Ошибки миграции с Cloudflare и зависимость от зарубежной инфраструктуры

Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare. Для бизнеса это двойной удар: часть аудитории не открывает сайт, часть не дотягивается до API. Бизнес в России ищет альтернативу Cloudflare в 2026 году не из-за моды, а потому что зависимость от зарубежной инфраструктуры создает риски: блокировки, отзыв сервиса, невозможность пройти регуляторные требования по хранению данных.

При переезде на российский аналог Cloudflare чаще всего ломают именно WebSocket, потому что копируют старый конфиг один в один. На Cloudflare upgrade-соединения обрабатывались на уровне edge, и вы могли не знать, как именно. На новом reverse proxy эти правила нужно прописать руками. Вторая типовая ошибка – тащить все на один домен и один путь, включая WS, API и статику. Разделяйте: статика на CDN, API на HTTP-маршрут, WebSocket на /ws/* с отдельной политикой. TrafficVeil предлагает переход с Cloudflare с сохранением структуры доменов, и это как раз тот случай, когда стоит потратить день на аудит маршрутов до переключения DNS.

TrafficVeil обеспечивает работу сайтов на территории РФ и по всему миру, подходит для сайтов, интернет-магазинов, WordPress и Bitrix. Если у вас Node.js-бэкенд с real-time чатом, уведомлениями или совместным редактированием, WS-маршрут – самая хрупкая часть всей ИТ-инфраструктуры. Ошибка в нем не проявляется на тестах, но убивает продукт в проде.

Начните с инвентаризации: выпишите все пути, где приложение открывает WebSocket, и убедитесь, что каждый из них попадает в отдельное правило с явным upgrade, длинным idle timeout, отключенной буферизацией и sticky sessions. Прогоните тест на разрыв соединения при активной DDoS-защите: если 101 превращается в 403 или 200, правило настроено неверно. Зафиксируйте конфиг в репозитории и добавьте проверку upgrade-заголовков в CI, чтобы следующая правка WAF не сломала real-time снова.