Nginx로 정적 파일을 제공 할 때 캐싱 비활성화 (개발 용)


89

우리는 개발 플랫폼에서 정적 파일을 제공하기 위해 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 포럼
에 대한 추가 정보가 있습니다 .


3
방대한 VM에서 nginx를 실행하고 공유 fs를 사용하고 있습니까? #nginx에서 해당 조합을 사용하여 증상이보고되었습니다.
kolbyjack 2016 년

3
말 그대로 널 안아줄 수있어 !! 48 시간 동안 저주를하고이 정확한 문제로 완전히 화를 냈다. nginx를 몇 차례 재 컴파일하고, 작은 솜털 생물을 여러 신에게 희생 시켰으며, 캐시 지시문을 거꾸로 배웠다. VirtualBox 덕분에 이상합니다!
James Butler

13
답변을 답변으로 게시하고 수락하면 모든 사람이이 문제가 해결되었음을 확인할 수 있습니다.
Zombaya 2016 년

오늘 아침이 버그에 맞았습니다. 이것이 없으면 공유 폴더로 내려간 것을 알지 못했을 것입니다. 감사!
JaffaTheCake

고마워! 이해하지만 현재로서는이 버그를 수정하는 다른 방법이 있습니까? 내가 sendfile을 활성화 할 필요하면 어떻게 :-)?
드미트리 Belaventsev

답변:


57

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

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

sendfile  off;

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


5
+1은 대답이 독자가 참고 문헌을 찾고 질문을 찾거나 다시 읽도록 효과적으로 떠나는 대신 필요한지 설명해야합니다 . 답변을 독자적으로 세우십시오-> 더 좋습니다.
AD7six

2
이것은 나에게 답이 될 것 같습니다. Sendfile, VirtualBox 및 OSX 호스트의 특정 조합에서 문제가 발생하는 것 같습니다. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
Steve Bennett

sendfile로컬 개발 환경에도 적합합니다. 그것은 깨진 단지 VirtualBox입니다. 내가 VirtualBox를 피하는 것이 좋습니다 이유 중 하나입니다 ...
Michael Hampton

Vagrant / VirtualBox / Ubuntu / Wordpress의 저장, 이상한 문제 덕분에 기본적으로 sendfile을 사용하여 PROD 환경이 안전하다고 생각합니다.
sonjz 2016 년

nginx와 docker로 내 문제를 해결
PascalTurbo

15

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

expires off;

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


불행히도, 나는 이것을 시도했지만 expires -1행동은 여전히 ​​동일합니다.
Olivier Chappe

브라우저와 관련하여 다음과 같은 가능성을 생각했습니다 .Chrome을 처음 사용하고 파일을 수정 한 후 Firefox에서 처음으로 파일을 열었습니다. 여전히 파일의 첫 번째 버전을 얻었습니다.
Olivier Chappe

또한 캐시 제어 헤더는 아마도 CACHE-CONTROL : NO-CACHE
anthonysomerset

또는 캐시 제어 헤더를 모두 제거-죄송합니다 이전 의견 수정
anthonysomerset

1
Windows에서 "만료"는 여전히 html 파일 캐싱을 비활성화하지 않습니다. IDE에서 파일을 업데이트 할 때 매우 실망 스럽지만! $ # % ing nginx는 이전 버전을 제공합니다.
Dan Dascalescu


2

이것은 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.


1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.