Verbindung zwischen Client und Server wird nach einer Minute idle Zeit mit 408 getrennt

  • Hi,


    die Verbindung zwischen dem Client und Server wird nach einer Minute getrennt wenn keine daten geschickt werden.

    Setup:

    • Virtueller Server (VPS 200 G8)
    • Betriebssystem 5.13.5-arch1-1
    • Server Apache/2.4.48

    httpd config:



    Logs:

    httpd:

    cat /var/log/httpd/access.log:

    "meine ip" - - [04/Aug/2021:19:28:21 +0200] "GET /wss/ HTTP/1.1" 408 - "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"



    Mein Serverprogramm log:


    echo Exception: stream truncated


    Was muss ich tun damit die Verbindung nicht getrennt wird wenn 1 minute lang keine Daten geschickt werden?

  • Hallo werto87 und herzlich Willkommen im Forum,


    der Editor unter dem Forum hat bestimmte Funktionen für Quelltexte etc.

    Bitte nutze diese Funktionen für Config Dateien und Logs - das macht deinen Beitrag übersichtlicher.


    Mir fehlt auch ein bisschen die Beschreibung, was du da eigentlich vor hast.

    Das Serverprogramm, ist das selbstentwickelt?


    Und du möchtest mit dem Apache einen Websocket als Proxy anbinden, verstehe ich das richtig?


    Zur eigentlichen Problemlösung:

    - Hast du im Apache das Modul proxy_wstunnel geladen?

    - Was macht denn der Client (Webbrowser)? Gibt es dort nicht auch Keepalive Optionen?

    - In einigen Quellen steht auch was davon, dass einige Browser damit Probleme machen und ein Wechsel des Browsers die Probleme löst. Damit könntest du ausschließen, dass der Server das Problem ist.

  • Hallo H6G,


    Mir fehlt auch ein bisschen die Beschreibung, was du da eigentlich vor hast.

    Das Serverprogramm, ist das selbstentwickelt?

    Ich habe ein mehrspieler Spiel entwickelt ( client_git und server_git). Es besteht aus einem Client und einem Server (ich spreche im folgenden von Game-Client und Game-Server).

    Der Game-Client ist in c++ entwickelt und wird mit emscripten zu wasm compiliert. Außerdem wird noch etwas javascript und html generiert.

    Wenn der Benutzer auf meine Domain geht dann serviert ihm apache den Game-Client.

    Der Game-Server ist ein "normales" c++ Programm das auf einem Port hört und wartet bis sich der Game-Client verbindet. Wenn sich der Game-Client verbindet, wird die Verbindung zu einer websocket Verbindung aufgewertet "upgraded".

    Damit der Game-Client den Game-Server findet habe ich das mit dem apache ProxyPass gemacht. Das funktioniert auch soweit ganz gut. In meinem Spiel kann es allerdings vorkommen, dass ein Spieler eine Weile, keine Nachricht bekommt und sendet. Nach 60 Sekunden kommt es aber leider zu einem Verbindungsabbruch.


    Und du möchtest mit dem Apache einen Websocket als Proxy anbinden, verstehe ich das richtig?

    Nicht ganz. Das funktioniert bereits nur leider gibt es das Problem mit dem Verbindungsabbruch nach 60 Sendungen, wenn keine Nachricht gesendet oder empfangen wird.

    - Hast du im Apache das Modul proxy_wstunnel geladen?

    Ich weiß es nicht genau ^^.

    Code
    1. httpd -M | grep "proxy_wstunnel"

    proxy_wstunnel_module (shared)


    Aber wenn ich versuche "ProxyWebsocketIdleTimeout" zu setzen dann kommt eine Fehlermeldung das proxy_wstunnel nicht geladen ist.

    Außerdem gibt

    Code
    1. a2enmod proxy_wstunnel

    ERROR: Module proxy_wstunnel does not exist!

    zurück.


    - Was macht denn der Client (Webbrowser)? Gibt es dort nicht auch Keepalive Optionen?

    - In einigen Quellen steht auch was davon, dass einige Browser damit Probleme machen und ein Wechsel des Browsers die Probleme löst. Damit könntest du ausschließen, dass der Server das Problem ist.

    Ich schaue mir das mal an und schraube da etwas herum. Es gibt hier das Problem das der Game-Client SharedArrayBuffer verwendet und ich das in Firefox nicht anbekomme. Hinweis ich sende bereits die header:

    Code
    1. Cross-Origin-Opener-Policy: same-origin
    2. Cross-Origin-Embedder-Policy: require-corp

    Und es funktioniert zumindest in Chrome.

  • Der Game-Client ist in c++ entwickelt und wird mit emscripten zu wasm compiliert.

    Das ist ja mal mega. :thumbup:

    Nutzt du diese API? https://emscripten.org/docs/po…p-sockets-over-websockets



    dann kommt eine Fehlermeldung das proxy_wstunnel nicht geladen ist

    Das ist echt ungewöhnlich.

    Eigentlich sollte es damit gehen:


    Code
    1. a2enmod proxy
    2. a2enmod proxy_http
    3. a2enmod proxy_wstunnel


    Gibt es einen Grund, warum du Apache nutzt?

    Es gibt viel bessere Proxies, z.B. nginx - der kann auch den Client ausliefern.


    Wenn Apache hier wirklich das Problem ist, würde ich es mit nginx probieren.

    Das könnte auch von der Performance interessanter werden.

    Ich habe aber noch nie mit Websockets unter nginx gearbeitet.

  • Das ist ja mal mega. :thumbup:

    Nutzt du diese API? https://emscripten.org/docs/po…p-sockets-over-websockets

    Danke! Ich nutze websocket-api.

    Code
    1. a2enmod proxy
    2. a2enmod proxy_http
    3. a2enmod proxy_wstunnel

    Die ersten zwei Befehle gehen der dritte nicht.

    Gibt es einen Grund, warum du Apache nutzt?

    Nein es gibt keinen zwingenden Grund warum ich Apache nutze. Ich spiele schon seit einigen Tagen mit dem Gedanken zu wechseln.

    Allerdings hat das mit dem timeout keine hohe Prio. Der Benutzer kann sich notfalls wieder einloggen und kommt dann zurück in die Lobby oder in das Spiel das er gerade gespielt hat.

  • Code
    1. httpd -M | grep "proxy_wstunnel"

    proxy_wstunnel_module (shared)


    Außerdem gibt

    Code
    1. a2enmod proxy_wstunnel

    ERROR: Module proxy_wstunnel does not exist!

    zurück.

    Die Existenz von "httpd" oben läßt auf die Verwendung einer Fedora-/RHEL-basierten Distribution schließen, korrekt? EDIT: Dort sollte mod_proxy* standardmäßig aktiviert sein, ggf. hat man aus diesem Grund auf eine Aktivierungs-/Deaktivierungsmöglichkeit verzichtet.

    mod_proxy_wstunnel gibt es ab Apache2 v2.4.5; bei einer Debian-/Ubuntu-basierten Distribution mit "Dritt-Repository" von O. Surý ist man hier ggf. auf neuerem Stand:

  • Die Existenz von "httpd" oben läßt auf die Verwendung einer Fedora-/RHEL-basierten Distribution schließen, korrekt? EDIT: Dort sollte mod_proxy* standardmäßig aktiviert sein, ggf. hat man aus diesem Grund auf eine Aktivierungs-/Deaktivierungsmöglichkeit verzichtet.

    mod_proxy_wstunnel gibt es ab Apache2 v2.4.5; bei einer Debian-/Ubuntu-basierten Distribution mit "Dritt-Repository" von O. Surý ist man hier ggf. auf neuerem Stand:

    Wenn ich es richtig sehe, wird auf dem Server Arch Linux verwendet:

    > Betriebssystem 5.13.5-arch1-1

  • Hallo m_ueberall,


    Die Existenz von "httpd" oben läßt auf die Verwendung einer Fedora-/RHEL-basierten Distribution schließen, korrekt?

    Ich verwende Archlinux. Leider weiß ich nicht auf was Arch basiert.

    mod_proxy_wstunnel gibt es ab Apache2 v2.4.5; bei einer Debian-/Ubuntu-basierten Distribution mit "Dritt-Repository" von O. Surý ist man hier ggf. auf neuerem Stand:

    Meine Apache version ist:

    Server version: Apache/2.4.48 (Unix)

    Server built: May 28 2021 16:40:47

  • Was seltsam ist ich habe

    Code
    1. LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

    in der httpd.conf aktiviert. Eigentlich müsste es ein error geben wenn das modul nicht da ist. Kommt aber keine Fehlermeldung.

    Wenn ich aber "ProxyWebsocketIdleTimeout" setzen möchte dann kommt die Fehlermeldung "modul nicht geladen".

  • Ich weiß auch nicht ob das mit dem "ProxyWebsocketIdleTimeout" wirklich das Problem behebt.

    Ich verwende das was mir in apachelounge empfohlen wurde. Das was bei ProxyPass und so steht soll so ähnlich wirken. Mir würde eine Aussage von netcup reichen ob es sein kann das meine idle websocket Verbindung nach 60 Sekunden von netcup getrennt wird. Falls nicht würde ich es mit nginx probieren.

  • Ich verwende Archlinux. Leider weiß ich nicht auf was Arch basiert.

    Arch basiert auf Arch ;-) - ist eine eigenständige Distribution die ohne eine bestehende Basis gebaut wird.


    Vielleicht wurde in Apache das Modul nicht einkompiliert.

    Eigentlich sollte das aber vorhanden sein: https://archlinux.org/packages/extra/x86_64/apache/files/


    Guck mal bitte, ob die Datei /usr/lib/httpd/modules/mod_proxy_wstunnel.so existiert.


    Mir würde eine Aussage von netcup reichen ob es sein kann das meine idle websocket Verbindung nach 60 Sekunden von netcup getrennt wird.

    Das kann ich auf jeden Fall ausschließen.

  • Arch basiert auf Arch ;-) - ist eine eigenständige Distribution die ohne eine bestehende Basis gebaut wird.

    Dazu gibt es eine tolle Grafik periodic-table-of-distro

    Guck mal bitte, ob die Datei /usr/lib/httpd/modules/mod_proxy_wstunnel.so existiert.


    Code
    1. ls /usr/lib/httpd/modules/ | grep tunnel

    mod_proxy_wstunnel.so


    Das kann ich auf jeden Fall ausschließen.

    Vielen Dank für die Hilfe! Ich werde es mal mit nginx probieren.