Fehlgeschlagene Uploads mit BadRequest-Fehler auf Nextcloud
Als ich kürzlich wieder einmal auf Reisen war und meine Fotos in meine Nextcloud hochladen wollte, schlugen die Uploads plötzlich reihenweise fehl. Früher war das noch nie ein Problem. Natürlich gibt es hie und da Netzwerkunterbrüche, gerade wenn man über den Mobilfunk grosse Dateien hochlädt, allerdings war ich in einem Hotel-Wifi eingeloggt und die Dateien waren nur ca. 15 MB gross (falls der Leser sich jetzt fragt, welche Handykamera so grosse JPEGs generiert: Es handelt sich um RAW-Dateien einer Fotokamera). Das Problem trat sogar dann auf, wenn ich nur eine einzige Datei hochladen wollte. Im serverseitigen Protokoll der Nextcloud konnte ich die folgende Fehlermeldung dutzende Male lesen:
BadRequest Erwartete Dateigröße von 15529970 bytes, aber 11124736 bytes gelesen (vom Nextcloud-Client) und geschrieben (in den Nextcloud-Speicher). Dies kann entweder ein Netzwerkproblem auf der sendenden Seite oder ein Problem beim Schreiben in den Speicher auf der Serverseite sein.
Mein erster Ansatz war natürlich, die Konfiguration der Nextcloud zu überprüfen. Dort konnte ich jedoch nichts Auffälliges feststellen. Meine zweite Vermutung war das Hotel-Wifi. Dieses hat meinen Upload nämlich ordentlich gedrosselt. Also habe ich testweise die Uploadgeschwindigkeit meines Nextcloud-Clients so reduziert, dass ich den Schwellwert des Hotel-Wifis gar nicht erst erreiche. Die Uploads schlugen zwar immer noch fehl, aber nun nach viel weniger Daten. Die Stoppuhr hat dann gezeigt, dass alle Uploads nach genau einer Minute abbrechen. Der Verdacht eines Timeouts drängt sich auf. In PHP kann man solche Limiten definieren. Eine kurze Überprüfung der PHP-Einstellungen hat diesen Verdacht aber nicht bestätigt.
Allerdings gab es in meinem Fall noch eine zweite Möglichkeit, wo so ein Timeout konfiguriert sein könnte. Die Nextcloud hängt nämlich nicht direkt am Internet, sondern über Traefik, einen Reverse-Proxy. Dieser verfügt über eine solche Einstellung:
entrypoints-name-transport-respondingtimeouts-readtimeout
Wenn man diese Option nicht explizit konfigurert, liegt sie standardmässig bei 60 Sekunden. Der Übeltäter scheint also gefunden, und er erklärt auch die Fehlermeldung: Traefik kappt die Verbindung, weil der Upload-Request länger als 60 Sekunden dauert, und für die Nextcloud sieht es so aus, als habe der Client den Upload unerwartet abgebrochen. Testweise habe ich die Einstellung auf 120 Sekunden gestellt, und siehe da: Keine Uploadprobleme mehr.
entrypoints:
websecure:
address: ":443"
transport:
respondingtimeouts:
readtimeout: "120"
Natürlich kann es jetzt trotzdem immer noch zu Verbindungsunterbrüchen kommen nämlich wenn a) die Datei sehr viel grösser als 15 MB ist und länger als 120 Sekunden braucht, oder b) die Internetverbindung nochmal langsamer ist, sodass der Upload auch länger als 120 Sekunden braucht. Daher sei an dieser Stelle erwähnt, dass Traefik auch die Möglichkeit bietet, den Timeout komplett zu deaktivieren, indem man den Wert auf 0 setzt. Ich weiss aber nicht, ob das sinnvoll ist und ob dadurch eventuell andere Probleme geschaffen oder ermöglicht werden, daher möchte ich an dieser Stelle keine konkrete Empfehlung aussprechen.
