IPベースの仮想ドメイン構築

 同一サーバ上に複数のサイトを構築した場合でSSLにも対応した場合、証明書のURLが同一になったことはないでしょうか?これを解消すべく手段が見つかりました。
 まず、前提条件としてLinux&Apache2.2を使用することとします。インストールは便利な yum から行うこととします。

 問題点は、ネームベースの仮想ドメインを構築した場合、全てのサイトのローカルIPアドレスが同一になるため証明書のURLが同一になることに起因します。ホームサーバなどはグローバルアドレスが一つしかないと思いますので、この方法が正当法なのですが、やはりSSL証明書は別物にしたいですね。

 で、Apacheの機能の一つとして、IPベースの仮想ドメインを構築したいと思います。当然、グローバルアドレスは一つしかありません。メインのサイトAと仮想ドメインのサイトBを構築します。

【1.NICに複数のアドレスを割り当てる】
 現在、NIC に割当たっているIPアドレス(eth0)をサイトAのIPアドレスとします。次に、IPエイリアス機能を使用してeth0:0という仮想的なNICにIPアドレスを割り当てます。下記のサイトなどを参考にしてみてください。
  1枚のNICに複数のIPアドレスを割り当てたい
  複数IPアドレスをNICに割り当てる

【2.DNS(bind)の設定】
 DNSサーバを持っていない場合は設置の必要があります。サイトAの分と、サイトBの分を設定します。内部向けの設定は1で作成したIPアドレスでウェブサーバを認識できるようにします。外部向けの設定はグローバルアドレスでの設定なりますので、同一IPアドレスになります。
 設定が終わったら、必ずDNSサーバ上からdigコマンドなどを実行し、サイトAとサイトBが別々のローカルアドレスで引けるか確認します。

【3.Apache の設定】
 通常のルータはIPレベルでの変換しかしませんので、一度、メインのドメイン(サイトA)でリクエストを受け、mod_rewrite 、mod_proxyを使用し仮想ドメイン(サイトB)分のリクエストを振り分けます。実はこの時問題が発生します。mod_proxyでリクエストを振り分けた際、リクエスト元のIPアドレスが、書き換えられてしまいます。そうなると、アクセス解析や携帯端末かどうかの分析に支障を来してしまします。そこで、mod_rpef というモジュールを使用します。(参考:http://d.hatena.ne.jp/hogem/20090622/1245675445

 (1) 本体のインストール
   yum -y install httpd で行ってください。詳細は割愛します。
 (2) ライブラリのインストール
   apxs を使用したいので、yum -y install httpd-devel を実行します。
 (3) mod_rpaf をインストール
   こちらから mod_rpaf のソースファイルをダウンロードし、コンパイル→インストールをします。
   下記のサイトを参考にしてみてください。
     CentOS5.1 に mod_rpaf をインストールする
 (4) httpd.conf の設定
   ① Listen をIPアドレスを記述した設定に変える
     Listen 192.168.1.100   # サイトA
     Listen 192.168.1.101    # サイトB
   ② mod_rpaf の設定を httpd.conf に記述する
     LoadModule rpaf_module modules/mod_rpaf-2.0.so
     RPAFenable On
     RPAFsethostname Off
     RPAFproxy_ips 192.168.1.101 # 転送されるサイトのIPアドレス
     RPAFheader X-Forwarded-For   # 必要ならば
   ③ メインのサイトの VirtualHost の設定にmod_rewrite の設定をする
     <VirtualHost www.sample-a.com:80>
       ServerName www.sample-a.com
       …
       # 下記の設定で、サイトBへ振り分けが行われる
       <IfModule mod_rewrite.c>
         RewriteEngine On
         RewriteLog “logs/rewrite_log”
         RewriteLogLevel 1
         RewriteCond %{HTTP_HOST} sample-b.com$
         RewriteRule ^/(.*) http://www.sample-b.com/$1 [P]
       </IfModule>
     </VirtualHost>

※ ログの設定をローカルホストからのリクエストも出力するようにすると、デバッグがしやすいでしょう。

[2010/07/21 追記]
SSLで上記のような設定をする場合は、RewriteEngine On に加えて「SSLProxyEngine On」も設定する必要がある。

【4.SSLの設定】
 conf.d/ssl.conf をコピーして、サイト毎にファイルを作成した方がよいでしょう。もちろん、証明書ファイルの作成も行ってください。
 

 以上で終了ですが、かなり大がかりな改修となると思います。場合によってはメールサーバもIPを分けた方がよいかもしれません。当方のサーバでは現在のところメールサーバは単一のIPで動かすようにしています。出来れば、こちらも分離したいところです。

参考)
 Apacheの設定を変更し、単一IPアドレス上で複数のSSLサイトを運用する
 RewriteCond
 リバースプロキシとバックエンドのIPアドレス
 リバースプロキシ環境下のapacheではmod_extract_forwardedよりもやっぱりmod_rpaf?

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>