eideard
Goto Top

Websocket Apache Konfiguration

Hi zusammen,
ich habe privat einen Apache Server, welchen ich schon lange am Laufen habe und auch recht gut damit zurechtkomme. Nun wollte ich mich bei der Entwicklung aber mal mehr mit Websockets beschäftigen und stoße da auf einige Probleme...

Da mein Server privat ist läuft dieser natürlich auf einer DDNS mit einer dynamischen IP Adresse und dem ganzen ist ein NGinx Reverse Proxy vorgeschaltet (falls das am Ende relevant ist).

Ich habe mir für ein neues Testprojekt einen weiteren VHost eingerichtet, mit Subdomain und alles was dazu gehört. Alles auch im NGinx konfiguriert (mit Websocketsupport, HTTP/2 Support, Force SSL). Intern leitet der NGinx allerdings per HTTP weiter.

Am Apache habe ich nun die Module proxy, proxy_http und proxy_wstunnel aktiviert. Lange zeit habe ich es nicht gebacken bekommen, dass ich den Websockt mit über Port 80 nutzen kann und habe erstmal (um den Spaß nicht zu verlieren) den echten WS Port direkt genutzt. Der WS läuft wunderbar. Auch die Testseite läuft. Jetzt wollte ich aber, dass der Websocket ganz normal via Port 80 zugreift. Und da treten meine Probleme auf... inzwischen läuft es so weit, dass ich grundsätzlich eine Websocket Verbindung aufbauen kann, aber diese bricht nach ~2min ab.

Dies ist meine VHost config:
<VirtualHost *:80>
    ServerName test.example.de
    ServerAlias test.example.de
    DocumentRoot /var/www/test

    <Directory /var/www/test>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost"  
    </FilesMatch>
    
    RewriteEngine on
    RewriteCond ${HTTP:Upgrade} websocket [NC]
    RewriteCond ${HTTP:Connection} upgrade [NC]
    RewriteRule .* "ws://localhost:8080/$1" [P,L]  
    
    ProxyPreserveHost On
    ProxyPass "/ws/"  "ws://localhost:8080/"  
    ProxyPassReverse "/ws/"  "ws://localhost:8080/"  
    ProxyRequests off

    ErrorLog ${APACHE_LOG_DIR}/team_error.log
    CustomLog ${APACHE_LOG_DIR}/team_access.log combined
</VirtualHost>

Die Verbindung wird im JS wie folgt aufgebaut:
var ws_server = new WebSocket("wss://test.example.de/ws/");  

Wie gesagt, es funktioniert inzwischen... aber nach knapp 1,5 - 2min kickt anscheinend ein Timeout rein und die Verbindung ist weg. Woran kann das liegen? Was habe ich falsch gemacht? Ich danke für eure Unterstützung!

Content-ID: 3222506286

Url: https://administrator.de/contentid/3222506286

Ausgedruckt am: 26.11.2024 um 04:11 Uhr

Roadmax
Roadmax 01.07.2022 um 11:07:51 Uhr
Goto Top
Hallo,

wenn ich dich richtig verstehe, hast du vom dem Apache, der als Reverse Proxy agiert, noch einen Nginx der ebenfalls als Reverse Proxy agiert? Wofür machst du das?
Welche Timeouts hast du denn auf dem Nginx definiert? Deine Probleme können vom Client, vom Backend und/oder von den Proxies kommen.

Gruß
Eideard
Eideard 01.07.2022 aktualisiert um 12:03:36 Uhr
Goto Top
Hi,
danke für deine Antwort.

Ja genau der Nginx Proxy leitet alle meine Dienste weiter, die ich auf meinem Server laufen habe (knapp 20). Weil sonst komme ich mit einer IP und einem Port 80 nach außen nicht weit ;)

Im NGinx lässt sich der Websocket support aktivieren. Damit leitet er eine Websocket Anfrage durch. Das funktioniert auch soweit ganz gut bei meinen anderen Diensten. Ich habe hier also nichts anders eingestellt als bei allen anderen.
Timeouts sind keine eingestellt. Normal sollte ja ein Websocket kein Timeout in dem Sinne haben.

Ich würde den Client bzw. das Backend als Fehlerquelle ausschließen weil wenn ich direkt verbinde:
var ws_server = new WebSocket("ws://test.example.de:8080/");  
Dann klappt alles (Verbindung besteht bis zur Zwangstrennung vom Anbieter). Dabei ist nur kein SSL aktiv und es läuft über den direkten Port 8080. Ich möchte aber natürlich SSL (kommend vom NGinx) und den Port 80 nutzen.
Vans66
Vans66 01.07.2022 um 12:46:47 Uhr
Goto Top
Hallo eideard,

Verstehe ich das richtig, dass du von aussen https -> nginx -> apsche2 http und dann -> ws Socket auf 8080 machst ?

Wenn ja , warum mach der nginx das nicht direkt per upstream ?
Oder hat es einen anderen Grund ?

Gruß vans66
Eideard
Eideard 01.07.2022 um 13:58:11 Uhr
Goto Top
Nein so ist das nicht. Das war nur zu testzwecken ob der Websocket vielleicht spackt...

Ich hänge mal meinen Portplan an, vielleicht wird das einfacher damit zu erklären.
So, ich habe mehrere Dienste auf meinem Server laufen (die meisten sind da eingezeichnet). Viele sind Webbasierte Dienste z.B. Bitwarden (Ein Passwortsafe). Damit ich allen jeweils eine Subdomain zuweisen kann die ganz normal ohne extra Port aufrufbar ist habe ich einen ReverseProxy davor geschaltet. Dieser reagiert auf 80 und 443 TCP, hält die Let's Encrypt Zertifikate aktuell usw., Leitet dann die Anfragen an die Dienste weiter. Entweder per 443 oder 80, je nachdem wie sensibel die Daten dort halt sind, habe ich diese auch in meinem Netzwerk gesichert. Bitwarden, Grafana usw. verwenden auch Websockets und die funktionieren einwandfrei über Port 80 bzw. 443. Da der NGinx mit dem Websocket Support das passend weiterreicht.

Für mich ist hier aber der Apache2 mit dem einen VHost (Develope, grün markiert) interessant. Ich möchte auf den VHost via HTTPS zugreifen. Der Websocket muss dann auch HTTPS sein. Dieser kommt dann per 443 rein und alles weitere wird dann via 80 vom NGinx weitergereicht an den Apache.

Test1 (Websocket an sich testen):
Ich rufe die Webseite via HTTP auf, komme auf die Seite, dann ruft der Websockt die Domain auf dem direkten Port 8080 und umgeht damit den NGinx sowie den Apache indem er direkt den WS anspricht. Das funktioniert wunderbar bis mein Internet weg ist!

Test2 (SSL Testen)
Nun gehe ich per HTTPS drauf, der Websocket ruft die Domain via wss und Port 443 auf. Er wird vom NGinx weitergereicht, Verbindung wird hergestellt und nach ca. 1,5 bis 2min bricht die Verbindung zusammen (Zeit ist nicht genau und nicht fix! Also wohl kein richtiger Timeout...)
homeserverports