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

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