VirtualBox.jpg


作業環境

ホスト

  • OS … Windows 7 64bit
  • 開発環境 … Eclipse 3.7.2

ゲスト

  • OS … CentOS 6.0
  • Httpd … Apache 2.2.15


起きた問題

ちょっと解りにくいので作業順に従って箇条書きで書くとこんな感じ。

  1. Eclipseのワークスペースを共有フォルダとしてVirtualBoxに登録
  2. 共有フォルダをマウントしてドキュメントルートにシンボリックリンクを貼る
  3. Eclipseでファイルを更新
  4. ゲストOS上でファイルの内容が更新されていることを確認
  5. ブラウザの表示を更新→更新されない
    • 読み込むjsファイルやcssファイルを変更しても反映されない
    • JavaScriptの場合途中までしか読み込まれずにエラーが出る
    • ExtJS4ではファイルの末尾によく解らない文字列が追加され「illegal character」エラーが出る

解決方法

こちらを参考にしました。

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

@osakanapower@osakanapower
■環境
Virtualbox7.0.1、CentOS6、Apache2

■現象
Virtualboxの共有フォルダ機能でホストのMacのworkspaceを
ゲストのCentOSにマウントしてDocumentRootに設定し、開発していたところCSSを変更しても反映されない。

応急的にはサーバーを再起動すると反映される。
また、該当のファイルを削除して、作りなおすことでも反映される。

■原因
Apacheの静的ファイルをメモリ上にキャッシュする機能が原因のよう。
通常、キャッシュされたファイルが更新された場合、更新を検知して再読み込みを行うはずですが、
NFS、SMBなどの外部ストレージ上のファイルの場合正しく更新を検知できないようです。
(Virtualboxの共有フォルダはApacheからはNFSのように見えるみたい)

■解決策
下記の記事を参考に解決することができました。
http://cantuse.it/2009/01/virtualbox-apache2-strange-caching-issues/

具体的には以下のように設定することで解消できました。
<Directory /media/sf_workspace>
EnableMMAP Off
EnableSendfile Off
</Directory>

■参考
http://httpd.apache.org/docs/2.0/ja/mod/core.html
http://q.hatena.ne.jp/1263439075

#virtualbox



上記サービスが終了したときに備えて抜き書きしてまとめると、こんな感じ。

httpd.confの適当な ディレクティブ(例えばドキュメントルート)に以下の記述を追加する
  • EnableMMAP Off
  • EnableSendfile Off

原因は、

Apacheの静的ファイルをメモリ上にキャッシュする機能が原因のよう。
通常、キャッシュされたファイルが更新された場合、更新を検知して再読み込みを行うはずですが、
NFS、SMBなどの外部ストレージ上のファイルの場合正しく更新を検知できないようです。
(Virtualboxの共有フォルダはApacheからはNFSのように見えるみたい)


あーなるほど…そんなことが。

原因が切り分けられずに、キャッシュを削除したり、Apacheのモジュールをチェックしたりいろいろ試して上手くいかなくて嵌まってたんですが(アプローチは間違ってなかったけど、自分では上みたいなことは一生解らなかったと思う)、こちらを発見できたときに拳を握りしめました。本当に助かりました。ありがとうございます。


というわけで、拡散するんだぜ。