Не удается подключиться к веб-сокету Tomcat за Apache

Когда я пытался подключиться к веб-сокету Spring Boot из Android-клиента Stomp, он не подключается, и журнал Catalina показывает

Handshake failed due to invalid Upgrade header: null

Сервер Tomcat работает за Apache, а сервер Apache работает по протоколу https. Я не добавил https в Tomcat. Все HTTP-запросы перенаправляются на https, так я пытался подключиться к веб-сокету.

mStompClient = Stomp.over(Stomp.ConnectionProvider.JWS, "wss://chat.example.com/ws/chat/websocket", headers);

но работает при работе на локальной машине

mStompClient = Stomp.over(Stomp.ConnectionProvider.JWS, "http://10.0.2.2:8080/chat/ws/chat/websocket", headers);

это моя конечная установка

registry.addEndpoint("/chat").setHandshakeHandler(new HandShakeHandler()).withSockJS();

Я включил mod proxy wstunnel и в конфигурации виртуального хоста я добавил

ProxyPass / http://localhost:8080/chat/
proxyPassReverse / http://localhost:8080/chat/
ProxyPass /wss/ ws://localhost:8080/chat/

Как я могу это исправить?

2 ответа

Я получил ответ от этого сервера по вине Лин. Я должен добавить

RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /api/(.*) ws://newapp.example.com:8080/api/$1 [P]

и изменил последнюю строку на

RewriteRule /chat/(.*) ws://localhost:8080/chat/chat/$1 [P]

и теперь это связано

Проблема может быть в порядке ваших команд прокси:

      ProxyPass / http://localhost:8080/chat/
proxyPassReverse / http://localhost:8080/chat/
ProxyPass /wss/ ws://localhost:8080/chat/

См. Документацию :

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

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

Поскольку первое правило соответствует /wss/URL-адреса, более позднее правило никогда не срабатывает. Правильный порядок:

      ProxyPass /wss/ ws://localhost:8080/chat/
ProxyPass / http://localhost:8080/chat/
proxyPassReverse / http://localhost:8080/chat/

(Я не уверен, нужно ли вам обратное правило или нет.)

Я потратил часы, пытаясь заставить правила перенаправления работать в моей системе, но, видимо, они вам совсем не нужны.

Другие вопросы по тегам