がらくたネット


apacheでのバーチャルホストについて考える

apacheでのバーチャルホストについて考える

RPMでインストールした場合と仮定する。

考慮する点

  • バーチャルホストの設定を実行するとデフォルトのWebホスト設定が無効になるためまずはデフォルトのWebホスト設定が必要
  • デフォルトのWebホスト設定は必ず他のWebホストよりも先に記載する。
  • 名前ベースとIPベースの設定がある。通常は名前ベースの設定でOK。
  • SSLに対応したWebホストを作成する場合はIPベースでの設定が必要となり対応するWebホストは1IP=1FQDNとなるように設定する必要がある
  • SSL通信の場合、専用IPが必要であるがその理由は次の通り。
  1. apacheのバーチャルホストはWebクライアントからのHTTP要求に対しどのホストへの接続であるかをHTTPパケットから探し出す。
  2. 探し出したFQDN名を元にバーチャルホスト設定内容を検査し、該当するWebホストで接続要求を渡す。
  3. しかし、SSL通信の場合このHTTP要求自体が暗号化されており復号化するためには適切な秘密鍵が必要となる。この秘密鍵を所有しているWebホストに接続するための手段としてはIPアドレスしか存在しない。
  4. 従ってSSL通信を行う場合はその接続するFQDN名のWebホストは単一の必要がある。
  • <VirtualHost>ディレクティブには最低限ServerNameとDocumentRootが必要
  • suexecの機能を利用する場合、特にデフォルトのホスト設定部分に注意する。デフォルトのWebホストでcgiを実行する際にsetuid/sergidされているプログラムは動作しない。例えば、qmailadminやvqadminなどが該当する。この場合は、デフォルトWebホストではsuexec機能を無効にしておく必要がある。
  • 設定ファイルをhttpd.confに全て記載するのか、別のファイルに記載するのか。httpd.conf以外でも設定ファイルは制御可能。管理数と管理方法によりどちらかを選択する。
  • Linuxシステムに専用アカウントを発行するのか?発行する場合、シェルログインやFTP接続、Webホームディレクトリ設定など各種関連項目を整理する
  • 独自ドメイン名での接続とデフォルトWebホスト経由での接続についても検討する
  • ログファイル。ログファイル格納ディレクトリとパーミッション。ログローテート設定
  • PHPをモジュール動作させるのかUID/GID指定で動作させるのか

ファイル記述子の限界

  • Linuxはプロセスごとに利用可能なファイルハンドル数を制限している
  • 通常は64でハードリミットまで増加可能

個人的な見解

  • linuxユーザは<独自ドメイン名>とする
  • バーチャルドメイン用ディレクトリを/var/www/vhostsとする
  • linuxユーザのホームディレクトリは/var/www/vhosts/<独自ドメイン名>とする
  • シェルログインは禁止、FTPは許可
  • FTPで接続した場合はユーザのホームディレクトリが/となるように設定
  • ログは1つのlogrotate用ファイルでローティション設定
  • PHPはモジュールでもUID/GIDでも動作可能なように設定
  • PHPのsuexec版はsuPHPを利用
  • 基本は名前ベース
  • IPベース用は別途設定ファイルを設ける

httpd.confへの設定

#名前ベースのバーチャルホスト宣言
NameVirtualHost *:80
#デフォルトWebホスト設定
<VirtualHost *:80>
ServerAdmin admin@localhost
DocumentRoot /var/www/html
ServerName www.test.local
ServerAlias test.local *.test.local
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd//access_log common
userdir disable
#suexec設定(2.0系)
SuexecUserGroup apache apache
#suexec設定(1.3系)
#User apache
#Group apache
<Directory /var/www/html>
Options All
AllowOverride All
</Directory>
</VirtualHost>

#IPベースのバーチャルホスト設定、宣言は不要
<VirtualHost xxx.xxx.xxx.xxx:443>
ServerAdmin admin@localhost
DocumentRoot /var/www/html
ServerName www.test.local
ServerAlias test.local *.test.local
ErrorLog /var/log/httpd/ssl_error_log
CustomLog /var/log/httpd/ssl_access_log common
userdir disable
SuexecUserGroup apache apache
<Directory /var/www/html>
Options All
AllowOverride All
</Directory>
</VirtualHost>

#他のバーチャルWebホスト設定を指定ディレクトリ配下に保存し読み込む場合の記述
Include /etc/httpd/conf/vhosts/*.conf

logrotateの設定ファイルサンプル

/etc/logrotate.d/httpd-vhosts

  • 365日分残す
  • ローテート済みファイルに日付をつける

/var/www/vhosts/*/logs/access_log /var/www/vhosts/*/logs/error_log {
    daily
    rotate 365
    missingok
    sharedscripts
    dateext
    postrotate
        /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}