Двойной прокси веб-сокета Apache (mod_proxy_wstunnel) с переменной среды - PullRequest
0 голосов
/ 16 марта 2019

Это проблема с двойным прокси WebSocket.Пользователь проходит через два сервера Apache до достижения пункта назначения.

Чтобы подвести итог цели (где «X» - целое число, например [0-9] +):

  1. Server1 обрабатываетSSL, и пользователь получает доступ к wss://Server1/X/websocket, который перенаправляется на ws://Server2/X/websocket
  2. Сервер2 обрабатывает перенаправление /X/websocket на другие пункты назначения, например, /5/websocket идет в один пункт назначения, а /40/websocket идет в другой пункт назначения.

Проблема

  1. Переход на ws://Server2:80/5/websocket работает напрямую, но
  2. Использование первого сервера для доступа к wss://Server1/5/websocket не работает.При доступе к Server1 таким способом Server2 выдает ошибку (error.log):
AH01144: No protocol handler was valid for the URL /5/websocket (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Эта ошибка сбивает с толку, поскольку доступ к Server2 напрямую работает, и все необходимые модули загружаются на сервер 2:

# apache2ctl -M | grep proxy
proxy_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
proxy_wstunnel_module (shared)

Сервер1 имеет другие прокси-серверы WebSocket, которые также работают, поэтому кажется, что проблема связана с взаимодействием между способом использования переменной среды или тем, как путь / заголовок маршрута передается, когдаиспользуя переменные среды.См. Ниже переменную «ROUTE» ...

Первая конфигурация Apache2:

<Location /([^;]*)/websocket>
    ProxyPreserveHost On
    SetEnv ROUTE $1
    Order allow,deny
    Allow from all
    ProxyPassMatch ws://somemachine:80/%{ROUTE}/websocket
    ProxyPassReverse ws://somemachine:80/%{ROUTE}/websocket
</Location>

Второй сервер (запущенный на somemachine: 80) имеет следующий код:

<Location /5/websocket>
    ProxyPreserveHost On
    Order allow,deny
    Allow from all
    ProxyPass ws://destinationFor5:80/websocket
    ProxyPassReverse ws://destinationFor5:80/websocket
</Location>
.... more locations follow with a similar pattern

Интересно, что тот же тип конфигурации, но для HTTP, а не для ws, кажется, работает нормально.

...