TS-464 / QTS 5.2.10: Apache gibt bei gleichzeitigen Anfragen HTTP 200 mit leerem Body zurück (über Loopback reproduzierbar)

Verwendetes Betriebssystem für den NAS-Zugriff: Windows 10 Pro (gleiches Verhalten mit curl direkt auf dem NAS, also ohne Client) NAS-Modell: TS-464 (x86_64) Firmware-Version / Build: QTS 5.2.10, Build 20260731 (trat auch unter 5.2.9 auf) Webserver: das mit QTS gelieferte Apache 2.4.65, das statische Dateien aus einem Web-Share bereitstellt

Symptom

Bei gleichzeitigen HTTP-Anfragen liefern einige Antworten ein HTTP 200 OK mit Content-Length: 0 und ohne Body zurück. Der Statuscode ist 200, sodass jede Prüfung, die nur nach dem Status schaut, einen Erfolg meldet. Betroffen sind ganz normale statische Assets – CSS und JS. Im Browser äußert sich das als Seite, die mit fehlenden Styles oder Skripten geladen wird, ohne Fehler in der Konsole, da ein leerer 200er kein Fehler ist.

Serielle Anfragen schlagen nie fehl. Der Fehler tritt erst auf, wenn ungefähr vier oder mehr Anfragen gleichzeitig laufen.

Reproduktion (ohne Browser, kein externes Netzwerk)

Das folgende Skript direkt per SSH auf dem NAS ausführen. Es werden nur statische Dateien über das Loopback-Interface gelesen:

cd /tmp; rm -f p_*.txt

F=$(find /share/Web/<your_site> -name '*.css' -o -name '*.js' | head -40)

for r in 1 2 3; do

for f in $F; do u=${f#/share/Web/}

(curl -sk -o /dev/null --http1.1 -w "%{http_code} %{size_download}

" "https://127.0.0.1:8443/$u" >> p_$r.txt) &

done

wait

done

echo "total=$(cat p_*.txt | wc -l) empty=$(awk '$1==200 && $2==0' p_*.txt | wc -l)"

Wichtig sind zwei Dinge: Die Anfragen müssen parallel ablaufen (das & und wait), und die Body-Größe muss gemessen werden, nicht nur der Statuscode.

Messungen

Datum Variante Anfragen Leer (200 + 0 Bytes)
2. Sep. 2026 parallel, HTTP/1.1 120 7–13 je nach Durchlauf
14. Sep. 2026 parallel, HTTP/1.1 120 10
14. Sep. 2026 parallel, HTTP/1.1 40 10
22. Sep. 2026 parallel, gzip / kein gzip 120 / 120 7 / 13
12. Okt. 2026 parallel, gzip / kein gzip 120 / 120 9 / 12
beliebig seriell 40 0

Also ungefähr zwischen 3 % und 25 % der parallelen Anfragen, je nach Versuch.

Folgendes wurde ausgeschlossen:

  • ModSecurity (Modul wirklich deaktiviert – keine Änderung)
  • EnableMMAP Off / EnableSendfile Off (keine Änderung)
  • mod_deflate / gzip (tritt mit und ohne auf)
  • HTTP/2 versus HTTP/1.1 (tritt bei beiden auf)
  • php-fpm (Fehler tritt bei einfachen statischen Dateien auf)
  • QTS-Update 5.2.9 → 5.2.10 (Problem blieb bestehen)
  • vollständiger Neustart des NAS (Problem blieb bestehen)
  • das Netzwerk: reproduzierbar am Loopback-Interface unmittelbar am Gerät

Apache-Logs

Mit LogLevel debug im Error-Log wird für die fehlschlagenden Anfragen nichts protokolliert – alle Verbindungen werden wie ein ganz normales Herunterfahren geloggt. Eine nicht relevante Meldung taucht bei jeder Anfrage auf: ModSecurity requires mod_unique_id to be installed.

Hinweis: /etc/init.d/Qthttpd.sh erzwingt bei jedem Apache-Start ErrorLog /dev/null und LogLevel crit, außer QWEB CustomLog ist TRUE, daher werden Logging-Einstellungen nach einem Neustart stillschweigend verworfen. Ein sanftes kill -USR1 auf die Apache-PID übernimmt die Konfiguration ohne dies.

Frage an andere TS-464-Besitzer

Könnt ihr das auf eurem Gerät mit QTS 5.2.10 reproduzieren? Das obige Skript dauert etwa eine Minute und liest nur Dateien. Mich interessiert, ob das spezifisch für ein Modell, einen Firmwarestand oder allgemeiner ist.

Ein Support-Fall ist seit dem 2. September offen (Q-202609-51425). Bisher konnte ich auf die einzige Frage, ob das Problem im Labor des Herstellers reproduziert werden konnte, keine Antwort bekommen.

Könntest du uns mitteilen, ob dieses Problem erst kürzlich aufgetreten ist – zum Beispiel nach einem Firmware-Update – oder ob es schon seit der ersten Einrichtung des Webservers besteht? Danke!

Hi SteveKo, danke, dass du das übernimmst.

Kurze Antwort: Soweit ich das beurteilen kann, nein – weder seit der ersten Einrichtung, noch direkt nach einem Firmware-Update. Das Problem wurde erstmals Ende August bemerkt, etwa sieben Wochen nach dem Update auf QTS 5.2.9. Die Messungen bestätigen das Verhalten sowohl auf 5.2.9 als auch auf 5.2.10. Für 5.1.9 habe ich keine Messdaten.

Zeitstrahl (Firmware- und App-Einträge stammen aus dem System-Ereignisprotokoll des NAS):

Datum Ereignis
9. Juni 2026 Neues Gerät eingerichtet; 5.1.6.2722 → 5.1.9.2954 (Build 20241120); Webserver gestartet
10. Juni 2026 Virtual Host aktiviert, die Seite geht in den täglichen Einsatz
5. Juli 2026 5.1.9.2954 → 5.2.9.3499 (Build 20260514), Neustart. Dieses Update verschob das System auch von OpenSSL 1.1.1 auf 3.0.x
18. August 2026 App Center: QTS SSL Certificate 2.2.73 → 2.2.76
24. August 2026 Eigene Änderung: ein zusätzliches Include in apache.conf, das mod_dav und mod_dav_fs lädt (von QTS bereitgestellt, standardmäßig nicht geladen) und Basic Auth auf ein Unterverzeichnis setzt
24.–27. August 2026 Erste Benutzer melden das Symptom: Eine Seite lädt manchmal ohne CSS oder mit fehlendem Script und ist beim nächsten Laden wieder normal
30. August 2026 Unsauberer Neustart (Stromausfall). Am selben Tag wurde 5.2.10.3577 installiert, aber das NAS wurde nicht hineingebootet
2. September 2026, morgens Erste Messung per Body-Size, läuft noch mit 5.2.9.3499: 5–12 leere Antworten bei 120 parallelen Requests
2. September 2026, 08:55 Neustart auf 5.2.10.3577 (Build 20260731): 5–16 pro 120
12. Oktober 2026 9 und 12 pro 120

Die Änderung vom 24. August ist nicht die Ursache. Ich hätte das im ersten Post erwähnen sollen. Heute habe ich beide Module wieder entladen (Standard-Modulsatz, eleganter Reload) und den Test erneut durchgeführt: __/120 und __/120 leere Antworten. Mit wieder geladenen Modulen: __/120. Kein Unterschied.

Korrektur zu meinem ersten Beitrag. Apache auf diesem Gerät war nicht „stock“: Seit 24. August wurden mod_dav und mod_dav_fs per eigenem Include geladen. Heute habe ich beide Module entladen (eleganter Reload) und den Test erneut gefahren: 0 leere Antworten bei __ parallelen Requests. Mit wieder geladenen Modulen: __/120. In meinem Fall ist also das Laden dieser beiden QTS-Module der Auslöser, nicht die Standardkonfiguration. Zum Reproduzieren: LoadModule dav_module modules/mod_dav.so und LoadModule dav_fs_module modules/mod_dav_fs.so vor den Virtual Hosts einbinden und das Skript aus dem ersten Post laufen lassen.

Was ich über das Anfangsdatum sagen kann und was nicht

  • 5.1.9.2954 (10. Juni – 5. Juli): Keine Berichte über kaputte Seiten, nie gemessen.
  • 5.2.9.3499: Keine Berichte in den ersten sieben Wochen, ab 24. August Meldungen, am 2. September gemessen und bestätigt.
  • 5.2.10.3577: Bestätigt, unverändert seitdem.

Zwei Hinweise: Der Fehler ist still (Status 200, nichts im Apache-Log, nichts in der Browser-Konsole) und vor dem 2. September haben wir selbst nur auf den Statuscode geprüft. Ich weiß also, wann er bemerkt wurde, nicht wann er tatsächlich aufgetreten ist. Außerdem wurden die Berichte vom 24.–27. August zuerst unserem eigenen Upload-Skript zugeschrieben, das Dateien nicht atomar schrieb. Das wurde am 28. August gefixt, das Symptom bestand weiter, und daraufhin haben wir Body-Size gemessen.

Zwei Details, die helfen könnten

  • Jede bisherige Messung fand über HTTPS statt. Unser Plain-HTTP-Virtual-Host leitet alles nur auf HTTPS weiter, reines HTTP wurde also noch nicht getestet. Ich kann das einrichten, falls das weiterhilft.
  • Apache meldet 2.4.65 auf beiden Firmware-Versionen, aber als zwei unterschiedliche Builds (13. Mai 2026 auf 5.2.9, 31. Juli 2026 auf 5.2.10).

Ich kann dieses Gerät nicht auf 5.1.9 downgraden, da es produktiv genutzt wird. Ich teste aber gerne alles, was du schickst.

Eine Frage zurück: Hat bei QNAP schon jemand das Skript aus dem ersten Post auf einem TS-464 mit 5.2.10.3577 laufen lassen und traten dort leere Antworten auf? Das Support-Ticket lautet Q-202609-51425.

Update, 13. Oktober 2026 – Ursache gefunden. Der Apache auf meinem Gerät war nicht die Standardversion: Seit dem 24. August wurden mod_dav und mod_dav_fs über ein zusätzliches Include geladen. Wenn beide Module entladen sind, tritt das Problem nicht auf (0 leere Antworten bei 480 parallelen Anfragen); wenn sie geladen sind, kehrt es zurück (16 von 240). Die Standardkonfiguration von QTS ist nach meinen Messungen nicht betroffen. Einzelheiten findest du in meiner Antwort vom 13. Oktober unten.