Drupal で作ったサイトをローカル環境に持って来て開発する時に「コンテンツのパスの指定が絶対パスで画像が表示されない」と言う現象で困られた事があるんじゃないでしょうか。サブディレクトリを使った運用をしてるとそうなってしまいますね。

この問題の簡単な解決方法としては Apache のルートディレクトリをその都度変えて localhsot へアクセスするか、サブドメインを使って sitename.localhsot の様な形で開発すること位でしょうか。サブドメインを使う方法の場合、通常は Apache の VirtualHost と hosts ファイルを書き換える必要があります。

色々なサイトをローカルで開発する場合その作業すらも億劫になりがちです。はい、私がそうです。今回はそんな面倒な作業をミドルウェアの設定をしなくとも、ディレクト名をサブドメインにして http://DIRNAME.localhost/ の様なアドレスですぐに開発できるようにする方法です。

今回は以下の環境・スキルを持ち合わせた方が対象の記事です。

  • 使用している OS が Mac OS X Yosemite 以降である
  • OS X のパッケージ管理に Homebrew を使っている
  • ドメインの名前解決の仕組みを知っている
  • hosts ファイルが何をするものか知っていてる

全体的な流れをかいつまんで言うと dnsmasq と言う簡易ネームサーバーで動的なドメインを名前解決できるようにし、 Apache の VirtualHostAlias モジュールを使用して動的なドメインに対応すると言うことをします。

ローカルドメインの名前

通常は *.localhost と言う形でローカル用のドメインを設定すると思いますが、私の場合はアドレスバーに hoge.localhost と毎回 localhsot を打ち込むのが面倒に思えたことに加え、今後まず GTLD として登録されないドメインを考えた結果 l (localhost の頭文字)と言うドメインをローカル開発用のものとして割り当てています。それが気持ち悪い場合は適宜読み替えてください。一昔前はローカル開発用のドメインとして .dev を薦める記事がけっこうあったと思いますが、昨今では GTLD に登録されてしまったので使用しないほうが無難です。

.dev ICANNWiki

dnsmasq

冒頭でもお伝えしましたが *.l と言う様な動的なドメイン名を名前解決するために dnsmasq と言う軽量の DNS サーバーを利用します。 BIND と言う昔ながらの DNS サーバーもあるのですが高機能な反面、設定も難しくローカルで運用するには大げさすぎます。一方で dnsmasq は比較的設定も簡単でローカルだけの運用には丁度良いので今回はこちらを利用します。

勘のいい方なら「 hosts ファイルにワイルドカード的なものを書けばいいんじゃない?」と思われるかもしれませんが、残念なことに hosts ファイルはワイルドカードに対応していないのです。。

インストール

Homebrew を利用して dnsmasq をインストールします。

$ brew install dnsmasq

dnsmasq の設定

デフォルトでは設定ファイルが用意されていないので、デフォルトの設定をコピーします。

$ cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf

/usr/local/etc/dnsmasq.conf をエディタで開いてください。 79 行目あたりに address の設定があると思いますので以下の設定を追加することでトップレベルドメインが l のものはすべて 127.0.0.1 = 自身のアドレスで解決されるようになります。

address=/l/127.0.0.1

dnsmasq の起動

Mac スタート時に自動的に dnsmasq を起動したい場合は以下の様にします。

$ sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons
$ sudo chown root /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

起動は launchctl を使いましょう。

$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

resolver の設定

先ほど設定した dnsmasq をネームサーバーとして使用するようにしましょう。単純に /etc/hosts を編集してローカルホストを指定してもいいのですが、 dnsmasq の設定をもう少し煮詰める必要があり、また、設定したとしても結局は dnsmasq から外のネームサーバーに問い合わせることになるので無駄が生じます。 OS X には /etc/resolver ディレクトリ内にドメインと同名のファイルを作ることで、ドメイン毎にネームサーバーを切り替えることができる仕組みがあるのでそれを活用します。

標準では /etc ディレクトリ内に resolver は無いので作成しましょう。

$ sudo mkdir /etc/resolver

/etc/resolver/l と言うファイルを作成し、中身を hosts ファイルと同形式でネームサーバーを設定します。

$ sudo echo "nameserver 127.0.0.1" > /etc/resolver/l

resolver のテスト

resolver は nslookup ではテストできないので ping コマンドなどを使ってテストしましょう。以下のコマンドで無事応答が帰ってくれば成功です。

ping test.l

Apache の設定

次は動的なドメインでアクセスされた際に、Apache の DocumentRoot を動的に変えてアクセスする設定です。

今回は OS X 標準の Apache の設定に従って、ホームディレクトリの Sites ディレクトリ内に各サイトのディレクトリを作成した場合を例に解説します。

VirtualHost Alias モジュールの有効化

VirtualHost の動的に使えるようにするため Apache に予め用意されている VirtualHost Alias モジュールを有効にします。 /etc/apache2/httpd.conf の 160 行目あたりにある vhost_alias_module のコメントアウトを戻してください。

LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so

設定ファイルを読み込むようにします。506 行目辺りのコメントアウトを外してください。

Include /private/etc/apache2/extra/httpd-vhosts.conf

Apache を再起動します。

$ sudo apachectl restart

VirtualHost の設定

OS X では最初から VirtualHost モジュールが有効になっているので、エイリアスの設定を追加しましょう。 /etc/apache2/extra/httpd-vhosts.conf に以下の様な設定を追加します。

<VirtualHost *:80>
    ServerAlias *.l
    VirtualDocumentRoot /Users/YOURNAME/Sites/%1
    <Directory /Users/YOURNAME/Sites/*>
        AllowOverride All
        Require ip 127.0.0.1 ::1
    </Directory>
</VirtualHost>
  • ServerAlias: .l で終わるドメイン全てを対象とする設定だと宣言しています。
  • VirtualDocumentRoot: に使用されている %1 は FQDN の右から数えて 1 番目のドメイン名を指しています。例えば example.l でアクセスした場合は /Users/YOURNAME/Sites/example がサイトのルートディレクトリとなる設定です。

YOURNAME となっているところは OS X のユーザー名を入れ、 <Directory> ディレクティブ内の設定はセキュリティポリシーに合わせて適宜変更してください。

以上で設定は完了です。

ブラウザのアドレスバーには最後にスラッシュを入れる

/Users/YOURNAME/Sites/ フォルダ内に適当にサイトを設置し、 設置したファイル名.l のドメインでアクセスできるかテストしてみましょう。

ブラウザによってはアドレスバーに入力した l のドメインが、ローカル用のドメインだと認識できずに検索ページヘ飛ばされてしまうことがありますが、その場合は example.l/ の様に最後に / を入れると URL として扱ってくれます。

余談

余談ですが Apache 2.2 までは mod_vhost_alias を使うと、 Drupal のクリーン URL で使われている mod_rewrite が正常に動作しなくなるので、サイト毎に .htacess 内の RewriteBase を設定する必要がありました。 Apache 2.4 ではその点が改善され、一々 RewriteBase を設定する必要がなくなり非常に便利になりました。(2.4 にしてからしばらく気付きませんでした……)

最初の設定はちょっと面倒かもしれませんが、毎日の様に色々なサイトをローカルで切り替えている方であれば、快適にウェブ開発をすることができるようになるかと思います。是非お試しください。