Nginx로 정적 파일을 제공 할 때 캐싱 비활성화 (개발 용) ( http : //static.server.local/test.html )에 액세스

우리는 개발 플랫폼에서 정적 파일을 제공하기 위해 Nginx를 사용하고 있습니다. 개발 플랫폼이므로 캐싱을 비활성화하여 각 변경 사항이 서버에 전파되도록합니다. VHost의 구성은 매우 간단합니다.

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  }
}

HTML 파일 ( http : //static.server.local/test.html )에 액세스 할 때 문제가 없습니다. 파일이 변경되지 않는 한 서버는 수정되지 않은 코드 304200 OK 응답을 반환합니다. 파일이 변경 될 때 수정 된 파일
그러나 Javascript 또는 CSS 파일에서는 다르게 동작하는 것 같습니다. 파일이 변경되면 예상대로 200 OK 응답이 표시되지만 이전 텍스트가 표시됩니다.
Nginx에이 동작을 설명 할 수있는 내부 캐시 메커니즘이 있습니까? 아니면 추가해야 할 구성이 있습니까?

참고로, 파일이 수정되었을 때 Nginx가 반환 한 헤더는 다음과 같습니다 (올바르게 보입니다).

Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54

편집 지시문과 헤더로
다른 설정을 시도한 후 추가 조사를 수행했습니다. 실제로 서버는 VirtualBox 게스트 Ubuntu에 설치되며 Mac OSX 호스트에있는 공유 폴더에서 데이터를 읽습니다.
호스트의 IDE (NetBeans)에서 파일을 편집하면 변경 사항이 나타나지 않지만 게스트에서 직접 편집하면 (VIM 사용) 새로 고쳐집니다.
이상한 점은 HTML 파일과 비슷하게 동작하지 않는다는 것입니다.
꽤 수수께끼입니다.expiresCache-Control

편집 2 (ANSWER)
실제로, 문제의 원인은 VirtualBox쪽에 있습니다. 또는 VirtualBox와 서버의 “sendfile”옵션간에 충돌이 발생합니다.
VirtualBox Hates Sendfile 링크 는 솔루션을 제공합니다. 서버 구성에서 sendfile 플래그를 off로 전환하십시오 .

sendfile  off;

이것이 VirtualBox를 개발에 사용하는 다른 사람에게도 도움이되기를 바랍니다. 🙂 VirtualBox 포럼
에 대한 추가 정보가 있습니다 .



답변

대답은 어떻게 든 질문에 숨겨져 있으므로 VirtualBox 환경의 독립형 답변으로 nginx에 대한 솔루션이 있습니다.

nginx 설정 (일반적으로 /etc/nginx/nginx.conf) 또는 vhost 설정 파일에서 sendfile매개 변수를 off다음으로 변경하십시오 .

sendfile  off;

동안은 sendfileNginx와의 명성의 핵심입니다 (타오르는 빠른 낮은 수준의 정적 파일 제공하는 효율)이 자주 변경하고 필요 Javascript를 다시로드 할 수있는 지역 개발을위한 베인, 예를 들면 수 있습니다. 그럼에도 불구하고 Nginx sendfile은 영리하며 아마도 대부분의 사람들의 문제가 아닐 것입니다. 브라우저의 “캐시 비활성화”옵션도 확인하십시오!


답변

만기 태그를로 설정하십시오.

expires off;

만료 헤더를 전혀 설정하지 않아야하며 브라우저 캐싱 파일이 잘못 될 수도 있습니다


답변

위에서 언급 한 내용이 도움이되었지만 여전히 Nginx가 파일의 오래된 내용을 반환하는 경우 관련 문제 일 수 있습니다 open_file_cache.

참조로 참조하십시오 :


답변

이것은 vboxvfs 가 동기화 된 파일에 대한 mmapped 액세스에 문제가있는 것처럼 보이는 VirtualBox의 오래된 버그입니다 ( # 819 , # 9069 , # 12597 , # 14920 참조 ).

VM 외부에서 파일을 편집 할 때 발생할 수 있으며 VM 내에서 동일한 변경 사항이 나타날 것으로 예상됩니다.

이 문제를 해결하려면 EnableSendfile옵션 옵션 을 비활성화하여 커널 전송 파일 지원을 비활성화하여 파일을 클라이언트에 전달해야합니다 . 이는 NFS 또는 SMB 마운트 파일의 경우 특히 문제가됩니다.

예를 들어Nginx (에서 변경 nginx.conf)

sendfile off;

Apache ( httpd.confvhosts 파일 내부 또는 파일)와 유사합니다 . 예 :

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

변경 후 Apache를 다시로드하십시오.


다른 잠재적 인 해결책은 호스트의 파일을 편집하지 말고 동일한 파일을 VM 내에서 다시 편집하려고 시도하는 것입니다.


또 다른 해결 방법은 Linux 페이지 캐시를 삭제하는 것입니다.

echo 1 > /proc/sys/vm/drop_caches

또는 매초마다 ( 이 게시물에 따라 ) 캐시를 지우려면 다음을 시도하십시오.

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

참고 : 숫자 1은 페이지 캐시 해제, 2는 덴 트리 및 inode, 3은 페이지 캐시, 덴 트리 및 inode를 나타냅니다.


위의 문제는 다음 mmap-test 프로그램으로 복제 할 수 있습니다 mmap-problem.c.


답변

아직 늦었지만 아직 답이없는 것으로 표시되어 찌를 것입니다. 낄낄 거림을 위해 다음을 시도해 보셨습니까?

location ~* \.(css|js)$ {
    expires 0;
    break;
}

이것을 직접 시도하지는 않았지만 때때로 이와 비슷한 문제가있을 때 서버 컨테이너에서 Nginx로 이런 종류의 것을 시도하는 법을 배웠습니다 …


답변