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

編集ディレクティブとヘッダーで
さまざまな設定を試した後、さらに調査を行いました。実際、サーバーは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
vagrant vmでnginxを実行していて、共有fsを使用していますか?#nginxでその組み合わせを使用した症状の報告がいくつかありました。
コルビージャック

3
私は文字通りあなたを抱きしめることができました!! この正確な問題に48時間の呪いと完全な狂気を費やしました.ngginxを数回再コンパイルし、いくつかの小さなふわふわの生き物を各種の神々に捧げ、キャッシュディレクティブを後方に学習しました... VirtualBoxが変なおかげで!
ジェームズバトラー

13
回答を回答として投稿し、受け入れて、誰もがこの問題が解決されたことを確認できるようにすると、より明確になります。
ゾンバヤ

今朝、このバグに見舞われました。これがないと、共有フォルダが原因であることに気付かなかったでしょう。ありがとう!
JaffaTheCake

どうも!私が理解しているように、今のところこのバグを修正する他の方法はありませんか?sendfileを有効にする必要がある場合はどうすればよいですか?:
Dmitry Belaventsev

回答:


57

答えは質問に何らかの形で隠されているため、スタンドアロンの答えとしてVirtualBox環境でのnginxのソリューションがあります。

nginx構成(通常は/etc/nginx/nginx.conf)またはvhost構成ファイルでsendfileパラメーターをoff次のように変更します。

sendfile  off;

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


5
ただし、答えは、参照を探している質問を見つけたり、読み直したりするよう読者に効果的に任せる代わりに、なぜそれが必要なのを説明する必要があります。答えはそれ自身の上に立って->より良くしてください。
AD7six 14年

2
これが私の答えのようです。この問題は、Sendfile、VirtualBox、OSXホストの特定の組み合わせで発生するようです。abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
スティーブベネット

sendfileローカル開発環境でも問題ありません。壊れているのはVirtualBoxだけです。これは(多くの)1つの理由です。VirtualBoxを避けることをお勧めします...
マイケルハンプトン

Vagrant / VirtualBox / Ubuntu / Wordpressの保存、奇妙な問題のおかげで、デフォルトでsendfileをオンにしてPROD環境が安全であると推測しています。
sonjz

nginxと
dockerで

15

期限切れタグを

expires off;

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


残念ながら、私もこれを試しましたがexpires -1、動作はまだ同じです。
オリビエチャップ

ブラウザに関して、私はこの可能性を考えました:私は最初にChromeで試していました、そしてファイルを修正した後、Firefoxで初めてそれを開きました:私はまだファイルの最初のバージョンを得ました。
オリビエチャップ

また、キャッシュ制御ヘッダーはおそらくCACHE-CONTROL:NO-CACHEである必要があります
-anthonysomerset

または、キャッシュ制御ヘッダーを完全に削除します-以前のコメントを編集できません
でした-anthonysomerset

1
Windowsでは、「期限切れ」はまだhtmlファイルのキャッシュを無効にしません。IDEでファイルを更新すると非常にイライラしますが、!$#%ing nginxは古いバージョンを提供します。
ダンダスカレスク14年


2

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

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

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

以下のためNginx(の変化nginx.conf)、例えば

sendfile off;

Apache(httpd.confvhostsファイル内または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


1

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

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

自分でこれを試したことはありませんが、サーバーコンテナーでNginxを使用してこの種のことを試すことを学びました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.