Это проблема с двойным прокси WebSocket.Пользователь проходит через два сервера Apache до достижения пункта назначения.
Чтобы подвести итог цели (где «X» - целое число, например [0-9] +):
- Server1 обрабатываетSSL, и пользователь получает доступ к
wss://Server1/X/websocket
, который перенаправляется на ws://Server2/X/websocket
- Сервер2 обрабатывает перенаправление
/X/websocket
на другие пункты назначения, например, /5/websocket
идет в один пункт назначения, а /40/websocket
идет в другой пункт назначения.
Проблема
- Переход на
ws://Server2:80/5/websocket
работает напрямую, но - Использование первого сервера для доступа к
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, кажется, работает нормально.