web-dev-qa-db-ja.com

Nginx(開発用)で静的ファイルを提供するときにキャッシュを無効にする

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)にアクセスする場合、問題はありません。サーバーはコード304変更されていませんファイルが変更されていない限り、変更された200 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

編集
expiresディレクティブとCache-Controlheader、さらに調査を行いました。実際、サーバーはVirtualBoxゲストUbuntuにインストールされ、データはMac OSXホスト上の共有フォルダーから読み取られます。
ホスト上のIDE(NetBeans))からファイルを編集した場合、変更が表示されないようですが、ゲスト(VIMを使用)で直接編集した場合、リフレッシュされます。
奇妙なことは、HTMLファイルと同様に動作しないことです。
かなり不可解です。

編集2(ANSWER)
確かに、問題の原因はVirtualBox側にありました。または、VirtualBoxとサーバーの「sendfile」オプションの間の競合。
このリンク VirtualBox Hates Sendfile は私に解決策を与えました:サーバー構成のsendfileフラグをoff

sendfile  off;

これが開発のためにVirtualBoxを使用する他の人にも役立つことを願っています。 :)
VirtualBoxフォーラム にいくつかの追加情報があります。

89
Olivier Chappe

答えはどういうわけか質問に隠されているので-これはスタンドアロンの答えとしてのVirtualBox環境でのnginxの解決策です。

Nginx設定(通常/etc/nginx/nginx.conf)またはvhost設定ファイルで、sendfileパラメータをoffに変更します。

sendfile  off;

sendfileはNginxの名声の中心にありますが(非常に高速な低レベルの静的ファイルの提供効率)、ローカル開発にとって悩みの種になる可能性があります。頻繁に変化し、リロードが必要なJavaScript。それにもかかわらず、Nginx sendfileは賢く、おそらくほとんどの人の問題ではありません。ブラウザの「キャッシュを無効にする」オプションもチェックしてください!

57
lorem monkey

有効期限タグを

expires off;

また、expiresヘッダーをまったく設定しないでください。ブラウザーのファイルを誤ってキャッシュしている可能性もあります。

15
anthonysomerset

上記のいずれも役に立たず、それでもNginxがファイルの古いコンテンツを返す場合は、open_file_cacheに関連する問題である可能性があります。

参照として参照してください:

2
k2s

これはVirtualBoxの古いバグです(参照: #819#9069#12597#1492 )ここでvboxvfsには、同期されるファイルへのmmappedアクセスに関するいくつかの問題があるようです。

これは、VMの外部でファイルを編集し、VM内で同じ変更が発生すると予想される場合に発生する可能性があります。

この問題を回避するには、 EnableSendfile option を無効にして、カーネルsendfileサポートを無効にして、ファイルをクライアントに配信する必要があります。これは、特にNFSまたはSMBマウントされたファイルの問題です。

For Nginxnginx.confで変更)、たとえば.

sendfile off;

Apache(httpd.confまたはvhostsファイル内)でも同様です。

<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はエントリとiノードを表し、3はページキャッシュ、エントリとiノードを表します。


上記の問題は、次のmmap-testプログラムで再現できます。 mmap-problem.c を参照してください。

2
kenorb

これは遅いですが、未回答とマークされているので、刺します。クスクス笑うために、あなたは試しましたか?

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

私自身はこれを試していませんが、サーバーコンテナーでNginxを使用してこのようなことを試すことを学びました。

1
ColtonCat