Каковы последствия изменения файла сервера во время загрузки на Nginx?

Каковы последствия изменения файла сервера во время загрузки на Nginx?

It seems that, on Nginx server, modifying the content of a file being downloaded could result in a broken and inconsistent file at the client end. Here's my experiment:

I built a Nginx server in a local network, and on that, there is a 1M file filling with 'a'. I download this file on my computer using curl (and the speed is limited slow enough). During the period of downloading, I overwrite this file on the server with another file with the same size but filled with 'b'. I did this step using Linux command 'cp' and no error occurs. Finally, when I check the downloaded result, it turns out to be a mixed file with 'a's at the first part and 'b's at the second part, like this way: "aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

Мне интересно, является ли это ожидаемым последствием. И если да, есть ли способ сказать Nginx отклонять любые операции ввода-вывода, когда все еще есть активные соединения, или просто возвращать код ошибки и прерывать соединение после изменения файла? Поскольку обновление файлов может быть очень распространенной операцией на сервере, я думаю, должны быть какие-то обходные пути.

Моя тестовая среда:

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) временный файл, чтобы заменить текущую версию. Переименование файлов происходит атомарно и мгновенно.

Если ваш веб-сервер (все еще) считывал и передавал старую версию, когда вы переименовывали файл, он продолжит делать это с этой старой версии до тех пор, пока загрузка не будет завершена, но все новые запросы к этому файлу будут получать новую версию.

Связанный контент