Vagrant CSS, JS, HTML などの静的ファイルの更新が反映されない時の対処方法
エラー内容
CSS, JS, HTML などの静的ファイルを変更しても変更分が反映されない。
ブラウザキャッシュの影響ではなさそう。
ページキャッシュなどもしていない。
直し方
Web サーバのconfファイルにて、sendfile を使用しない設定に変更して Vagrant を再起動する。
- Webサーバの設定を変更して
- Vagrant を再起動する。
1. Webサーバの設定変更
apache
<Directory [対象のディレクトリ]> ・・・・ EnableSendfile Off ・・・・ </Directory>
nginx
http { ・・・・ sendfile off; ・・・・ }
2. Vagrant の再起動
$ vagrant reload
原因
Linux の sendfile機能が原因。
sendfileでは、通常はキャッシュされたファイルが更新された場合、更新を検知して再読み込みを行う。
しかし、NFS での外部ストレージ上のファイルの場合、正しく更新を検知できない時がある。
Virtualboxの Synced Folder (フォルダマウント機能)は NFS 扱いになるため、
今回のようなエラーが起こることがある。
調べてみると公式の Vagrant ドキュメントにもちゃんと書いてあった。
There is a VirtualBox bug related to sendfile which can result in corrupted or non-updating files. You should deactivate sendfile in any web servers you may be running.
In Nginx:
sendfile off;
In Apache:
EnableSendfile Off
※ sendfileとは
静的ファイルをカーネルにキャッシュする Linux の機能。
sndfile ディレクティブが有効の時、Webサーバは sendfile()API を使いカーネルにキャッシュしているデータを送信する。
まとめ
Vagrant を使用するときは、Webサーバ側で sendfile機能を切っておきましょう、というお話。
参考
vagrant 初心者におすすめの本はこちら
- 作者: 新原雅司
- 出版社/メーカー: 技術評論社
- 発売日: 2013/09/12
- メディア: Kindle版
- この商品を含むブログ (5件) を見る
vagrant を深く知りたい方におすすめ
- 作者: Mitchell Hashimoto,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/02/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (10件) を見る