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
수정 사항을 임시 위치(동일한 파일 시스템의)에 기록하고 임시 파일의 이름을 변경( )하여 현재 버전을 바꾸면 훨씬 더 예측 가능한 결과를 얻을 수 있습니다 . 파일 이름 바꾸기는 원자적이고 즉각적입니다.
파일 이름을 바꿀 때 웹 서버가 (여전히) 이전 버전을 읽고 전송하고 있었다면 다운로드가 완료될 때까지 이전 버전에서 계속 읽기를 수행하지만 해당 파일에 대한 새로운 요청은 새 버전을 받게 됩니다.