VirtualBox で HTTP サーバーを立ててアレコレしてたときにファイルが更新されない謎現象に悩まされた話。

header

Vagrant やらで Virtualbox の共有フォルダを Apache や Nginx の ドキュメントルートに設定していると、 ホスト側からファイルに更新をかけたタイミングで、ゲスト側から見えるデータに謎データが付いたり、 データが欠けたりすることで、PHPが動かなくなったり、HTMLやCSSが崩れたり。 しかもこの状態になるとVMを上げ下げしないと解消せず、開発環境としては非常に困る場面があります。

この現象はそれぞれのソフトウェアの設定により回避できます。

Apache の場合

サーバー設定ファイル、設定中の VirtualHost ディレクティブ、Directory ディレクティブ の 必要な箇所で下記を指定します。許可されていれば .htaccess でも指定が可能です。

EnableSendfile off

Nginx の場合

Nginx の場合は、http、server、location のいずれかの必要な箇所で下記を指定します。

sendfile off;

Sendfile とは何者なのか?

カーネルの機能の1つ。「ファイルディスクリプタ間でデータを転送する機能」らしい。。

ザックリと言うと Apache や Nginx では OS(Linuxの場合はKernel)がサポートする場合は、 sendfileという機能を使って、例えば 純粋なHTMLやCSS、画像などの静的ファイルへのアクセスなど、 OS判断で不要な場合は、ファイル読み込みをスキップし、OSでキャッシュしているデータを読むといった、 ファイルキャッシュ機能を提供してくれているらしい。

本来であればこれがうまく働くことでパフォーマンスが上がるはずだけども、 vboxsf を使っている場合は、共有フォルダ内の「ファイルの更新がかかった!」という通知が うまく行かない場合があるらしく、おかしな状況になってしまうというわけのようである。


関連リンク