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

  • 12
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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 を使っている場合は、共有フォルダ内の「ファイルの更新がかかった!」という通知が
うまく行かない場合があるらしく、おかしな状況になってしまうというわけのようである。