Tech memo

日々学んだ技術のびぼうろく

Vagrant CSS, JS, HTML などの静的ファイルの更新が反映されない時の対処方法

エラー内容

CSS, JS, HTML などの静的ファイルを変更しても変更分が反映されない。

ブラウザキャッシュの影響ではなさそう。

ページキャッシュなどもしていない。

直し方

Web サーバのconfファイルにて、sendfile を使用しない設定に変更して Vagrant を再起動する。

  1. Webサーバの設定を変更して
  2. Vagrant を再起動する。

1. Webサーバの設定変更

apache

<Directory [対象のディレクトリ]>
  ・・・・
  EnableSendfile Off
  ・・・・
</Directory>

nginx

http {
    ・・・・
    sendfile        off;
    ・・・・
}

2. Vagrant の再起動

$ vagrant reload

原因

Linux の sendfile機能が原因。

sendfileでは、通常はキャッシュされたファイルが更新された場合、更新を検知して再読み込みを行う。

しかし、NFS での外部ストレージ上のファイルの場合、正しく更新を検知できない時がある。

Virtualboxの Synced Folder (フォルダマウント機能)は NFS 扱いになるため、

今回のようなエラーが起こることがある。

調べてみると公式の Vagrant ドキュメントにもちゃんと書いてあった。

There is a VirtualBox bug related to sendfile which can result in corrupted or non-updating files. You should deactivate sendfile in any web servers you may be running.

In Nginx:

sendfile off;

In Apache:

EnableSendfile Off

※ sendfileとは

静的ファイルをカーネルにキャッシュする Linux の機能。

sndfile ディレクティブが有効の時、Webサーバは sendfile()API を使いカーネルにキャッシュしているデータを送信する。

まとめ

Vagrant を使用するときは、Webサーバ側で sendfile機能を切っておきましょう、というお話。

参考

vagrant 初心者におすすめの本はこちら

Vagrant入門ガイド

Vagrant入門ガイド

vagrant を深く知りたい方におすすめ

実践 Vagrant

実践 Vagrant