今更だけど CentOS-7 + httpd-2.4 の設定ファイル構成を考えてみる


背景

CentOS-7 なら当然の如く httpd-2.4 を使うわけですが、これまでのデフォルト値への文句を反省したのか、「じゃあ好きに設定したらいいじゃん!」とばかりに設定行が少なくなっています。

で、どのファイルに何を書こうか悩んだので、メモ程度に残すことにしました。
特にこだわりがあるのではなくどっちかというとツッコミ待ちですので、お気軽にご意見下さい。

conf/http.conf の扱い方

Global な設定を記載する場所って限定した方がわかりやすいかなぁ、と考えています。
例えば、ServerTokens とか ServerSignature とか、core モジュールに起因するものを記載する感じで。
なので、あまりいじってません。

core についての記載は最初は conf.modules.d/00-base.conf に記載するか悩んだんだけど、00-base.conf って core モジュールと関連がない上にややこしくなりそうなのでやめました。

conf.modules.d

モジュール個別の設定はできるだけ conf.modules.d/*.conf に寄せたかったけど…

結論から先に言うと、MPM チューニング設定のみ conf.modules.d/00-mpm.conf に記載しています。
最初は「LoadModule + ロードしたモジュールの設定の方が自然じゃん!」とか考えたんですが、MPM 以外にあまり適用できそうなものが無かったのですね。

MPM の設定だけなら conf.modules.d/00-mpm.conf に書くのが一番直感的かつ自然だと考えています。
01-cgi.conf とか見る限り別に LoadModule しか書いてはいけないわけではないようですし。

conf.modules.d/00-mpm.conf
# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so

# 値は適当だよ!
<IfModule mpm_event_module>
    AsyncRequestWorkerFactor 4
    StartServers             32
    ServerLimit              32
    MaxRequestWorkers        4096
    MinSpareThreads          4096
    MaxSpareThreads          4096
    ThreadsPerChild          128
    ThreadLimit              128
    MaxRequestsPerChild      1000000
    ListenBacklog            4095
</IfModule>

しかし、context が virtual host, directory, .htaccess と幅広いもの(proxy, rewrite, auth など)については流石に LoadModule 直後に書けないので中途半端な感じが否めません。MPM 以外に適用できそうなものだと SSL くらいしか思いつかず、SSL については conf.d/ssl.conf に記載しないと余計な混乱を招きそうです。
逆にチューニング値を httpd.conf や conf.d/mpm.conf に記載するのも考えたのですが、conf.modules.d/00-mpm.conf から分離する理由としては弱いのでやめました。

conf.d

conf.d については別に Apache 2.4 関係ないですね。2.2 と同構成です。しかも完全に個人的な好みになってしまいました。

conf.d/ssl.conf が使いづらい

ssl.conf ってそのまま使うこと殆どないので、welcome.conf と同じく全コメントアウト(削除すると yum update で復活してしまう…)して、ssl.sni.conf とか作ってます。
最低限の SSL 共通設定を ssl.sni.conf でやって、ホストごとの設定は Include で対処。

conf.d/ssl.conf
# SSL 設定は ssl.sni.conf に寄せました。
conf.d/ssl.sni.conf
# Mozilla SSL Configuration Generator とか参考に SSL 共通設定を書く。

# SNI 使う。
SSLStrictSNIVHostCheck off
Include conf.d/ssl-vhosts.d/*.conf

ここら辺は色々模索中。

VirtualHost 管理はホストごとに分離したい

先程の conf.d/ssl-vhosts.d/*conf と同様に conf.d/vhosts.conf を作り Include させています。

conf.d/vhost.conf
Include conf.d/vhosts.d/*.conf

その他

VirtualHost 間の共通設定は Include 使っちゃう

ServerAlias だけでは吸収しきれないような場合、割りと積極的に Include しちゃいます。

conf.d/vhosts.d/a.example.com.conf
ServerName a.example.com
CustomLog logs/a.example.com/a.example.com-access.log

# a.example.com だけの設定

# 共通部 Include
Include conf.d/vhosts.d/include/a_b-common.conf
conf.d/vhosts.d/b.example.com.conf
ServerName b.example.com
CustomLog logs/a.example.com/b.example.com-access.log

# b.example.com だけの設定

# 共通部 Include
Include conf.d/vhosts.d/include/a_b-common.conf
conf.d/vhosts.d/include/a_b-common.conf
# a.example.com, b.example.com 共通

ちなみに上記の例であれば別に無理して二つのファイルに分けるより SetEnvIf で対応すべきですね。

書いてみたら Apache-2.4 がほぼ関係なくなった件。うーん。