Vagrantの共有フォルダをApache(Nginx)のDocumentRootに指定するとレスポンスがおかしくなる奇妙な現象の解決方法 #vagrant

今まで遭遇したことのない奇妙な現象でかなり戸惑ってしまいましたのでメモしておきます。

環境

現象

タイトルの通りですが、Apache(Nginx)のDocumentRootにVagrantの共有フォルダ(/vagrant)以下のフォルダを指定するとレスポンスがおかしくなることがあります。

具体的には、ファイルの内容が切れたり削除したはずの文字列が残っていたり、非常に奇妙な動作をします。

原因

原因はLinuxカーネルのsendfileとVirtualBoxNFSのバグによるものらしいです。Apacheのデフォルト設定ではこのsendfileを使用するオプションが有効になっていますが、これを無効にすることにより解決します。

ApacheのEnableSendfileに関するドキュメントを読んでみると、そもそもNFSやSMBマウントしている場合はEnableSendfileを無効にしたほうが良いと記述がありました

対策

以下のオプションを無効にします。

Apache

EnableSendfile Off

Nginx

sendfile off;

再現方法

例えば、DocumentRootを/vagrant/wwwに指定したとして、このブログでも使用されているreset.cssを/vagrant/www/reset.cssに配置します。

ファイルの内容は以下の通りです。

[vagrant@localhost ~]$ curl localhost/reset.css
ここから上は省略

/**
 * To help tables remember to inherit
 */
table {
  font-size:inherit;
  font:100%;
}

/**
 * Bump up IE to get to 13px equivalent for these fixed-width elements
 */
pre, code, kbd, samp, tt {
  font-family:monospace;
  *font-size:108%;
  line-height:100%;
}


/* }}} */
[vagrant@localhost ~]$

赤字の部分を削除して再度ファイルを表示させます。 単純に赤字部分が削除された状態で表示されるかと思いきや、以下のように消したはずの部分が残っているかつ、末尾の「/ }}} /」が表示されずにきれています。

[vagrant@localhost ~]$ curl localhost/reset.css
ここから上は省略

/**
 * To help tables remember to inherit
 */
table {
  font-size:inherit;
  font:100%;
}

/**
 * Bump[vagrant@localhost ~]$

参考

shared folder problem · Issue #351 · mitchellh/vagrant · GitHub