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 コンテキストで
そして、/path/to/vhostuser.txt に
マッピングを定義したファイルは、Apache の起動時に読み込まれるほか、mtime が変更されたことが検出された時点で再読み込みされるので、サブドメインを増やしたい場合はマッピングファイルだけ編集すればよい(Apache の再起動不要)。また、リクエストがあるたびにマッピングファイルを参照しに行くわけではないので安心。
詳しくは RewriteMap ディレクティブのドキュメントを読んでいただければいいのだが、定義したいサブドメインが大量にある場合はマッピングファイルをバイナリファイルに変換することでパフォーマンスの向上を行うことができる。また、マッピングを外部のプログラムから取得するように設定することもできるので、LDAP にサブドメイン名を突っ込んで YATTA! ってなことも夢じゃないです(*2)。
(*1) この VirtualHost には DocumentRoot / VirtualDocumentRoot は必須ではない(DocumentRoot や VirtualDocumentRoot を指定しておくと、マッピングファイルに定義されていないホスト名のリクエストが来た場合に利用される)。また、UserDir についても VirtualHost 外で定義済みなら不要。
(*2) 適切にキャッシュを取らないとひどく重いだろうけど...。
今後の覚書ということで。
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のように設定(*1)。
RewriteEngine on
RewriteMap vhostuser txt:/path/to/vhostuser.txt
RewriteCond ${vhostuser:%{HTTP_HOST}} .+
RewriteRule ^/(.*)$ /~%0/$1 [PT,NS]
そして、/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
> ただ、ユーザ名とサブドメイン名が完全に無関係な某特殊任務では使えないですね…。
mod_vhost_alias_suexec.so の作成フラグですかな(^^)。
####################################
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 が掛かるので、ちょっと嫌ですが…。
とても黒魔術チックですが、SSLが掛かるページは非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
は不要でした…。
RewriteRule ^/(.+)$ /${vhostuser:%{HTTP_HOST}}/$1 [PT,NS]
のように NS をつけないと、DirectoryIndex の検索時にションボリします。