Edited at

Apache/Nginx のドキュメントルートを vboxsf にしてるとデータが壊れるのを何とかしたい

More than 3 years have passed since last update.

Vagrant やらで Virtualbox の共有フォルダを Apache や Nginx の ドキュメントルートに設定していると、

ホスト側からファイルに更新をかけたタイミングで、ゲスト側から見えるデータに謎データが付いたり、

データが欠けたりすることで、PHPが動かなくなったり、HTMLやCSSが崩れたり。

しかもこの状態になるとVMを上げ下げしないと解消せず、開発環境としては非常に困る場面があります。

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


Apache の場合

サーバー設定ファイル、設定中の VirtualHost ディレクティブ、Directory ディレクティブ の

必要な箇所で下記を指定します。許可されていれば .htaccess でも指定が可能です。


httpd.conf

EnableSendfile off



:book: 参考ページ


Nginx の場合

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


nginx.conf

sendfile off;



:book: 参考ページ


Sendfile とは何者なのか?

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

ザックリと言うと Apache や Nginx では OS(Linuxの場合はKernel)がサポートする場合は、

sendfileという機能を使って、例えば 純粋なHTMLやCSS、画像などの静的ファイルへのアクセスなど、

OS判断で不要な場合は、ファイル読み込みをスキップし、OSでキャッシュしているデータを読むといった、

ファイルキャッシュ機能を提供してくれているらしい。

本来であればこれがうまく働くことでパフォーマンスが上がるはずだけども、

vboxsf を使っている場合は、共有フォルダ内の「ファイルの更新がかかった!」という通知が

うまく行かない場合があるらしく、おかしな状況になってしまうというわけのようである。