Apache の基本 -バーチャルホスト編-
あ〜〜ビアガーデンに行きたくて居ても立ってもいられない。こんにちは nakamura です。何年か前まで氷川丸の上にビアガーデンがあったのですが、いつの間にかなくなってしまったみたいですね。すごく素敵なビアガーデンだったんだけどなぁ、、、
さてさて本日は Apache について。世界でもおよそ 50% のシェアを誇り、今や Web サーバの代名詞と言ってもよいでしょう。非常に多機能な Apache ですが、そんな中でも今日は何かと触れる機会の多いバーチャルホストの設定について簡単な設定例を元に解説していこうと思います。
設定例
まずは設定の記述例から。Apache の設定ファイルはディストリビューションにもよりますが、/etc/httpd/ や /etc/apache2/ の下にあるケースがほとんどでしょうか。この配下にある httpd.conf が大元の設定ファイルになります。
もちろんこの httpd.conf に直接設定を記述しても問題はないのですが、これだとバーチャルホストの数が増えてくると設定ファイルの行数が膨大になってしまい、設定を変えたいホストの記述がすぐに見つからない!なんて事もありえます。という事で、今回は Include というディレクティブを使ってバーチャルホストの設定を外部化しましょう。httpd.conf の末尾に下記のように記述してください。
# Include Virtual Host Configs
Include /etc/apache2/vhosts.d/*.conf
これは /etc/apache2/vhosts.d/ 以下にあるファイル名が .conf で終わるファイルを読み込む、という設定です。.conf で終わる、というのがミソでこれから解説するような設定を記述したファイルを例えば /etc/apache2/vhosts.d/template という名前で保存しておいてバーチャルホストを増やす際には template をコピーして example.com.conf のような名前で保存してあげます。後は必要な箇所を書き換えてあげるだけでバーチャルホストの追加が出来てしまうというわけです。
では、具体的なバーチャルホストの設定例を下記に記します。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
ServerAdmin webmaster@example.com
CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/example.com/access.log.%Y%m%d.http 86400 540" combined
ErrorLog "|/usr/sbin/rotatelogs /var/log/apache2/example.com/error.log.%Y%m%d.http 86400 540"
<Directory "/var/www/example.com/html">
AllowOverRide All
Order Deny,Allow
Allow from All
DirectoryIndex index.php index.html index.htm
</Directory>
<IfModule mod_php5.c>
php_value session.save_path /var/www/example.com/tmp
</IfModule>
ScriptAlias /cgi-bin /var/www/example.com/cgi-bin
<Directory "/var/www/example.com/cgi-bin">
Options FollowSymLinks ExecCgi
AddHandler cgi-script .cgi .pl
AllowOverRide All
Order Deny,Allow
Allow from All
DirectoryIndex index.cgi index.html index.htm
</Directory>
</VirtualHost>
こんなところでしょうか。ちなみにこれはあくまで僕が個人的によく使うバーチャルホストの設定に過ぎません。コンテンツの用途や特徴にあわせて自分なりにどんどん工夫して書いてみましょう!
解説
それでは記述内容を簡単にですが説明していきます。
ServerName example.com
ServerAlias www.example.com
読んで字の如くですが、ServerName はバーチャルホストのホスト名になります。ServerAlias は ServerName 以外のホスト名でもアクセスを受け付けたい場合に記述します。ちなみに半角スペースで区切って複数記述可能です。
DocumentRoot /var/www/example.com/html
ServerAdmin webmaster@example.com
DocumentRoot はクライアントからのアクセスを許可するディレクトリ、つまりブラウザから直接アクセス可能なファイルを設置する場所を指定します。ServerAdmin はデフォルトの 404 ページ等に記載されるメールアドレスになります。
CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/example.com/access.log.%Y%m%d.http 86400 540" combined
ErrorLog "|/usr/sbin/rotatelogs /var/log/apache2/example.com/error.log.%Y%m%d.http 86400 540"
アクセスログ、エラーログの出力先の指定です。必ず指定しないといけないものではないですが、ログ集計の事などを考えるとバーチャルホスト毎に指定しておく方が無難でしょう。rotatelogs というのは Apache をインストールするとデフォルトで付属してくるログロテート用のコマンドです。コマンドの引数は 1. 出力ファイル名, 2. ロテートする間隔(秒)(86400 秒で一日毎) 3. GMT からの時間差(分)(日本の場合は +9 時間なので 540 分)です。ファイル名にはマクロが使用可能で %Y%m%d とする事で20090728 等の日付がファイル名に付与されます。
<Directory "/var/www/example.com/html">
AllowOverRide All
Order Deny,Allow
Allow from All
DirectoryIndex index.php index.html index.htm
</Directory>
Direcotry ディレクティブを使ってドキュメントルート以下に適用する設定を記述します。 AllowOverRide は .htaccess による設定変更を有効にするかどうかの設定で All や AuthConfig, Limit などが指定可能です。その下の 2 行はアクセス制御の記述でここでは特に制限を掛けていません。DirectoryIndex はファイル名を指定せず末尾が / の URL 宛に来たリクエストに対してどのファイルを返すかを指定します。
<IfModule mod_php5.c>
php_value session.save_path /var/www/example.com/tmp
</IfModule>
PHP の設定変更もディレクティブによっては Apache の設定ファイルで可能です。ちなみに .htaccess でも可能ですが Apache 設定ファイルが Apache 起動時に読み込まれるのに対し、.htaccess はリクエストの度に参照されます。アクセスが増えれば増えるほどオーバーヘッドがバカにならなくなるので、可能であれば極力 Apache の設定ファイルに記述するようにした方が良いでしょう。
ScriptAlias /cgi-bin /var/www/example.com/cgi-bin
<Directory "/var/www/example.com/cgi-bin">
Options FollowSymLinks ExecCgi
AddHandler cgi-script .cgi .pl
AllowOverRide All
Order Deny,Allow
Allow from All
DirectoryIndex index.cgi index.html index.htm
</Directory>
CGI スクリプトを使用する場合の設定です。ScriptAlias でこのように記述する事で、http://example.com/cgi-bin/ で CGI スクリプトにアクセスする事が可能になります。それ以外の項目はドキュメントルートの設定と被るものが多いので割愛させて頂きますが、CGI を使う場合必ず Options に ExecCgi を指定し、 AddHandler ディレクティブで CGI として実行させたい拡張子を指定する必要があります。
以上、かなり駆け足でしたが Apache バーチャルホストの基本的な設定について説明させて頂きました。しつこいようですが、サーバの用途や特性次第でベストな設定というのは全く異なってきます。今回のものはある程度一般的な設定だとは思いますが、設置するコンテンツに合わせて自分なりに工夫して色々試してみましょう!