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-Control
header、さらに調査を行いました。実際、サーバーはVirtualBoxゲストUbuntuにインストールされ、データはMac OSXホスト上の共有フォルダーから読み取られます。
ホスト上のIDE(NetBeans))からファイルを編集した場合、変更が表示されないようですが、ゲスト(VIMを使用)で直接編集した場合、リフレッシュされます。
奇妙なことは、HTMLファイルと同様に動作しないことです。
かなり不可解です。
編集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;
sendfile
はNginxの名声の中心にありますが(非常に高速な低レベルの静的ファイルの提供効率)、ローカル開発にとって悩みの種になる可能性があります。頻繁に変化し、リロードが必要なJavaScript。それにもかかわらず、Nginx sendfileは賢く、おそらくほとんどの人の問題ではありません。ブラウザの「キャッシュを無効にする」オプションもチェックしてください!
有効期限タグを
expires off;
また、expiresヘッダーをまったく設定しないでください。ブラウザーのファイルを誤ってキャッシュしている可能性もあります。
上記のいずれも役に立たず、それでもNginxがファイルの古いコンテンツを返す場合は、open_file_cache
に関連する問題である可能性があります。
参照として参照してください:
これはVirtualBoxの古いバグです(参照: #819 、 #9069 、 #12597 、 #1492 )ここでvboxvfsには、同期されるファイルへのmmappedアクセスに関するいくつかの問題があるようです。
これは、VMの外部でファイルを編集し、VM内で同じ変更が発生すると予想される場合に発生する可能性があります。
この問題を回避するには、 EnableSendfile
option を無効にして、カーネルsendfileサポートを無効にして、ファイルをクライアントに配信する必要があります。これは、特にNFSまたはSMBマウントされたファイルの問題です。
For Nginx
(nginx.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
を参照してください。
これは遅いですが、未回答とマークされているので、刺します。クスクス笑うために、あなたは試しましたか?
location ~* \.(css|js)$ {
expires 0;
break;
}
私自身はこれを試していませんが、サーバーコンテナーでNginxを使用してこのようなことを試すことを学びました。