カテゴリー: Apache

VagrantやVirtualBoxの共有フォルダ機能で静的ファイルが更新されない

VagrantVirtualBoxの共有ディレクトリ機能を使っていた時に起こった問題です。

VagrantVirtualBoxの共有ディレクトリ機能を使っていて、さらそのマウントポイントをApacheのドキュメントルートとしている場合、静的ファイルの更新が反映されない(バグる)問題の対応方法。
結論から言えばApacheが問題で以下の設定を追加すればOKでした。

<Directory /path/to/public_html>
EnableMMAP Off
EnableSendfile Off
</Directory>

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

開発環境

VirtualBoxで作成した仮想のLinuxサーバーを開発環境としています。
FTPとかSCPで何度もアップロードするのは面倒だった為、VirtualBoxの共有フォルダ機能を使っています。VirtualBoxの共有フォルダ機能は、ホストOS側の任意のディレクトリを、ゲストOS側でマウントする事ができるようになる機能です。この機能を利用してIDEのプロジェクトディレクトリを共有し、ゲストOSのApacheのドキュメントルートとする事で開発を進めていました。ホストOSがゲストOSのディレクトリを(sambaなどで)マウントしてくるよりも安定していて、非常に使い勝手がいいのでおすすめです。

静的ファイルが反映されない問題が発生

イイカンジに使っていたんですがCSSやJSなどの静的ファイルが更新されない問題が発覚しました。ゲストOS側ではファイルの更新が反映されているのですが、Apache経由でブラウザから見ると更新されていなかったり、たまにバグって表示されてエラーとなったりします。

Apacheが原因でした

そこで調べた所、冒頭の2個の機能がこの問題を引き起こしていました。

<Directory /path/to/public_html>
EnableMMAP Off
EnableSendfile Off
</Directory>

EnableMMAP
EnableSendfile

詳しくはApacheのドキュメントを参照するといいのですが、Apacheでは実際にデータを送信するまでの途中に処理が入らないファイル、つまり静的ファイルはsendファイルとして保存し、それをそのまま送信する事で性能を向上しているようですが、ネットワーク経由のマウント(NFSやSMB、そして今回の共有フォルダ機能)した領域ではファイル変更検知がうまくできずに、sendファイルの更新が行われないようです。

(余談)EnableMMAP Offで転送速度があがる?

いろいろ調べていた所、EnableMMAPをOffにする事で性能があがったという記事をいくつか見つけました。
EnableMMAP でも「マルチプロセッサシステムの中にはメモリマッピングをすると httpd の 性能が落ちるものがあります。」という記述があります。(今はほとんどの環境がマルチコアですよね)
このあたりの詳細はわかりませんでしたが、ファイルシステムやOS側でのキャッシュが実装されている場合は間違いなくApache側と2重でキャッシュしそうな気がしますのでEnableMMAPはOffの方が性能はあがりそうです。
静的ファイルの転送が極端に遅いときなどはOffにしてみるといいかもしれません。

VirtualDocumentRootで開発サーバーを楽に運用

ApacheのVirtualDocumentRoot機能について。

弊社では開発の為にグローバル環境に置かれた開発サーバーを用意しています。
Apacheの名前ベースVirtualHostを利用しているのですが
開発用という事もあって変更が多く、変更の度に以下のような作業が必要となります。

1,開発用のドメインサブドメインを追加し、開発サーバーへ向ける
2,VirtualHostディレクティブを追加
3,Apacheの再起動

非常に面倒だったのですが「DNSワイルドカード機能」と「VirtualDocumentRoot」を使うと上記の作業を自動化できます。

事前準備

上記の機能を使用する為には、apacheがconfigureオプションに
–enable-vhost-alias」をつけてコンパイルされている必要があります。
すでにApacheが動作している場合は上記オプションをつけて再インストールする必要があります。

また、DNSレコードを編集できるドメインを一つ取得している必要があります。
今回は例として example.com というドメインが完全に使用できると仮定して進めます。

DNSワイルドカード機能

ドメインのレコードを以下のように設定する事でサブドメインワイルドカードとして設定できます。
[code]
* IN A xxx.xxx.xxx.xxx
[/code]

この場合、test.example.com も hoge.example.com も、
すべてIP「xxx.xxx.xxx.xxx」へ向かうサブドメインと設定する事ができます。

VirtualDocumentRoot

Apacheのconfで以下のような設定を行います。
[code]
NameVirtualHost *:80

    <VirtualHost *:80>
ServerName          example.com
ServerAlias         *.example.com
VirtualDocumentRoot /home/%0/public_html
ErrorLog /usr/local/apache2/logs/error_log
TransferLog /usr/local/apache2/logs/access_log
<Directory /home/*/puclic_html>
Options FollowSymLinks ExecCGI
AllowOverride All
        Order deny,allow
Allow from all
</Directory>
</VirtualHost>

[/code]

この設定の勘所は
・DocumentRoot が VirtualDocumentRoot となりパスの部分に%0 といった変数になっている
・ServerAliasにワイルドカードを使用
ディレクトリにワイルドカードを使用

上記の設定だと
/home/test.example.com/public_html
というディレクトリを作成するだけで
test.example.com で接続できる状態となります。

VirtualDocumentRootの%0の部分はtest.example.comに置き換えられているのですが
それぞれの変数の対応は以下のようになっています。

[code]
test.example.comの場合

%0 test.example.com
%1 test
%2 example
%3 com

%1.1 = t
%1.2 = e
%1.3 = s
%1.4 = t

%1.1+ = test
%1.2+ = est
%1.3+ = st
%1.4+ = t
[/code]

VirtualDocumentRootの欠点

ディレクトリを作成するだけで公開されてしまう為、セキュリティ的には通常運用に比べ弱くなってしまってると言えます。
また、ログファイルは分ける事ができない為、すべてのログが1つに集約されてしまいます。

© SEEDS Co.,Ltd.