Langsamer Download wenn Reverse Proxy in Verwendung

Hallo Leute,

ich habe ein Problem bei der Download-Geschwindigkeit, wenn ich Nextcloud hinter einem Reverse-Proxy lege.

Hier meine Konfiguration:

WAN: VDSL mit Lancom-Router (250MBit/s Downstream, 40MBit/s Upstream)

Nextcloud: Version 33 auf einer VM mit Ubuntu 20.04 und Apache Webserver

Wenn ich den Lancom so konfiguriere, dass eine Port-Weiterleitung direkt auf die Nextcloud-VM stattfindet, dann erreiche ich aus dem Internet eine Download-Rate von nahezu 40 MBit/s. Also die maximale Upload-Rate des WAN-Anschlusses auf Nextcloud-Seite.

Schalte ich nun aber einen Reverse-Proxy dazwischen, dann bricht mir die Download-Rate auf 3,5 bis 4,5 MBit/s runter. Hier die Konstellation mit Reverse Proxy:

Reverse-Proxy: (NPM) Nginx-Proxy-Manager 2.15.1 im Docker Container

Docker Host ist ein Synology NAS (Business Class Gerät) mit absolut ausreichend CPU Power und viel RAM.

VM Host ist eine separater Server mit ESXi 8 (nicht das Synology). Synology und ESXi befinden sich im gleichen LAN (gleiches Subnetz).

Port-Mapping im Lancom auf den Nginx-Proxy-Manager (öffentlich Port 443 / HTTPS) eingerichtet.

Intern zwischen Reverse-Proxy und Nextcloud wird ebenfalls HTTPS verwendet.

Auszüge aus meiner Nextcloud config.php

'trusted_domains' => array (
  0 => 'meine.eigene.domaene',
  1 => 'LAN-IP-der-Nextcloud-VM',
),
'trusted_proxies' => array (
  0 => 'LAN-IP des Docker Hosts',
),
'overwrite.cli.url' => 'https://meine.eigene.domaene',
'overwriteprotocol' => 'https',
'overwritehost' => 'meine.eigene.domaene',

meine Einstellungen im npm:

Schema: https
Forwared IP: LAN-IP-der-Nextcloud-VM
Port: 443
Cache Assets: disabled
Gängige Exploids blockieren: disabled
WebSockets Supports: enabled
Erzwinge SSL: enabled
HTTP/2 Support: enabled

Unter Advanced noch folgende Einstellungen

proxy_set_header Connection "";
client_max_body_size 10G;
proxy_buffering off;
proxy_request_buffering off;
proxy_max_temp_file_size 0;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_pass_header X-Transmission-Session-Id;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_hide_header Upgrade;
keepalive_timeout 3600s;
client_body_timeout 120s;
client_header_timeout 120s;
send_timeout 3600s;
tcp_nodelay on;
location /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; }
location /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; }
location ^~ /.well-known { return 301 $scheme://$host/index.php$uri; }

In beiden Systemen (Reverse-Proxy und im Nextcloud) wird das identische SSL-Zertifikat verwendet.

Die Upload-Rate (Datei hochladen aus dem Internet zu Nextcloud) funktioniert bei beiden Konstellationen etwa gleich schnell. Nur den Download über den Reverse-Proxy ist so unbefriedigend langsam. Hat jemand Erfahrung mit NPM im Docker.

Hallo @MartinAur,

willkommen in den Foren der Anwender-Gemeinschaft von Nextcloud! :handshake:

du hast ds Problem schon recht gut auf den reverse-proxy eingegrenzt.. Ich persönlich bin etwas überrascht - ein reverse-proxy ist eigentlich ein recht einfaches Stück Software und sollte nicht gerade zum Flaschenhals werden..
Ich würde als nächstes den Zugriff interns vs Extern vergleichen:

Wenn der Download intern schnell ist ist das Problem “vor” dem RP zB beim Router, wenn es hier auch langsam ist liegt das Problem beim reverse-proxy selbst und du musst dort troubleshooten: cpu, netzwerk etc..

Hallo @wwe,

habe deinen Vorschlag mal getestet. Also folgende Datenraten konnte ich beim internen Zugriff erreich:

Fall 1: interner DNS löst bisher den Namen “meinNextcloud.tdl” auf die IP der Nextcloud-VM auf. Hier konnte ich beim Download einer 1.2 GB-Datei im Schnitt so ca. 800 MBit/s schaffen. Hier zappelt die Anzeige zwischen 1 GBit/s und 100 MBit/s. Ich denke da ist das Limit die Lesegeschwindigkeit der HDD in der Nextcloud-VM.

Fall 2: DNS soll den Domainnamen auf die IP des Reverse-Proxy auflösen.

Hier musste ich zunächst den Docker Container auf MACVLAN umstellen, damit ich den Reverse-Proxy den Port 443 zuweisen kann. Zuvor lief der Container im Bridge-Modus und weil das Synology DSM belegt bereits den Port 443 verwendet, musste ich den Reverse-Proxy auf 7443 umbiegen. Dann klappte allerdings der Zugriff vom internen Client über https://meinNextcloud.tdl:7443 nicht. Hier antwortete der Reverse-Proxy immer mit einem falschen SSL-Zertifikat. Ich glaube dass die Nextcloud-Instanz https-Links generiert, bei welchen die Port-Nummer fehlt und dann landet der Client wieder auf dem Synology Dienst auf Port 443.

Auf jeden Fall funktioniert der Reverse-Proxy mit MACVLAN und Standard-Ports und ich erreiche Download-Raten von 300 MBit/s (lokaler Client ↔ Reverse Proxy ↔ Nextcloud).

Habe dann nochmals zwei Messung bei externen Zugriff gemacht

externer Client ↔ Router ↔ Reverse-Proxy ↔ Nextcloud: zwischen 4 und 8 MBit/s

externer Client ↔ Router ↔ Nextcloud: zwischen 39 MBit/s (bei einer 42 MBit/s DSL Leitung)

Die KI behauptet, dass vermutlich der Reverse Proxy die Pakete beim Transport vergrößert und diese den MTU-Wert überschreiten und deshalb diese dann fragmentiert werden. Hab es aber nicht hinbekommen, wie ich Nextcloud dazu bringe, bei zu sendenden Paketen einen kleineren MTU-Wert einzustellen.

Mich überrascht auch dass der Reverse Proxy bereits 50% Bandbreite gegenüber nackter Nextcloud zurückfällt, aber ich denke das kann man im daily business verkraften - immer noch schnell genug und extern bist du eher noch weiter eingeschränkt wegen dem DSL Upload.. deswegen würde ich das erst mal zurückstellen..

wenn ich dich richtig verstehe hast du

interner Client          ↔ Reverse-Proxy ↔ Nextcloud: 300 MBit/s
externer Client ↔ Router ↔ Reverse-Proxy ↔ Nextcloud: zwischen 4 und 8 MBit/s

damit is die Verbindung Reverse-Proxy ↔ Router ist die Schwachstelle - dort verlierst du viel.. damit ist die MTU der Nextcloud (oder Reverse Proxy) praktisch nicht relevant. Wenn der Router bei nackter Nextcloud besser performt, scheint er auch nicht der überltäter zu sein..

Schaue dir den Reverse Proxy genauer an.. ich kenne NPM nicht aber ich könnte mit vorstellen dass dort http/2 oder http/3 nicht aktiv ist (auch wenn es in der Config aktiviert ist) das kostet viel Zeit.. du kannst dir die Verbindungen im Browser f12 anschauen - achte ob die einzelnen Requests mit http/1.1 oder h2 erfolgen..
für http/3 brauchst du UDP - ist häufig nicht aktiv, gerade beim Docker Container musst du auch extra 443/udp konfigurieren

Schaue dir folgende Artikel an:

http/2 wird definitiv verwendet, dass habe ich Browser vom Client überprüft, so wie du es beschrieben hast.

Danke für die Unterstützung, ich werde das Thema jetzt aber zuerst Mal auf Eis legen, da ich gerade andere Aufgaben mit höherer Prio erledigen muss. Müssen jetzt halt die externe User mit der langsamen Verbindung leben.