Nginx サーバーでは、ダウンロード中のファイルの内容を変更すると、クライアント側でファイルが破損したり、一貫性がなくなったりする可能性があるようです。私の実験は次のとおりです。
ローカル ネットワークに Nginx サーバーを構築しましたが、そこには 'a' で埋め尽くされた 1M のファイルがあります。curl を使用してこのファイルをコンピューターにダウンロードします (速度は十分に遅く制限されています)。ダウンロード中に、サーバー上のこのファイルを、同じサイズで 'b' で埋め尽くされた別のファイルで上書きします。この手順は Linux コマンド 'cp' を使用して実行しましたが、エラーは発生しませんでした。最後に、ダウンロードした結果を確認すると、最初の部分が 'a'、2 番目の部分が 'b' の混合ファイルであることがわかりました。次のようになります: "aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
これは予想通りの結果なのだろうかと思っています。もしそうなら、アクティブな接続がまだあるときに 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
。ファイルの名前変更はアトミックかつ瞬時に行われます。
ファイル名を変更したときに Web サーバーが (まだ) 古いバージョンの読み取りと送信を行っていた場合、ダウンロードが完了するまでその古いバージョンからの読み取りと送信が継続されますが、そのファイルに対する新しい要求では新しいバージョンが取得されます。