Я пытаюсь включить веб-сокеты в AWS веб-приложении ElasticBeanstalk Tomcat 8.5. У меня есть пользовательский apache config (сокращенно):
RewriteEngine On
RewriteOptions Inherit
ProxyRequests Off
ProxyPreserveHost on
# send websocket requests to tomcat with the websocket protocol
RewriteCond ${HTTP:Connection} "Upgrade" [NC]
RewriteCond ${HTTP:Upgrade} "websocket" [NC]
RewriteRule /(.*) "ws://localhost:8080/$1" [P,L]
# send all other requests to tomcat
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
В веб-приложении, когда я пытаюсь подключить веб-сокет клиента к конечной точке сервера, я получаю эту ошибку:
websocket. js: 372 Сбой подключения WebSocket к 'wss: //example.com/ws/sales': Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 404
Я подтвердил в Инструменты разработчика Chrome, в которых заголовки Connection и Upgrade, отправленные в запросе к вышеуказанной конечной точке, верны. (Очевидно, я действительно подключаюсь к своему веб-сайту, а не к example.com)
Когда я изменяю конфигурацию apache, чтобы использовать ProxyPass вместо RewriteRule, он отлично работает! Я не Я не хочу делать это таким образом, потому что я не хочу, чтобы прокси для ws просто на основе URI. Я хочу проверить заголовки, как вы должны!
ProxyRequests Off
ProxyPreserveHost on
# send websocket requests to tomcat with the websocket protocol
ProxyPass /ws/ ws://localhost:8080/ws/ retry=0
ProxyPassReverse /ws/ ws://localhost:8080/ws/
# send all other requests to tomcat
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/