web-dev-qa-db-ja.com

Vagrant / VirtualBox / Apache2の奇妙なキャッシュの動作

Vagrantを使用して、Apache2でUbuntu搭載のVirtualBoxを実行しています。

Webサーバーは、とりわけ、/ vagrantディレクトリから静的ファイルを提供します。

これはほとんどの場合うまく機能します。しかし、共有フォルダーの画像を変更してWebサイトをリロードすると、前のバージョンの画像が提供されますが、切り捨てられます。

最初に共有フォルダーから古い画像を削除し、画像が表示されないようにWebサイトを更新してから、新しいファイルを保存してWebサイトを再度リロードすると動作します。

誰もがこの問題を知っていますか?特別なものは何もインストールされていません。Apache2にはmod_rewriteがあり、PHPにはMongo、APCプラグイン、MongoDBがあり、nodeJSにはたくさんのスクリプトがあります。

64
Philipp Spiess

答えを見つけました こちら

JC、

静的ファイルを提供しているサーバーが「sendfile()」syscallを使用していることが原因であると考えられますが、これはVirtualBoxファイルシステムで壊れています。サーバーでsendfile()の使用を無効にする必要があります。 Apacheの場合:

EnableSendfile off

Nginxの場合:sendfile off;

ベスト、ミッチェル

133
Philipp Spiess

これは私を夢中にさせています!このPhilippを投稿していただきありがとうございます。構成ファイルを変更する方法がわからない人のために、私がやったことは次のとおりです。

ファイルを見つけるには:$ Sudo find -name "nginx.conf"

私のものはここにありました:./etc/nginx/nginx.conf

それを修正するためにこれを実行しました:$ Sudo nano ./etc/nginx/nginx.conf

sendfile on;を含む行をsendfile off;に変更します

exitvagrant reloadを忘れないでください!

8
Kenzo

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

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

この問題を回避するには、httpd.confまたはvhostsファイルなどで EnableSendfile option を無効にして、クライアントにファイルを配信するカーネルsendfileサポートを無効にする必要があります。

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

これは特にNFSまたはSMBマウントされたファイルの問題です。変更後、Apacheをリロードします。

Nginxに類似nginx.confで)、例えば.

sendfile off;

他の回避策は、ホスト上のファイルを編集しないことを覚えておくか、同じファイルをVM内で再編集することです。


別の回避策には、Linuxページキャッシュの削除が含まれます。

echo 1 > /proc/sys/vm/drop_caches

または、キャッシュを毎秒クリアするには( this post に従って)、試してください:

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

注:番号1はページキャッシュの解放、2は歯とiノード、3はページキャッシュ、歯とiノードの解放を表します。


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

6
kenorb

VirtualBox/Docker/Nginx環境にも同様の問題があります。

Linuxページキャッシュの削除に関する決定echo 1 > /proc/sys/vm/drop_caches正常に動作しますが、見苦しいです。

ディレクティブsendfile off; の中に nginx.confは問題を解決しなかったので、expires off;ディレクティブが一緒になり、成功しました。

だから、私の決定は次のようになります

sendfile off;
expires off;

Laravel 5、gulp.watchを介したBarryvdhのDebugbarおよびbrowserSyncを使用している場合、このエラーが発生する可能性があります。開発サーバー経由: http://127.0.0.1:3000/laravel/page エラーが表示されました http://127.0.0.1/laravel/page エラーが発生しました。

BrowserSyncで友人とフラグを立てました。彼らは素晴らしい仕事をしています。したがって、それは解決策というよりも理由ですが、それを修正しようと何時間も費やすのではなく、これがあなたの問題であるかどうかをテストしてから時間を無駄にします。

この問題は この記事で見つかったエラー にも似ています

3
CDO

これは、CentOS/VirtualBoxセットアップのCSSファイルに関する奇妙な動作の原因でもありました。

/ vagrantフォルダー内のCSSファイルの内容を変更すると、ブラウザーのステータスが(304ではなく)200になります。これは、ファイルが新しいことを認識したことを意味します。ただし、内容は変更されていません。

0
Reverend Pete