Nginx下載時修改伺服器檔案有什麼後果?

Nginx下載時修改伺服器檔案有什麼後果?

看來,在 Nginx 伺服器上,修改正在下載的檔案的內容可能會導致客戶端的檔案損壞且不一致。這是我的實驗:

我在本地網路中建立了一個Nginx伺服器,上面有一個1M的文件,其中填充了「a」。我使用curl將這個檔案下載到我的電腦(並且速度被限制得足夠慢)。在下載期間,我用另一個大小相同但填充“b”的檔案覆蓋伺服器上的這個檔案。我使用 Linux 命令“cp”執行此步驟,沒有發生錯誤。最後,當我檢查下載的結果時,發現它是一個混合文件,第一部分是“a”,第二部分是“b”,如下所示:“aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”

我想知道這是否是預期的結果。如果是這樣,有沒有辦法告訴 Nginx 在仍然存在活動連接時拒絕任何 IO 操作,或者只是返回錯誤代碼並在文件更改後中止連接?由於更新檔案可能是伺服器上非常常見的操作,因此我想應該有一些解決方法。

我的測試環境:

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

答案1

讀取正在被覆蓋的檔案將產生不可預測的結果。

將修改寫入暫存位置(在同一檔案系統上)並重新命名 ( mv) 暫存檔案以取代目前版本,您將獲得更可預測的結果。重新命名檔案是原子的且即時的。

如果您的網頁伺服器在您重新命名檔案時(仍在)讀取和傳輸舊版本,它將繼續從舊版本開始執行此操作,直到下載完成,但對該檔案的任何新請求都將取得新版本。

相關內容