2016-06-18 6 views
0

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?

Antwort

1

Ich wurde müde und beschloss, Nginx zu versuchen.

In 3 Stunden, bekam ich nicht nur WebSockets working, aber alle meine Seiten auf einem Server wurden darauf verschoben. Super einfach.

Die magischen Linien für WebSockets, in nginx.conf sind:

proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection "upgrade"; 

Ich verstehe, dass "Upgrade" ist ein spezieller "Hop-by-Hop" Header, die explizit gehalten werden werden muss konfiguriert.

Ich hoffe, es gibt eine ähnliche Lösung für Apache, aber Mann, es gibt so wenig Dokumentation darüber!

Verwandte Themen