Apache設定ファイルの整理

先日Apacheのvhost設定をしたところ、
http://d.hatena.ne.jp/shimonoakio/20080126
たくさんvhostを定義して、しかも、どのVhostでもHTTPとHTTPS両方使えるように設定したら、なんだか冗長な部分がたくさんできて辟易してきた。今回は、設定を整理してシンプルにまとめたよという話。

Ubuntuにapt-getで普通に入れたApacheの場合(たぶんDebian系はぜんぶ?)vhost設定は以下のようなファイルに書いてゆく文化になっている。

ls /etc/apache2/sites-available/
000-default
www
aaa
bbb

今回私は2つの冗長記述に悩まされた。

  1. ワイルドカードSSL証明書を使うため全部のVirtualHostでSSL設定は同じ。だから全部のvhostに書くのはいやだ。
  2. HTTPS/HTTPで同じ動きをするように設定するのに<VirutalHost *:80>と<VirutalHost *:443>で2回同じこと書きたくない。

SSL周りの共通設定の外だし

証明書ストアを定義する部分については、ワイルドカード証明書ってことで全vhost共通なので、メインサーバの側に書いちゃいました。
具体的には、/etc/apache2/conf.d/にhttp_ssl.confというファイルを置いて、そこに全部記述しちゃいました。これによって、Vhost設定で定義されてい項目はメインサーバの設定を継承するということで、全vhostにおいて使う証明書ストアやらなにやらSSL設定のデフォルトを共通化してしまったということです。

HTTP/HTTPSで共通の設定の外だし

次に「HTTPSもHTTPもLocationやらDirectory指定は同じでおっけーなんだけど2回ずつ書くのやだなぁ」という問題は、Includeの入れ子ができることを利用して、以下のように共通部分を外だしして対処しました。入れ子っていってるのは、vhostの設定自体Includeで読み込まれているから。

/etc/apache2/sites-available/www
<VirtualHost *:80>
        Include ./sites-available/include/www
</VirtualHost>
<VirtualHost *:443>
        #   SSL Engine Switch:
        SSLEngine on

        Include ./sites-available/include/www
</VirtualHost>
/etc/apache2/sites-available/include/www
ServerName www.example.com
DocumentRoot /srv/www/www.example.com/

<Directory /srv/www/www.example.com/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
</Directory>

CustomLog /var/log/apache2/access.log combined

ポイントは以下2点だったかなと思います。

  1. Includeは入れ子可能
  2. Vhost設定で定義されていない項目はメインサーバの設定を継承する。

結構すっきりー^^やっぱDRY(Do not Repeat Yourself)にいかんとねぇ