mod_vhost_aliasでサブドメイン動的生成

Posted by joeartsea on 2009-01-24

Apacheでサブドメインを動的に生成してWebサイトを量産する方法です。何のために?目的は人それぞれですが、多分Virtual Hostディレクティブの量産では追いつかない&管理しづらい事をおっ始めようという時に有効な手段です。

まずWebサイトなんで外部から名前解決できないといけないですからDNSから取り掛かりましょう…という程のものではなく、DNSのレコードにはワイルドカードが使えますので以下のように設定すればサブドメインのアクセスを全てWebサーバ側に向けることができます。

1
* IN A 10.0.0.1

あとはApacheのVirtual Hostの設定を動的にするわけですが、これはApacheのmod_vhost_aliasというモジュールを使用して実現します。Apache2系なら既に使える状態にあると思いますが、一応http.confのモジュール読込みの部分を確認してコメントアウトされていたら解除してApache再起動します。

設定例は

1
2
3
4
5
6
7
8
<VirtualHost *:80> 
    ServerAdmin [email protected]
    ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot /home/%2/public_html/%1
    ErrorLog logs/example.com-error_log
    CustomLog logs/example.com-access_log common
</VirtualHost>

これでVirtualDocumentRootの%2の部分はexample.comに置き換えられ、サブドメイン部分は%1に置き換えられます。つまりabc.example.comの場合は/home/example.com/public_html/abcのファイルが表示されると言うことです。それぞれの変数の対応を表にすると以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sub.example.com の場合
%0 = sub.example.com
%1 = sub
%1+ = sub.example.com
%2 = example
%2+ = example.com
%A.B = %Aで指定されたドメイン部分のB文字目
%1.1 = s
%1.2 = u
%1.3 = b
%A.-B = %Aで指定されたドメイン部分の末尾からの文字数
%1.-1 = b
%1.-2 = u
%1.-3 = s
%A.B+ = %Aで指定されたドメイン部分の文字数から以降全て
%1.1+ = sub
%1.2+ = ub
%1.3+ = b
%1.-1+ = sub
%1.-2+ = su
%1.-3+ = s

これでabc.example.comを新たに生成してもDNSのゾーンファイルやhttp.confを修正したりApacheを再起動することもなく、public_htmlディレクトリ内にabcというディレクトリを作成してディレクトリ内にWebサイトを構築するだけでアクセスできるようになるわけです。