Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Linux
まぁ、ワイルドカード証明書なぞ持っていないのですが(汗
今後の覚書ということで。

mod_vhost_alias で、同一証明書 && 同一 IP && 複数コモンネーム(ホスト)が実現できます(CentOS 5.x だと RPM 標準、ソースインストールの場合は configure option が必要)。

<VirtualHost *:443>
VirtualDocumentRoot "/path/to/web/dir/%0"

SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/example.com.crt
SSLCertificateKeyFile /etc/pki/tls/certs/example.com.key
...
(超抜粋)

のように設定しておくと、

https://first.example.com/ --> /path/to/web/dir/first.example.com
https://second.example.com/ --> /path/to/web/dir/second.example.org

のようにマッピングしてくれるので、SSL じゃなくても何かと便利(サブドメインを増やした場合でも、conf の書き換えが不要になる)。
%0 だけでなく、%1 でドメインの最初のコンポーネント(first, second)などの指定もできる(Apache の mod_vhost_alias マニュアル)。

ただ、ユーザ名とサブドメイン名が完全に無関係な某特殊任務では使えないですね…。

追記: 2009/02/16
コメントに書いたことのまとめ編。最終的にこんな感じになった。

httpd.conf の VirtualHost コンテキストで
UserDir public_html
RewriteEngine on
RewriteMap vhostuser txt:/path/to/vhostuser.txt
RewriteCond ${vhostuser:%{HTTP_HOST}} .+
RewriteRule ^/(.*)$ /~%0/$1 [PT,NS]
のように設定(*1)。
そして、/path/to/vhostuser.txt に
# Subdomain          User Name
www.example.com user001
first.example.com user001
second.example.com user002
third.example.com user003
のようにマッピングを定義する。

マッピングを定義したファイルは、Apache の起動時に読み込まれるほか、mtime が変更されたことが検出された時点で再読み込みされるので、サブドメインを増やしたい場合はマッピングファイルだけ編集すればよい(Apache の再起動不要)。また、リクエストがあるたびにマッピングファイルを参照しに行くわけではないので安心。

詳しくは RewriteMap ディレクティブのドキュメントを読んでいただければいいのだが、定義したいサブドメインが大量にある場合はマッピングファイルをバイナリファイルに変換することでパフォーマンスの向上を行うことができる。また、マッピングを外部のプログラムから取得するように設定することもできるので、LDAP にサブドメイン名を突っ込んで YATTA! ってなことも夢じゃないです(*2)。

(*1) この VirtualHost には DocumentRoot / VirtualDocumentRoot は必須ではない(DocumentRoot や VirtualDocumentRoot を指定しておくと、マッピングファイルに定義されていないホスト名のリクエストが来た場合に利用される)。また、UserDir についても VirtualHost 外で定義済みなら不要。
(*2) 適切にキャッシュを取らないとひどく重いだろうけど...。

Comments

寿
2009/02/15
vhosts_aliasでも実現できましたかー、良いですね。

> ただ、ユーザ名とサブドメイン名が完全に無関係な某特殊任務では使えないですね…。

mod_vhost_alias_suexec.so の作成フラグですかな(^^)。
2009/02/15
ちょっと試したところ、頑張れば suEXEC もできるみたいです。

####################################
UserDir public_html
...
<VirtualHost *:443>
VirtualDocumentRoot "/path/to/vhosts/%0"
...
####################################

という設定にしておいて、ファイルシステムで

####################################
/path/to/vhosts/first.example.com --> /home/user001/public_html
/path/to/vhosts/second.example.com --> /home/user002/public_html
####################################

とリンクを張って、さらに上記の VirtualHost の設定の中に

####################################
RewriteEngine on
RewriteMap vhostuser txt:/var/www/map.txt
RewriteCond ${vhostuser:%{HTTP_HOST}|"nobody"} !nobody
RewriteRule ^/(.+)$ /${vhostuser:%{HTTP_HOST}}/$1 [PT]
####################################

と書いて「ホスト名 -> "~ユーザ名"」の Rewrite を掛け、最後に /var/www/map.txt に

####################################
first.example.com ~user001
second.example.com ~user002
####################################

とマッピングを定義してやると、一応実現できました。

サブドメイン以下の全リクエストに毎回 Rewrite が掛かるので、ちょっと嫌ですが…。
寿
2009/02/15
実際の処理はUserDirに任してsuEXECで動かすってことですね。
とても黒魔術チックですが、SSLが掛かるページは非SSLページに比べて頻度が低いだろうし有りなんじゃないかな。
2009/02/15
/var/www/map.txt でサブドメインを一元管理(←悪魔のキーワード)できるので、どうせやるなら(高負荷時に問題が起きないなら)、非 SSL のところも同じように書きたいですね。
現状の、
www.example.com/~user/
first.example.com/
first.example.com/~user/
で同じページが見えてしまうという問題も解決できますし。

この方式なら vhost_alias は関係ないので
> VirtualDocumentRoot "/path/to/vhosts/%0"
> /path/to/vhosts/first.example.com --> /home/user001/public_html
> /path/to/vhosts/second.example.com --> /home/user002/public_html
は不要でした…。
2009/02/16
# 後で読む方のために

RewriteRule ^/(.+)$ /${vhostuser:%{HTTP_HOST}}/$1 [PT,NS]

のように NS をつけないと、DirectoryIndex の検索時にションボリします。
寿
2009/02/16
SSL/非SSL両方とも問題ないと思うので近日実践投入してみましょう。
Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: