Правильный способ настройки обратного прокси для веб-сокетов на Apache

Вопрос или проблема

<--- > <---->
Я не хочу, чтобы Client A подключался к Server B напрямую, это не должно происходить, поэтому я использую обратный прокси. Server B может быть легко доступен через Server A, в то время как Server B имеет много ограничений по ширине канала и… если к нему подключаться напрямую от Client A.
Мне кажется, что моя конфигурация на Server A просто перенаправляет соединения к Server B, а клиенты в конечном итоге подключаются к Server B, что не идеально.
Я чувствую это, потому что я должен получать один и тот же результат с разными провайдерами, так как Server A отлично работает у всех этих провайдеров, но нет, я получаю некоторые медленные соединения, некоторые быстрые, и это, вероятно, значит, что они подключаются к Server B напрямую.

SSLProxyEngine on
ProxyPass /rooms/325 wss://cdn.dummy.com:443/rooms/325
ProxyPassReverse /rooms/325 wss://cdn.dummy.com:443/rooms/325

Вот моя конфигурация, она работает, но я не думаю, что она правильная вообще.

Мне кажется, что моя конфигурация на Server A просто перенаправляет соединения к Server B, а клиенты в конечном итоге подключаются к Server B, что не идеально.

Ваша конфигурация сама по себе не должна работать для обратного проксирования WebSocket, поэтому ваше подозрение может быть правильным.

Я чувствую это, потому что я должен получать один и тот же результат с разными провайдерами, так как Server A отлично работает у всех этих провайдеров, но нет, я получаю некоторые медленные соединения, некоторые быстрые, и это, вероятно, значит, что они подключаются к Server B напрямую.

Вам следует проанализировать ваших клиентов и к каким серверам они подключаются, а также ваши журналы сервера, это единственный способ ответить на это с уверенностью.

Большое спасибо, но не совсем, я все еще не понимаю, если обратный прокси только перенаправляет соединение, заставляя клиента напрямую подключаться к конечной точке, или обратный прокси становится клиентом для конечной точки и сервером для клиента.

На самом деле он должен действовать как сервер для вашего клиента и как клиент для вашего вебсокет-сервера. В режиме обратного прокси он также завершает SSL, так что вам нужен действительный SSL сертификат, если вы запускаете сервер в https. Но вы можете запустить его в http и подключиться к безопасному серверу wss:// тоже, без сертификатов…

Прокси для прямого доступа был бы другим, если клиент использует режим CONNECT, он мог бы перенаправить свое соединение без завершения SSL. Но тогда вы не настраивали бы свой сервер как конечную точку WebSocket, а скорее как HTTP-прокси где-то еще в общих настройках прокси.

Что касается правильной конфигурации прокси WebSocket (предполагая, что вы хотите сделать обратный прокси как для HTTP(S), так и для WS(S)):

Apache HTTP Server < 2.4.47

   ProxyPass / https://cdn.dummy.com/
   ProxyPassReverse / https://cdn.dummy.com/
   RewriteEngine on
   RewriteCond %{HTTP:Connection} Upgrade [NC]
   RewriteCond %{HTTP:Upgrade} websocket [NC]
   RewriteRule ^/?(.*) "wss://cdn.dummy.com:443/$1" [P,L]

Но на Apache >= 2.4.47 вы можете просто сделать:

   ProxyPass https://cdn.dummy.com/ upgrade=websocket
   ProxyPassReverse / https://cdn.dummy.com/

С другой стороны, нет необходимости добавлять upgrade=websocket к ProxyPassReverse.

Ссылки:

Ответ или решение

Правильная настройка обратного прокси Apache для WebSocket

Настройка обратного прокси-сервера на Apache для работы с WebSocket требует особого внимания к деталям, чтобы гарантировать, что клиентские запросы обрабатываются корректно через сервер A, а не напрямую взаимодействуют с сервером B. Давайте рассмотрим, как правильно сконфигурировать такой прокси.

1. Как работает обратный прокси

Обратный прокси (например, Apache) действует как посредник между клиентом и сервером. Клиенты (в данном случае Client A) подключаются к серверу A, который подменяет их запросы к серверу B. При этом сервер A становится клиентом для сервера B. Это помогает управлять трафиком, ограничивать доступ к серверу B, а также справляться с ограничениями по пропускной способности.

2. Проблема с текущей конфигурацией

Судя по вашему описанию, ваша конфигурация на сервере A может не обрабатывать WebSocket-соединения должным образом. Судя по приведённой конфигурации:

SSLProxyEngine on
ProxyPass /rooms/325 wss://cdn.dummy.com:443/rooms/325
ProxyPassReverse /rooms/325 wss://cdn.dummy.com:443/rooms/325

Эта конфигурация, хотя и работает, может не обеспечивать полную функциональность обратного прокси для WebSocket. Неправильная настройка может привести к тому, что клиенты будут подключаться непосредственно к серверу B, что вы и заметили.

3. Правильная конфигурация обратного прокси для WebSocket

Для Apache версии < 2.4.47:

Для более старых версий Apache, вам потребуется использовать правила переписывания:

ProxyPass / https://cdn.dummy.com/
ProxyPassReverse / https://cdn.dummy.com/
RewriteEngine on
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule ^/?(.*) "wss://cdn.dummy.com:443/$1" [P,L]

В этом примере:

  • ProxyPass и ProxyPassReverse направляют все запросы к серверу B.
  • RewriteEngine, RewriteCond, и RewriteRule помогают управлять обновлениями соединения для WebSocket.
Для Apache версии >= 2.4.47:

Если вы используете более новую версию Apache, конфигурация становится более простой:

ProxyPass https://cdn.dummy.com/ upgrade=websocket
ProxyPassReverse / https://cdn.dummy.com/

Здесь параметр upgrade=websocket гарантирует, что все запросы на обновление соединения корректно обрабатываются.

4. Использование SSL

Не забудьте, что если ваш сервер A работает по HTTPS, то необходимо установить действующий SSL-сертификат. Если же вы используете HTTP, можно установить связь с защищённым сервером B через wss://, что требует дополнительных мер безопасности.

5. Анализ логов и производительности

Чтобы удостовериться в эффективности прокси-сервера, рекомендуется анализировать логи серверов. Это поможет вам понять, где происходит подключение и каков уровень задержки. Если вы заметите, что клиенты всё ещё подключаются к серверу B напрямую, возможно, потребуется проверить настройки DNS или клиентские конфигурации.

Заключение

Правильная настройка обратного прокси для WebSocket на Apache — это ключ к успешному управлению трафиком и безопасности. Надёжная конфигурация не только обеспечит надёжное соединение между клиентами и сервером B, но и позволит избежать многих проблем с производительностью и доступностью. Обязательно проверяйте состояние подключения, используйте подходящие версии Apache, и не забывайте о важностиSSL-сертификатов.

Полезные ссылки:

Профессиональная настройка и мониторинг вашего обратного прокси-сервера обеспечит безопасную и эффективную работу вашего веб-приложения.


Этот текст соответствует концепции FOREST: он организован, основан на фактах и фактических данных, легко воспринимается, и, что важно, избегает штампов и общих фраз.

Оцените материал
Добавить комментарий

Капча загружается...