Ich habe WebSockets aktiviert mit einem Undertow Server. Wenn ich den Undertow-Server direkt ausführe, funktionieren WebSockets gut. Ich serviere meine Seiten mit HTTPS und ich teste den Endpunkt mit "wss:
" in Javascript: es funktioniert.Wie verwende ich Apache als Reverse-Proxy für WebSockets mit Undertow als Server
Aber jetzt versuche ich, Apache als Reverse-Proxy zu verwenden und ich möchte, dass WebSocket-Verbindungen den Undertow-Server erreichen. Dies ist meine aktuelle Virtual Host:
<VirtualHost *:80 *:443>
ServerName test.example.org
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem
ProxyPass/http://test.example.org:44444/
ProxyPassReverse/http://test.example.org:44444/
</VirtualHost>
Hier Undertow als HTTP-Server (nicht HTTPS) auf Port 44444 und die SSL-Sicherheit von Apache getan wird gestartet.
Alle HTML-Seiten funktionieren gut, aber wenn ich versuche, eine WebSocket-Verbindung zu starten, erhalte ich diesen Fehler (Chrom):
WebSocket connection to 'wss://test.example.org/websockets/echo' failed: Error during WebSocket handshake: 'Upgrade' header is missing
Und wenn ich auf der Registerkarte Netzwerk sehen, sehe ich in der Tat, dass Zwei Header fehlen in der Antwort vom Server, wenn der "wss: //" -Aufruf erfolgt: "Connection: Upgrade
" und "Upgrade: WebSocket
". Diese Header sind vorhanden, wenn ich direkt ohne Apache mit Undertow verbinden.
Die „Sec-WebSocket-Accept
“ und „Sec-WebSocket-Location
“ Header gibt es aber, und ich denke, dies ist eine zweite Frage ist, „Sec-WebSocket-Location
“ ist ‚ws: //test.example.org/websockets/echo‘ nicht 'WSS : //test.example.org/websockets/echo 'seit Undertow läuft auf HTTP, nicht HTTPS.
Letzte Sache, die mod_proxy_wstunnel Dokumentation sagt "Die Verbindung wird automatisch zu einem Websocket-Verbindung aktualisiert". Was bedeutet das? Apache aktualisiert die HTTP-Verbindung selbst auf eine WebSocket-Verbindung? Das ist nicht was ich will! Ich möchte die ursprüngliche HTTP-Anfrage und die Upgrade-Prozesse von mir selbst mit Undertow behandeln. Ich verwende Informationen aus der ersten HTTP-Verbindung, um zu überprüfen, ob der Benutzer mit dem angeforderten Endpunkt verbunden werden kann, und wenn dies der Fall ist, rufe ich programmgesteuert WebSocketProtocolHandshakeHandler#handleRequest(exchange)
von Undertow auf, um auf eine WebSocket-Verbindung zu aktualisieren. Ich möchte nur, dass Apache alles passieren lässt, ohne zu stören.
Hilfe zum Ausführen von WebSockets mit Undertow hinter einem Apache Reverse-Proxy?