Nginx에서 다운로드하는 동안 서버 파일을 수정하면 어떤 결과가 발생합니까?

Nginx에서 다운로드하는 동안 서버 파일을 수정하면 어떤 결과가 발생합니까?

Nginx 서버에서 다운로드 중인 파일의 내용을 수정하면 클라이언트 측에서 파일이 손상되고 일관성이 없는 결과를 초래할 수 있는 것 같습니다. 내 실험은 다음과 같습니다.

로컬 네트워크에 Nginx 서버를 구축했는데, 거기에 'a'로 채워진 1M 파일이 있습니다. 나는 컬을 사용하여 내 컴퓨터에 이 파일을 다운로드합니다(그리고 속도는 충분히 느리게 제한됩니다). 다운로드 기간 동안 서버에 있는 이 파일을 같은 크기이지만 'b'로 채워진 다른 파일로 덮어씁니다. Linux 명령 'cp'를 사용하여 이 단계를 수행했는데 오류가 발생하지 않았습니다. 마지막으로, 다운로드한 결과를 확인해 보니 다음과 같이 첫 번째 부분에 'a'가 있고 두 번째 부분에 'b'가 있는 혼합 파일인 것으로 나타났습니다. "aaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

예상했던 결과인지 궁금합니다. 그렇다면 여전히 활성 연결이 있을 때 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수정 사항을 임시 위치(동일한 파일 시스템의)에 기록하고 임시 파일의 이름을 변경( )하여 현재 버전을 바꾸면 훨씬 더 예측 가능한 결과를 얻을 수 있습니다 . 파일 이름 바꾸기는 원자적이고 즉각적입니다.

파일 이름을 바꿀 때 웹 서버가 (여전히) 이전 버전을 읽고 전송하고 있었다면 다운로드가 완료될 때까지 이전 버전에서 계속 읽기를 수행하지만 해당 파일에 대한 새로운 요청은 새 버전을 받게 됩니다.

관련 정보