じゅにゃくんのはてブロ。

ブログ不精なんですが...。

vagrantのsynced_folderをapacheで利用しているときのキャッシュ回避

仮想サーバからみる config.vm.synced_folder のディレクトリは OS のキャッシュがイヤな感じで効いてしまうようです。たとえば CSS ファイルや JavaScript ファイルをローカルから更新したときに、うまくファイル更新を拾えなくてファイルの末尾にゴミが付いてきちゃったりします。

この OS のキャッシュについては Apache HTTP Server ドキュメントの EnableSendfile ディレクティブ 項目にも書かれていて、

ネットワークマウントされた DocumentRoot (例えば NFS や SMB) では、カーネルは自身のキャッシュを使ってネットワークからのファイルを 送ることができないことがあります。

のように書かれていて、それの解決方法は、

これらの問題に当てはまるサーバの設定の場合は、以下のようにして この機能を使用不可にしてください:

EnableSendfile Off

NFS や SMB マウントされたファイルには、問題のあるファイルにのみ明示的に この機能を使用不可にします:

<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>

だそうです。つまり httpd.conf の適切なところに EnableSendfile Off を書けってことですな。

nginx を使っている時は、VagrantでCSSの更新が反映されない場合の対処法 に書いてあるとおり、

sendfile off;

で良いそうです。

自分は JavaScript ファイルが更新されてくれなくてさんざん悩んでいたのでした。
HTML ファイルから JavaScript ファイルの読み込みに

<script src="hoge.js?t=ランダムな数字"></script>

こんなふうに "t=ランダムな数字" をつけるようにしてキャッシュ回避をしてた。けどつい忘れてしまってゴミデータ付きファイルとしてキャッシュされちゃうと vagrant を落としたりしなきゃならなくてちょう面倒くさかったのだ。

というのを ドットインストールのChef入門 を見てて思ったのでした。