今回、このサイトのコンテナ化に当たって、http デーモンには、これまで同様 Apache を使用していますが、この Apache は Debian の公式イメージ bullseye-slim にインストールしたものを動作させています。
CentOS 7 の場合、Apache の設定は、主に /etc/httpd/conf/httpd.conf や /etc/httpd/conf.d 以下にあるファイルを編集するなり無効化するなりして、さらには /etc/httpd/modules.d 以下に、モジュールごとの有効化・無効化にその設定と、各々ファイルが分割されている上に、ベストプラクティスな設定方法も見当たらず、深く考えずに設定を始めてると煩雑になりがちでした。
これに対して Debian のパッケージにある Apache の設定はまったくといっていいほど、作法というか思想が違います。最初は戸惑いましたが、できてみると、これの方がすっきりしていいのではないかという気がしてきます。
その Debian 流の設定方法を、ここでまとめておきます
モジュールの有効化
Debian へインストールが終わった直後の Apache をそのまま起動すると、静的コンテンツを表示するために必要最低限の設定で起動します。この状態では SSL での通信はもちろん、CGI も PHP も動作しませんし、URL の書き換え (Rewrite) もできません。
まずは必要なモジュールを読み込むようにする必要があるわけですが、ここで httpd.conf を書き換えることはしません。すべて a2enmod コマンドで行います。
例えば SSL での通信を有効にする場合は
a2enmod ssl
とコマンドを入力すると、SSL モジュールが読み込まれ、Apache を再起動すると有効になります。ちなみに無効にする場合は
a2dismod ssl
です。
これで必要なモジュールを一つ一つ有効にしていくのですが、困ったことに依存関係は解決してくれません。例えば、FastCGI を使うためには proxy_fcgi モジュールを有効にする必要があるのですが、これを有効にするためには proxy モジュールを、先に有効にしておかなければなりません。この依存関係を無視して、モジュールを有効にしようとすると、エラーを返すので、その指示に従って、先に有効にすべきモジュールを有効化していく必要があります。
今回の場合、blosxom を動かすために、Perl で CGI が動作するように設定したので、有効にしたモジュールは以下の通り。
- cgid
- proxy
- proxy_fcgi
- rewrite
仕組み的には /etc/apache2/mods-available/ 以下にあるモジュールを読み込む設定ファイルへのリンクを a2enmod コマンドで /etc/apache2/mods-enabled/ 以下に作成して、永続的にモジュールを有効にするようになっています。
サイトの設定および有効化
次にサイトの設定ですが、Debian の Apache パッケージの場合、初期設定の段階で、/etc/apache2/sites-available/ の下に、000-default.conf というファイルがあって、これが有効になっています。
その内容は以下の通り
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
これは、VirtualHost で複数のサイトを運用する場合以外、できるだけ触らない方がいいと思います( ServerAdmin だけはちゃんと設定するくらい)。おそらく、複数のサイトを運用する場合は、これとは別にそれぞれに設定ファイルを作るのが、本来の作法だと直感的に思います。
今回も URL は一つなので、触っていません。これとは別に /etc/apache2/sites-available/ 以下に、以下のような中身のファイルを一つ作成して、これを a2ensite コマンドで有効にしています。
<Directory "/var/www/html">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Require all granted
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php-fpm:9000"
</FilesMatch>
</Directory>
設定している内容は、ドキュメントルート /var/www/html に対して、シンボリックリンクを辿れるようにする、.htaccess によるディレクトリ設定の上書きを有効化、そして、PHP に関しては PHP-FPM に渡すようにしているだけです。これで少なくとも WordPress は動作しました。
サイト設定を有効にする仕組みも、モジュールと同様で、こちらは a2ensite というコマンドの実行で /etc/apache2/sites-enabled/ 以下にリンクが作られ、設定が永続的に有効になります。無効にする場合は a2dissite です。
ちなみに、SSL を有効にするためのサイト設定は、初期導入時に /etc/apache2/sites-available/ 以下に default-ssl.conf というファイルが用意されているので、これを編集して a2ensite default-ssl とするようです。
初心者向けベストプラクティス
今回、初めて Debian の Apache パッケージを利用して、設定を行ったわけで、いきなりベストプラクティスと言うのは大それた感じがしますが、あまり深く Apache のチューニングをやったことのない人間としては、あちこちで設定ファイルを編集するより、サイト設定ファイルを一つ作って、(初期設定の上書きも含めて)ここに全てを書くというのが、今のところベストと考えています。
たいそうなチューニングをしないのなら、それが何より人間がわかりやすかろうと思います。このサイトも、今のところ、コンテナ化して効率が良くなって、さしたるチューニングは行っていません。