Не удается подключиться к веб-сокету 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/
(Я не уверен, нужно ли вам обратное правило или нет.)
Я потратил часы, пытаясь заставить правила перенаправления работать в моей системе, но, видимо, они вам совсем не нужны.