Обратный прокси с websocket mod_proxy_wstunnel

У меня проблема с веб-сокетами и моим обратным прокси-сервером Apache, я обновил последнюю версию 2.4.5 и загрузил модуль mod_proxy_wstunnel.

httpd.conf:

<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.toto.fr
ServerAlias toto.fr


ProxyPass /my_app  http://1X.X.X.1:8080/my_app
ProxyPassReverse /web_pmr  http://1X.X.X.1:8080/my_app
ProxyPassReverseCookiePath /my_app /
ProxyPassReverseCookieDomain localhost my_app
ProxyRequests off
ProxyTimeout 15

#WEBSOCKETS


ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0
ProxyPassReverse /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/web_pmr/BasicWebsocketServlet retry=0


ErrorLog "logs/my_app_error.log"
LogLevel debug
CustomLog "logs/my_app_access.log" combined
<Proxy *>
      Order deny,allow
      Allow from all
</Proxy>
</VirtualHost>

Когда я тестирую свой локальный URL-адрес, websockets работают, но с обратным прокси-сервером Apache, в журналах Tomcat нет следа.

Ответ 1

Эта строка:

ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0

должно пройти до этого:

ProxyPass /my_app  http://1X.X.X.1:8080/my_app

Объяснение (из https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass):

Заказ директив ProxyPass

Конфигурируемые правила ProxyPass и ProxyPassMatch проверяются в порядке конфигурации. Первое правило, которое соответствует победе. Поэтому обычно вы должны сортировать противоречивые правила ProxyPass, начиная с самых длинных URL-адресов. В противном случае более поздние правила для более длинных URL-адресов будут скрыты любым более ранним правилом, использующим ведущую подстроку URL-адреса. Обратите внимание, что существует некоторая связь с совместным использованием работника. Напротив, только одна директива ProxyPass может быть размещена в блоке местоположения, и наиболее конкретное местоположение будет иметь приоритет.

По тем же причинам исключения должны выполняться перед общими директивами ProxyPass.