Debian における Apache の設定の作法

投稿者: | 2023年5月3日

今回、このサイトのコンテナ化に当たって、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 のチューニングをやったことのない人間としては、あちこちで設定ファイルを編集するより、サイト設定ファイルを一つ作って、(初期設定の上書きも含めて)ここに全てを書くというのが、今のところベストと考えています。

たいそうなチューニングをしないのなら、それが何より人間がわかりやすかろうと思います。このサイトも、今のところ、コンテナ化して効率が良くなって、さしたるチューニングは行っていません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です