Vagrant やらで Virtualbox の共有フォルダを Apache や Nginx の ドキュメントルートに設定していると、
ホスト側からファイルに更新をかけたタイミングで、ゲスト側から見えるデータに謎データが付いたり、
データが欠けたりすることで、PHPが動かなくなったり、HTMLやCSSが崩れたり。
しかもこの状態になるとVMを上げ下げしないと解消せず、開発環境としては非常に困る場面があります。
この現象はそれぞれのソフトウェアの設定により回避できます。
Apache の場合
サーバー設定ファイル、設定中の VirtualHost ディレクティブ、Directory ディレクティブ の
必要な箇所で下記を指定します。許可されていれば .htaccess でも指定が可能です。
EnableSendfile off
参考ページ
Nginx の場合
Nginx の場合は、http、server、location のいずれかの必要な箇所で下記を指定します。
sendfile off;
参考ページ
- http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile
- http://smotko.si/nginx-static-file-problem/
Sendfile とは何者なのか?
カーネルの機能の1つ。「ファイルディスクリプタ間でデータを転送する機能」らしい。。
ザックリと言うと Apache や Nginx では OS(Linuxの場合はKernel)がサポートする場合は、
sendfileという機能を使って、例えば 純粋なHTMLやCSS、画像などの静的ファイルへのアクセスなど、
OS判断で不要な場合は、ファイル読み込みをスキップし、OSでキャッシュしているデータを読むといった、
ファイルキャッシュ機能を提供してくれているらしい。
本来であればこれがうまく働くことでパフォーマンスが上がるはずだけども、
vboxsf を使っている場合は、共有フォルダ内の「ファイルの更新がかかった!」という通知が
うまく行かない場合があるらしく、おかしな状況になってしまうというわけのようである。