Parece que, no servidor Nginx, modificar o conteúdo de um arquivo que está sendo baixado pode resultar em um arquivo corrompido e inconsistente no final do cliente. Aqui está meu experimento:
Construí um servidor Nginx em uma rede local e nele há um arquivo de 1M preenchido com 'a'. Eu baixei esse arquivo no meu computador usando curl (e a velocidade é limitada o suficiente). Durante o período de download, sobrescrevo esse arquivo no servidor por outro arquivo do mesmo tamanho, mas preenchido com 'b'. Fiz esta etapa usando o comando 'cp' do Linux e nenhum erro ocorreu. Finalmente, quando verifico o resultado baixado, ele é um arquivo misto com 'a's na primeira parte e 'b's na segunda parte, assim: "aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
Estou me perguntando se essa é a consequência esperada. E se sim, existe uma maneira de dizer ao Nginx para rejeitar qualquer operação de IO quando ainda houver conexões ativas ou simplesmente retornar um código de erro e abortar a conexão após a alteração do arquivo? Como a atualização de arquivos pode ser uma operação muito comum no servidor, imagino que deva haver algumas soluções alternativas.
Meu ambiente de testes:
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
Responder1
A leitura de um arquivo que está sendo sobrescrito terá resultados imprevisíveis.
Você obterá resultados muito mais previsíveis gravando suas modificações em um local temporário (no mesmo sistema de arquivos) e renomeando ( mv
) o arquivo temporário para substituir a versão atual. Renomear arquivos é atômico e instantâneo.
Se o seu servidor web (ainda) estava lendo e transmitindo a versão antiga quando você renomeou um arquivo, ele continuará fazendo isso a partir dessa versão antiga até que o download seja concluído, mas quaisquer novas solicitações para esse arquivo receberão a nova versão.