Parece que, en el servidor Nginx, modificar el contenido de un archivo que se está descargando podría generar un archivo roto e inconsistente en el lado del cliente. Aquí está mi experimento:
Construí un servidor Nginx en una red local, y en él, hay un archivo de 1M lleno de 'a'. Descargo este archivo en mi computadora usando curl (y la velocidad es bastante lenta). Durante el período de descarga, sobrescribo este archivo en el servidor con otro archivo del mismo tamaño pero lleno de 'b'. Hice este paso usando el comando 'cp' de Linux y no ocurre ningún error. 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"
Me pregunto si es la consecuencia esperada. Y si es así, ¿hay alguna manera de decirle a Nginx que rechace cualquier operación de IO cuando todavía hay conexiones activas, o simplemente devolver un código de error y cancelar la conexión después de que el archivo haya cambiado? Dado que actualizar archivos puede ser una operación muy común en el servidor, imagino que debería haber algunas soluciones.
Mi entorno de prueba:
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
Respuesta1
Leer un archivo que se está sobrescribiendo tendrá resultados impredecibles.
Obtendrá resultados mucho más predecibles si escribe sus modificaciones en una ubicación temporal (en el mismo sistema de archivos) y cambia el nombre ( mv
) del archivo temporal para reemplazar la versión actual. Cambiar el nombre de los archivos es atómico e instantáneo.
Si su servidor web (todavía) estaba leyendo y transmitiendo la versión anterior cuando cambia el nombre de un archivo, continuará haciéndolo desde esa versión anterior hasta que se complete la descarga, pero cualquier solicitud nueva para ese archivo obtendrá la nueva versión.