SEEDS Creator's Blog

読者です 読者をやめる 読者になる 読者になる

VagrantやVirtualBoxの共有フォルダ機能で静的ファイルが更新されない

Apache プログラミング

VagrantVirtualBoxの共有ディレクトリ機能を使っていた時に起こった問題です。

VagrantVirtualBoxの共有ディレクトリ機能を使っていて、さらそのマウントポイントをApacheのドキュメントルートとしている場合、静的ファイルの更新が反映されない(バグる)問題の対応方法。 結論から言えばApacheが問題で以下の設定を追加すればOKでした。

<Directory /path/to/public_html>
  EnableMMAP Off
  EnableSendfile Off
</Directory>

(参考) Virtualbox上のApacheでホストマシンと共有している静的ファイル(CSSなど)の更新が検知されない問題を解決する方法

開発環境

VirtualBoxで作成した仮想のLinuxサーバーを開発環境としています。 FTPとかSCPで何度もアップロードするのは面倒だった為、VirtualBoxの共有フォルダ機能を使っています。VirtualBoxの共有フォルダ機能は、ホストOS側の任意のディレクトリを、ゲストOS側でマウントする事ができるようになる機能です。この機能を利用してIDEのプロジェクトディレクトリを共有し、ゲストOSのApacheのドキュメントルートとする事で開発を進めていました。ホストOSがゲストOSのディレクトリを(sambaなどで)マウントしてくるよりも安定していて、非常に使い勝手がいいのでおすすめです。

静的ファイルが反映されない問題が発生

イイカンジに使っていたんですがCSSやJSなどの静的ファイルが更新されない問題が発覚しました。ゲストOS側ではファイルの更新が反映されているのですが、Apache経由でブラウザから見ると更新されていなかったり、たまにバグって表示されてエラーとなったりします。

Apacheが原因でした

そこで調べた所、冒頭の2個の機能がこの問題を引き起こしていました。

<Directory /path/to/public_html>
  EnableMMAP Off
  EnableSendfile Off
</Directory>

EnableMMAP EnableSendfile

詳しくはApacheのドキュメントを参照するといいのですが、Apacheでは実際にデータを送信するまでの途中に処理が入らないファイル、つまり静的ファイルはsendファイルとして保存し、それをそのまま送信する事で性能を向上しているようですが、ネットワーク経由のマウント(NFSやSMB、そして今回の共有フォルダ機能)した領域ではファイル変更検知がうまくできずに、sendファイルの更新が行われないようです。

(余談)EnableMMAP Offで転送速度があがる?

いろいろ調べていた所、EnableMMAPをOffにする事で性能があがったという記事をいくつか見つけました。 EnableMMAP でも「マルチプロセッサシステムの中にはメモリマッピングをすると httpd の 性能が落ちるものがあります。」という記述があります。(今はほとんどの環境がマルチコアですよね) このあたりの詳細はわかりませんでしたが、ファイルシステムやOS側でのキャッシュが実装されている場合は間違いなくApache側と2重でキャッシュしそうな気がしますのでEnableMMAPはOffの方が性能はあがりそうです。 静的ファイルの転送が極端に遅いときなどはOffにしてみるといいかもしれません。