IPベースのバーチャルホストWWWサーバの構築


二つの異なるサイトを動かさなければならなくなったので、Apacheでバーチャルホストを動かすことにしました。バーチャルホストには、一つのIPアドレスで運用できる名前ベースのバーチャルホストと、IPアドレスがそれぞれのサイト分必要なIPベースのバーチャルホストがあります。通常ならコストもかからない名前ベースで充分なのですが、おやじは、SSL対応が必要なので今回はIPベースで動かすことにしました。名前ベースのバーチャルホストでは、アクセスしてきたホスト名をベースにApacheが制御しますが、SSLセキュアサーバではSSLでの認証が先に走るため使えません。
下記は、RedHat9.0でApache2.0.47で検証したものです。

家庭内から自宅サーバへのアクセスで問題が発生したので、ネットワーク構成を全面的に変更しました。(2003.10.25)

■ネットワーク構成

前述のようにSSLを使用するためIPベースでバーチャルホストを実現しなければならないので、サイト分のIPアドレスが必要です。おやじは、Bフレッツマンションタイプで2つのISPと契約しているので、最大2つのサイトを構築できます。ネットワーク的には、サーバのNICにIPアドレスを2個付与するとともに、ルータのポリシールーティングを使うことで対応しました。ネットワーク関係の詳細はこちらを参照してください。



■Apacheの設定

Apacheのバーチャルホスト設定は、VirtualHostディレクティブで行います。SSL用も必要なので、2つのサイトで4つのVirtualHostの設定が必要になりますが、Section3にサンプルがあるVirtualHostディレクティブで通常アクセス用の設定をします。
バーチャルホストの設定にあたっては、Apacheの動作が重要になります。Apacheのドキュメントから名前ベースの場合は、DNSの設定とも関係してかなり動作が複雑になりますが、IPベースの場合は<VirtualHost>をIP アドレスで定義すればアクセスが明示されるので、設定は簡単です。
但し、おやじのような環境では、サイト毎にIPアドレスが一つしかないため、ドメイン名(http://example0.com)やホスト名((http://www.example0.com)だけでなく、DNSのホスト名でも同じアドレスでApacheにアクセスされ、ServerNameがミスマッチしてもアクセスできてしまいます。

◆ httpd.confの設定

httpd.confでバーチャルホストの設定をしますが、httpd.confが大きくなってきて扱いにくくなってきたので、vhost.confとして作成し、Includeするようにしました。

続いて、下記内容をvhost.confとして作成し、他の設定ファイルと同じconfディレクトリ配下に設置します。サンプルを参考に、各サイト固有に定義する必要がある設定を追加します。基本的に、元のサイトで設定していた設定は移す必要があり、ほとんどのディレクティブがバーチャルホストで使用できますので、設置に困ることはないと思います。バーチャルホストで使用できるディレクティブかどうかは、ドキュメントのコンテキストを見ればわかります。
ここでは、www.aconus.com用のプライベートアドレスを192.168.1.100、www.example.com用を192.168.1.101として説明します。

<VirtualHost 192.168.1.100:80>
  ServerAdmin oyaji@mail.aconus.com
  DocumentRoot "/home"
  ServerName www.aconus.com

  <Directory "/home">
    Options FollowSymLinks Includes ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  UserDir /home/*/public_html
  <Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews SymLinksIfOwnerMatch ExecCGI IncludesNoExec
    <Limit GET POST OPTIONS PROPFIND>
      Order allow,deny
      Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
      Order deny,allow
      Deny from all
    </LimitExcept>
  </Directory>

  ErrorLog logs/error_log
  SetEnvIf Remote_Addr 192.168. homelog nolog
  SetEnvIf Request_URI "~akirin" akirinlog nolog
  SetEnvIf Request_URI "default.ida" wormlog nolog
  SetEnvIf Request_URI "root.exe" wormlog nolog
  SetEnvIf Request_URI "cmd.exe" wormlog nolog
  SetEnvIf Request_URI "Admin.dll" wormlog nolog
  CustomLog logs/home_log common env=homelog
  CustomLog logs/akirin_log combined env=akirinlog
  CustomLog logs/worm_log common env=wormlog
  CustomLog logs/access_log combined env=!nolog
</VirtualHost>

<VirtualHost 192.168.1.101:80>
  ServerAdmin oyaji@mail.aconus.com
  DocumentRoot "/var/www"
  ServerName www.example.com

  <Directory "/var/www">
    Options FollowSymLinks Includes ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog logs/example.com-error_log
  SetEnvIf Remote_Addr 192.168. homelog nolog
  SetEnvIf Request_URI "default.ida" wormlog nolog
  SetEnvIf Request_URI "root.exe" wormlog nolog
  SetEnvIf Request_URI "cmd.exe" wormlog nolog
  SetEnvIf Request_URI "Admin.dll" wormlog nolog
  CustomLog logs/example.com-home_log common env=homelog
  CustomLog logs/example.com-worm_log common env=wormlog
  CustomLog logs/example.com-access_log combined env=!nolog
</VirtualHost>

◆ ssl.confの設定

バーチャルホストのSSL関係の設定も、全てhttp.confと同じディレクトリに作成されるssl.confで行います。設定に先立ち、こちらでサイト毎の証明書を作成しておきます。ポイントは、server.csr作成時のホスト名で、ブラウザでアクセスするホスト名と一致させないと、CA証明書をインストールしても毎回ホスト名が違うと怒られます。
ここでは、www.aconus.com用としてserver0.key/server0.crtを、www.example.com用としてserver1.key/server1.crtを作成したものとして記述します。下記は、デフォルトから変更したイメージで示してあり、設定内容は、基本的に上記およびSSL化対応に順次ます。(青字は削除、赤字は追加、緑字は変更したものです。)


<IfDefine SSL>
Listen 443

## SSL Global Context
# Some MIME-types for downloading Certificates and CRLs
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

# Pass Phrase Dialog:
SSLPassPhraseDialog builtin

# Inter-Process Session Cache:
SSLSessionCache dbm:logs/ssl_scache
SSLSessionCacheTimeout 300

# Semaphore:
SSLMutex file:logs/ssl_mutex

# Pseudo Random Number Generator (PRNG):
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin

## SSL Virtual Host Context

<VirtualHost 192.168.1.100:443>
# General setup for the virtual host
ServerAdmin oyaji@mail.aconus.com
DocumentRoot "/home"
ServerName www.aconus.com:443
#ErrorLog logs/error_log
#TransferLog logs/access_log

<Directory "/home">
  Options FollowSymLinks Includes ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

UserDir /home/*/public_html
<Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options MultiViews SymLinksIfOwnerMatch ExecCGI IncludesNoExec
  <Limit GET POST OPTIONS PROPFIND>
    Order allow,deny
    Allow from all
  </Limit>
  <LimitExcept GET POST OPTIONS PROPFIND>
    Order deny,allow
    Deny from all
  </LimitExcept>
</Directory>

ErrorLog logs/error_log
SetEnvIf Remote_Addr 192.168. homelog nolog 
SetEnvIf Request_URI "~akirin" akirinlog nolog 
SetEnvIf Request_URI "default.ida" wormlog nolog 
SetEnvIf Request_URI "root.exe" wormlog nolog 
SetEnvIf Request_URI "cmd.exe" wormlog nolog 
SetEnvIf Request_URI "Admin.dll" wormlog nolog 
CustomLog logs/home_log common env=homelog 
CustomLog logs/akirin_log combined env=akirinlog 
CustomLog logs/worm_log common env=wormlog 
CustomLog logs/access_log combined env=!nolog


# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# SSL Cipher Suite:
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# Server Certificate:
SSLCertificateFile /usr/local/certs/server0.crt

# Server Private Key:
SSLCertificateKeyFile /usr/local/certs/server0.key

# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
  SSLOptions +StdEnvVars
</Files>
<Directory "/usr/local/apache2/cgi-bin">
  SSLOptions +StdEnvVars
</Directory>

# SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

# Per-Server Logging:
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

<VirtualHost 192.168.1.101:443>
# General setup for the virtual host
ServerAdmin oyaji@mail.aconus.com
DocumentRoot "/var/www"
ServerName www.example.com:443
#ErrorLog logs/error_log
#TransferLog logs/access_log

<Directory "/var/www">
  Options FollowSymLinks Includes ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

ErrorLog logs/example.com-error_log
SetEnvIf Remote_Addr 192.168. homelog nolog 
SetEnvIf Request_URI "default.ida" wormlog nolog 
SetEnvIf Request_URI "root.exe" wormlog nolog 
SetEnvIf Request_URI "cmd.exe" wormlog nolog 
SetEnvIf Request_URI "Admin.dll" wormlog nolog 
CustomLog logs/example.com-home_log common env=homelog 
CustomLog logs/example.com-worm_log common env=wormlog 
CustomLog logs/example.com-access_log combined env=!nolog


# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# SSL Cipher Suite:
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# Server Certificate:
SSLCertificateFile /usr/local/certs/server1.crt

# Server Private Key:
SSLCertificateKeyFile /usr/local/certs/server1.key

# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
  SSLOptions +StdEnvVars
</Files>
<Directory "/usr/local/apache2/cgi-bin">
  SSLOptions +StdEnvVars
</Directory>

# SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

# Per-Server Logging:
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

</IfDefine>

 

■logrotateの設定

loglotateは、/etc/logrotate.d配下にあるapacheを参考に作成していますが、おやじは、下記のようなワイルドカードでの設定なので今回は変更していません。(青字は削除、赤字は追加、緑字は変更したものです。行頭の数字は説明上、おやじが付加したものです。)

1.  /var/log/httpd/access_log /var/log/httpd/agent_log /var/log/httpd/error_log /var/log/httpd/referer_log {
2.  missingok
3.  sharedscripts
4.  postrotate
5.  /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
6.  endscript
7.  }

              ↓削除、追加

1.  /usr/local/apache2/logs/*_log {
2.  missingok
3.  sharedscripts
4.  postrotate
5.  /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
6.  endscript
7.  }

1行目: logrotateしたいlogファイル名を*_logでワイルドカード指定。
2行目: ログファイルが無くとも、処理を正常終了させる。
3行目: 1行目で複数指定されたlogファイルに対し、postrotate以降設定されたコマンドを実行する。
4行目: このコマンドの後に、logファイルのローテーション後に実行するコマンドを記述する。
5行目: logファイルのローテーション後、apacheサーバにハングアップシグナル(HUP)を送り、再起動
           させるためのもの。これにより、apacheが新たなlogファイルにログを出力するようになる。
6行目: postrotateの終端を示す。  

 
以上で、二つのサイトにアクセスが可能となるので、Apacheを再起動して相互にアクセス確認しましょう。


Top Pageへ   サーバの構築へ戻る