Welche Folgen hat es, wenn die Serverdatei während des Herunterladens auf Nginx geändert wird?

Welche Folgen hat es, wenn die Serverdatei während des Herunterladens auf Nginx geändert wird?

Es scheint, dass auf einem Nginx-Server das Ändern des Inhalts einer heruntergeladenen Datei zu einer beschädigten und inkonsistenten Datei auf der Clientseite führen kann. Hier ist mein Experiment:

Ich habe einen Nginx-Server in einem lokalen Netzwerk erstellt und darauf befindet sich eine 1 MB große Datei, die mit „a“ gefüllt ist. Ich lade diese Datei mit curl auf meinen Computer herunter (und die Geschwindigkeit ist ziemlich langsam). Während des Downloads überschreibe ich diese Datei auf dem Server mit einer anderen Datei mit derselben Größe, aber mit „b“ gefüllt. Ich habe diesen Schritt mit dem Linux-Befehl „cp“ ausgeführt und es tritt kein Fehler auf. Als ich schließlich das heruntergeladene Ergebnis überprüfe, stellt sich heraus, dass es sich um eine gemischte Datei mit „a“ im ersten Teil und „b“ im zweiten Teil handelt, ungefähr so: „aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb“

Ich frage mich, ob dies die erwartete Folge ist. Und wenn ja, gibt es eine Möglichkeit, Nginx anzuweisen, alle IO-Vorgänge abzulehnen, wenn noch aktive Verbindungen bestehen, oder einfach einen Fehlercode zurückzugeben und die Verbindung abzubrechen, nachdem die Datei geändert wurde? Da das Aktualisieren von Dateien auf dem Server eine sehr häufige Operation sein kann, sollte es meiner Meinung nach einige Problemumgehungen geben.

Meine Testumgebung:

Server OS: Linux 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 
2014 x86_64 x86_64 x86_64 GNU/Linux

Server file system: ext4

Nginx version: nginx/1.4.6 (Ubuntu)

Client OS: Windows 10

Client tool: curl 7.51.0 (x86_64-w64-mingw32) libcurl/7.51.0 OpenSSL/1.0.2j 
zlib/1.2.8 libssh2/1.7.0 nghttp2/1.15.0 librtmp/2.3

Antwort1

Das Lesen einer Datei, die überschrieben wird, kann unvorhersehbare Ergebnisse haben.

Sie erhalten viel vorhersehbarere Ergebnisse, wenn Sie Ihre Änderungen an einen temporären Speicherort (im selben Dateisystem) schreiben und mvdie temporäre Datei umbenennen (), um die aktuelle Version zu ersetzen. Das Umbenennen von Dateien ist atomar und erfolgt sofort.

Wenn Ihr Webserver beim Umbenennen einer Datei (noch) die alte Version gelesen und übertragen hat, wird er dies ab der alten Version so lange tun, bis der Download abgeschlossen ist. Bei allen neuen Anforderungen für diese Datei wird jedoch die neue Version abgerufen.

verwandte Informationen