GMOプライム・ストラテジー「KUSANAGI」開発チームの石川です。
KUSANAGIでは、ほとんどの設定をKUSANAGIコマンドを使用して行うように設計されています。そのため、KUSANAGIコマンドを使用して環境の構築を行っていれば設定ファイルを直接編集することはほぼありませんが、様々な事情で設定をカスタマイズしたい場合があると思います。
前回の KUSANAGIの設定ファイルのカスタマイズ (Nginx編) に続いて、今回は「設定ファイルのカスタマイズ (Apache HTTP Server編)」Apache HTTP Serverの設定ファイルをカスタマイズする方法を解説します。
設定ファイルのパス
KUSANAGIでは複数のミドルウェアを使用しています。しかし、標準のAlmaLinux OSのRPMではなく、KUSANAGI開発元のGMOプライム・ストラテジーが提供しているRPMパッケージがあります。Apache HTTP Serverもそのようなパッケージの1つです。
GMOプライム・ストラテジーで提供しているパッケージでは、AlmaLinux OSのRPMパッケージと競合 (conflict) しないように、標準とは異なるパスにインストールしています。そのため、設定ファイルのパスが標準とは異なっています。
KUSANAGIではApache HTTP Serverの設定ファイルは /etc/opt/kusanagi/httpd 以下にあります。これをApache HTTP Serverの設定ファイルのディレクトリと呼びます。
プロファイルごとの設定ファイルも /etc/opt/kusanagi/httpd/conf.d 以下にあります。これをプロファイルごとの設定ファイルのディレクトリと呼びます。
また、利用するモジュールをロードする LoadModule を定義した設定ファイルは /etc/opt/kusanagi/httpd/conf.modules.d 以下にあります。
なお、KUSANAGI Security EditionではKUSANAGI Free Edition, Business Edition, Premium Editionとはパスが異なります。KUSANAGI Security Editionではミドルウェアの複数のバージョンを組み合わせて運用できるようするために、バージョンごとにパスを変えているためです。KUSANAGI Security Editionにおけるパスについては「ミドルウェアの設定ファイル・ログファイルのパス」を合わせて参照してください。
KUSANAGIのApache HTTP Serverのモジュール構成
KUSANAGIではパフォーマンスを重視して以下のモジュールを利用しています。
- mpm_event_module
- cgid_module
- proxy_fcgi_module
MPMにはeventを利用します。prefork および worker は動作しますが、サポート対象外です。
PHPはproxy_fcgiを利用して、php-fpmで実行します。mod_phpは利用できません。
デフォルトで読み込まれるモジュールについては以下のコマンドで確認できます。
# /opt/kusanagi/sbin/httpd -M
Security Editionの場合
# /opt/kusanagi/httpd24/sbin/httpd -M
利用できる全てのモジュールは以下に配置されています。
/opt/kusanagi/lib64/httpd/modules
Security Editionの場合
/opt/kusanagi/httpd24/lib64/httpd/modules
Apache HTTP Serverのバージョン、および、KUSANAGIでリンクしているライブラリとそのバージョンの違いから、AlmaLinux OSやEPEL等の他のRPMで配布されているモジュールを利用することはできません。
KUSANAGIの設定ファイルの構成
httpd.conf
一般的にApache HTTP Serverでは httpd.conf に設定を記載します。 httpd.conf はApache HTTP Serverの設定ファイルのディレクトリにあります。KUSANAGIにも httpd.conf はありますが、KUSANAGIコマンドで設定を行えるように、直接 httpd.conf を編集しないように設計されています。
Apache HTTP Serverでは他の設定ファイルを読み込む Include と IncludeOptional というディレクティブがあります。KUSANAGIはこのディレクティブを活用して、編集しない httpd.conf から編集できる 他の設定ファイル を読み込むようにしています。
| ファイル名 | 抜粋 | 備考 |
|---|---|---|
| httpd.conf | Include conf.modules.d/*.conf | conf.modules.d/*.conf を読み込む |
| IncludeOptional conf.d/*.conf | conf.d/*.conf があれば読み込む |
これにより conf.modules.d (LoadModuleの設定ファイルのディレクトリ) の *.conf と conf.d (プロファイルごとの設定ファイルのディレクトリ) の *.conf を読み込まれます。この仕組みを利用して、後述するプロファイルの設定ファイルや、いくつかのデフォルトの設定を記述した設定ファイルを読み込んでいます。
プロファイルの設定ファイル
プロファイルの設定ファイルは、プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/httpd/conf.d 以下にあります。仮にプロファイル名が PROFILE とします。また、プロファイルの種類によって Include する設定ファイルが異なります。
これらファイルはプロファイルをプロビジョンした際に自動的に生成されます。
| ファイル名 | 説明 |
|---|---|
| conf.d/PROFILE.conf | プロファイルの設定ファイル。http/httpsの VirtualHost を定義 |
| ファイル名 | 抜粋 | 備考 |
|---|---|---|
| conf.d/PROFILE.conf | Include conf.d/wp.inc | WordPressのための定義 |
| Include conf.d/wp.inc | Drupalのための定義 | |
| Include conf.d/lamp.inc | LAMPのための定義 | |
| Include conf.d/fcgi.inc | FCGIのための定義 | |
| Include conf.d/mt.inc | Movable Typeのための定義 | |
| Include conf.d/ssl.inc | SSLのための定義 | |
| IncludeOptional modsecurity.d/kusanagi_activated_rules/wordpress/*.conf | WAF (mod_security) のための定義 (WordPress) | |
| IncludeOptional modsecurity.d/kusanagi_activated_rules/general/*.conf | WAF (mod_security) のための定義 (WordPress以外) |
カスタマイズできない設定ファイル
httpd.conf 、および、プロファイルの設定ファイルから読み込まれる設定ファイルには、RPMパッケージの更新によって上書きされるものがあります。そのため、これらの設定ファイルはカスタマイズできません。
以下はその一例です。なお、デフォルトで使用されないファイルは除いています。(全て /etc/opt/kusanagi/httpd からの相対パスです)
| ファイル名 | 備考 |
|---|---|
| magic | |
| mime.types | |
| httpd-production.conf | KUSANAGI Security Editionのみ |
| httpd-staging.conf | KUSANAGI Security Editionのみ |
| httpd-with_nginx.conf | KUSANAGI Free Edition, Business Edition, Premium Editionのみ |
| httpd.conf | |
| conf.d/autoindex.conf | |
| conf.d/drupal.inc | |
| conf.d/fcgi.inc | |
| conf.d/lamp.inc | |
| conf.d/mt.inc | |
| conf.d/php.conf | |
| conf.d/security.conf | |
| conf.d/ssl.conf | |
| conf.d/ssl.inc | |
| conf.d/userdir.conf | |
| conf.d/wp.inc | |
| conf.modules.d/00-base.conf | |
| conf.modules.d/00-brotli.conf | |
| conf.modules.d/00-dav.conf | |
| conf.modules.d/00-headers.conf | |
| conf.modules.d/00-http2.conf | |
| conf.modules.d/00-mpm.conf | |
| conf.modules.d/00-proxy.conf | |
| conf.modules.d/00-ssl.conf | |
| conf.modules.d/01-cgi.conf |
カスタマイズできる設定ファイル
プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/httpd/conf.d 以下にあるプロファイルの設定ファイル (PROFILE.conf) はカスタマイズが可能です。
任意の Directory や Files を追加したり、既存の Directory に任意のディレクティブを追加することができます。なお、既存の Directory を変更したり、削除することもできますが、KUSANAGIコマンドの中には特定の Directory の存在を条件にしているものがあるため、十分に注意して行ってください。また、同様の理由から Include や IncludeOptional を削除したり変更することはおすすめしません。
カスタマイズの指針
KUSANAGIの設定ファイルの構成と、カスタマイズできる設定ファイル・できない設定ファイルから、具体的にどのようにカスタマイズを行えばよいかを説明します。
利用するモジュールを追加する場合
KUSANAGIではデフォルトで有効にしていないモジュールを利用したい場合は、 /etc/opt/kusanagi/httpd/conf.modules.d 以下に既存のファイル名と被らない設定ファイルを作成し、 httpd.conf の Include により自動的に読み込ませる方法を推奨します。
利用できるモジュールについては KUSANAGIのApache HTTP Serverのモジュール構成 を参照してください。
kusanagiコマンドで行える場合
kusanagiコマンドで行えるカスタマイスは、kusanagiコマンドを使用してください。以下が該当します。
| 目的 | kusanagiコマンド |
|---|---|
| FQDNを変更する | kusanagi configureコマンド |
| SSL証明書を更新・変更する | kusanagi sslコマンド |
| WAF (mod_security) を有効・無効にする | kusanagi wafコマンド |
KUSANAGIは様々な Webサーバ構成 をサポートしています。ユーザーが望んだときにいつでも切り替えが行えるように、Apache HTTP ServerとNginxの設定内容を同期するようにしています。そのため、手動でApache HTTP Serverの設定ファイルのみを変更すると、Nginxに切り替えた際に設定が正常に反映できない場合があります。
KUSANAGI (VM) 全体に設定する場合
特定のサイト (プロファイル) ごとではなく、KUSANAGIのVM全体で有効にしたい設定がある場合には、 /etc/opt/kusanagi/httpd/conf.d 以下にプロファイル名と被らない設定ファイルを作成し、 httpd.conf の IncludeOptional により自動的に読み込ませる方法を推奨します。
例えば、ドメイン名 (FQDN) に一致しなかった場合に404応答するデフォルトサーバを定義したい1場合には、以下のような内容で conf.d/default_server.conf を作成します。
<VirtualHost _default_:80>
Redirect 404 /
</VirtualHost>
<VirtualHost _default_:443>
Redirect 404 /
Include conf.d/ssl.inc
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLOpenSSLConfCmd DHParameters "/etc/opt/kusanagi/ssl/dhparam.key"
</VirtualHost>
Apache HTTP Serverに詳しい方向けに説明すると、 httpd.conf の IncludeOptional は server config コンテキスト内で記述されているので、 server config コンテキストで記述できるディレクティブを定義ができます ( VirtualHost は server config コンテキスト内に記述できるディレクティブです) 。
他には既に httpd.conf で定義されているディレクティブを変更することもできます。Apache HTTP Serverでは同一のディレクティブを定義した場合には後勝ちとなるため、IncludeOptional で指定したファイルの内容で上書きすることができます。
MaxKeepAliveRequests 500
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
ServerLimit 16
MaxRequestWorkers 400
MaxConnectionsPerChild 2000
</IfModule>
プロファイルごとに設定する場合
特定のサイト (プロファイル) ごとに有効にしたい設定がある場合には、 /etc/opt/kusanagi/httpd/conf.d 以下にあるプロファイルの設定ファイル (PROFILE.conf) をカスタマイズする方法を推奨します。
PROFILE.confをカスタマイズする
HTTP/HTTPSで異なる内容をカスタマイズする場合には、 conf.d/PROFILE.conf をカスタマイズします。この設定ファイルは以下のような形式になっています。
例えば HTTP で特定のリダイレクトを行いたい場合などには、上のブロックに記述します。
<VirtualHost *:80>
# HTTPに関する内容
</VirtualHost>
<VirtualHost *:443>
# HTTPSに関する内容
</VirtualHost>
Apache HTTP Serverに詳しい方向けに説明すると、 それぞれ virtual host コンテキストで記述できるディレクティブを定義ができます。
なお、HTTP/HTTPSで共通の内容をカスタマイズする場合には、 HTTP/HTTPSの両方のブロックに記述します。HTTPSでのみ運用しているサイトであっても、ロードバランサー経由などでHTTPでアクセスを受ける場合があります。サイトに関する設定は共通の内容に記述することをおすすめします。
カスタマイズできない設定ファイルを変更する場合
どうしてもRPMパッケージが提供しているカスタマイズできない設定ファイルを変更する場合は、次の点に気を付けてください。
- 変更が巻き戻る可能性があることを認識して、変更したファイルもバックアップしておく。
- dnf upgrade等でアップデートを行った後は設定ファイルを確認し、必要に応じて変更を再度反映する。
カスタマイズの確認と反映
設定ファイルのテスト
設定ファイルに加えた変更をテストするには以下のコマンドを使用します。
# kusanagi httpd --test
設定ファイルの反映
設定ファイルに加えた変更を反映するには以下のコマンドを使用します。なお、--reloadを指定した場合には同時にテストも行います。この際にテストがエラーとなった場合にはリロードは行いません。
# kusanagi httpd --reload
KUSANAGI Security Editionでの注意事項
KUSANAGI Security EditionではWebサーバ構成によって参照する設定ファイルが変わります。
プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/httpd/conf.d 以下のファイルを雛形として、それぞれのWebサーバ構成に合わせて設定ファイルを生成します。そのため、常にカスタマイズは /etc/opt/kusanagi/httpd/conf.d 以下のファイル に行ってください。また、変更を反映するには各 kusanagi コマンドに --test/--reload をつけて実行してください。



