GMOプライムストラテジー「KUSANAGI」開発チームの石川です。
KUSANAGIでは、ほとんどの設定をKUSANAGIコマンドを使用して行うように設計されています。そのため、KUSANAGIコマンドを使用して環境の構築を行っていれば設定ファイルを直接編集することはほぼありませんが、様々な事情で設定をカスタマイズしたい場合があると思います。
今回は「設定ファイルのカスタマイズ (Nginx編)」として、Nginxの設定ファイルをカスタマイズする方法を解説します。
設定ファイルのパス
KUSANAGIでは複数のミドルウェアを使用しています。しかし、標準のAlmaLinux OSのRPMではなく、KUSANAGI開発元のGMOプライムストラテジーが提供しているRPMパッケージがあります。Nginxもそのようなパッケージの1つです。
GMOプライムストラテジーで提供しているパッケージでは、AlmaLinux OSのRPMパッケージと競合 (conflict) しないように、標準とは異なるパスにインストールしています。そのため、設定ファイルのパスが標準とは異なっています。
KUSANAGIではNginxの設定ファイルは /etc/opt/kusanagi/nginx 以下にあります。これをNginxの設定ファイルのディレクトリと呼びます。
プロファイルごとの設定ファイルも /etc/opt/kusanagi/nginx/conf.d 以下にあります。これをプロファイルごとの設定ファイルのディレクトリと呼びます。
なお、KUSANAGI Security EditionではKUSANAGI Free Edition, Business Edition, Premium Editionとはパスが異なります。KUSANAGI Security Editionではミドルウェアの複数のバージョンを組み合わせて運用できるようするために、バージョンごとにパスを変えているためです。KUSANAGI Security Editionにおけるパスについては「ミドルウェアの設定ファイル・ログファイルのパス」を合わせて参照してください。
KUSANAGIの設定ファイルの構成
nginx.conf
一般的にNginxでは nginx.conf に設定を記載します。 nginx.conf はNginxの設定ファイルのディレクトリにあります。KUSANAGIにも nginx.conf はありますが、KUSANAGIコマンドで設定を行えるように、直接 nginx.conf を編集しないように設計されています。
Nginxでは他の設定ファイルを読み込む include というディレクティブがあります。KUSANAGIはこの include を活用して、編集しない nginx.conf から編集できる 他の設定ファイル を読み込むようにしています。
| ファイル名 | 抜粋 | 備考 |
|---|---|---|
| nginx.conf | include conf.d/*.conf; | conf.d/*.conf を読み込む |
これにより conf.d (プロファイルごとの設定ファイルのディレクトリ) の *.conf を読み込まれます。この仕組みを利用して、後述するプロファイルの設定ファイルや、いくつかのデフォルトの設定を記述した設定ファイルを読み込んでいます。
プロファイルの設定ファイル
プロファイルの設定ファイルは、プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/nginx/conf.d 以下にあります。仮にプロファイル名が PROFILE とします。また、プロファイルの種類によって設定ファイルの名前が変わります。
これらファイルはプロファイルをプロビジョンした際に自動的に生成されます。
| ファイル名 | 説明 |
|---|---|
| conf.d/PROFILE.conf | プロファイルの設定ファイル。http/httpsの server を定義 |
| conf.d/PROFILE.TYPE.conf | プロファイルの種類ごとの設定ファイル WordPress: PROFILE.wp.inc Drupal: PROFILE.drupal.inc LAMP: PROFILE.lamp.inc FCGI: PROFILE.fcgi.inc Movable Type: PROFILE.mt.inc |
それぞれの設定ファイルでは、KUSANAGIで定義している共通の設定ファイル (incファイル) を include しています。
| ファイル名 | 抜粋 | 備考 |
|---|---|---|
| conf.d/PROFILE.conf | include conf.d/505.inc; | エラーを表示するための定義 |
| include conf.d/favicon.inc; | faviconのための定義 | |
| include conf.d/acme.inc; | Let's Encryptで証明書を自動更新するための定義 | |
| include conf.d/PROFILE.TYPE.conf | プロファイルの種類ごとの設定ファイル | |
| include conf.d/static.inc; | 静的ファイルのための定義 | |
| include conf.d/fcache_purge.inc; | fcacheのための定義 | |
| conf.d/PROFILE.TYPE.conf | include conf.d/wp-multisite.inc; | WordPressのマルチサイトに関する定義 |
| include conf.d/wp-plugins.inc; | WordPressのプラグインに関する定義 | |
| include conf.d/ratelimit.inc; | ratelimitのための定義 | |
| include naxsi.d/wordpress/*.conf; | WAF (NAXSI) のための定義 | |
| conf.d/ssl_st.inc; | HTSTのための定義 | |
| conf.d/fastcgi.inc; | fcacheのための定義 | |
| conf.d/fastcgi_cache.inc; | fcacheのための定義 |
カスタマイズできない設定ファイル
nginx.conf 、および、プロファイルの設定ファイルから読み込まれる設定ファイルには、RPMパッケージの更新によって上書きされるものがあります。そのため、これらの設定ファイルはカスタマイズできません。
以下はその一例です。なお、デフォルトで使用されないファイルは除いています。(全て /etc/opt/kusanagi/nginx からの相対パスです)
| ファイル名 | 備考 |
|---|---|
| fastcgi_params | |
| mime.types | |
| nginx-production.conf | KUSANAGI Security Editionのみ |
| nginx-proxy.conf | KUSANAGI Security Editionのみ |
| nginx-staging.conf | KUSANAGI Security Editionのみ |
| nginx-with_httpd.conf | KUSANAGI Free Edition, Business Edition, Premium Editionのみ |
| nginx.conf | |
| conf.d/505.inc | |
| conf.d/acme.inc | |
| conf.d/backend.inc | KUSANAGI Security Editionのみ |
| conf.d/fastcgi.inc | |
| conf.d/fastcgi_cache.inc | |
| conf.d/fastcgi_container.inc | |
| conf.d/favicon.inc | |
| conf.d/fcache_purge.inc | |
| conf.d/fcgi.inc | |
| conf.d/naxsi.inc | |
| conf.d/proxy.inc | |
| conf.d/proxy_cache.inc | |
| conf.d/proxy_purge.inc | |
| conf.d/quic_default_server.conf | |
| conf.d/ratelimit.inc | |
| conf.d/security.conf | |
| conf.d/ssl.inc | |
| conf.d/ssl_listen.inc | |
| conf.d/ssl_st.inc | |
| conf.d/static.inc | |
| conf.d/wp-multisite.inc | |
| conf.d/wp-plugins.inc |
カスタマイズできる設定ファイル
プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/nginx/conf.d 以下にあるプロファイルの設定ファイル (PROFILE.conf および PROFILE.TYPE.inc) はカスタマイズが可能です。
任意の location を追加したり、既存の location に任意のディレクティブを追加することができます。なお、既存の location を変更したり、削除することもできますが、KUSANAGIコマンドの中には特定の location の存在を条件にしているものがあるため、十分に注意して行ってください。また、同様の理由から include を削除したり変更することはおすすめしません。
カスタマイズの指針
KUSANAGIの設定ファイルの構成と、カスタマイズできる設定ファイル・できない設定ファイルから、具体的にどのようにカスタマイズを行えばよいかを説明します。
KUSANAGI (VM) 全体に設定する場合
特定のサイト (プロファイル) ごとではなく、KUSANAGIのVM全体で有効にしたい設定がある場合には、 /etc/opt/kusanagi/nginx/conf.d 以下にプロファイル名と被らない設定ファイルを作成し、 nginx.conf の include により自動的に読み込む方法を推奨します。
例えば、ドメイン名 (FQDN) に一致しなかった場合に404応答するデフォルトサーバを定義したい1場合には、以下のような内容で conf.d/default_server.conf を作成します。
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/pki/tls/certs/localhost.crt;
ssl_certificate_key /etc/pki/tls/private/localhost.key;
server_name localhost;
location / {
return 404;
break;
}
}
Nginxに詳しい方向けに説明すると、 nginx.conf の include は http コンテキスト内で記述されているので、 http コンテキストで記述できるディレクティブを定義ができます ( server は http コンテキスト内に記述できるディレクティブです) 。
他には以下のような map ディレクティブが該当します。なお、map で宣言された変数を使用するには、先に map で定義する必要があります。Nginxの include はアルファベット順で設定ファイルを読み込むため、 _ (アンダースコア) で始まる設定ファイル (例えば conf.d/_mobile_map.conf ) を作成することで、他の設定ファイルよりも先に読み込むことができます。
map $http_user_agent $mobile {
default 0;
"~Opera Mini" 1;
}
プロファイルごとに設定する場合
特定のサイト (プロファイル) ごとに有効にしたい設定がある場合には、 /etc/opt/kusanagi/nginx/conf.d 以下にあるプロファイルの設定ファイル (PROFILE.conf および PROFILE.TYPE.inc) をカスタマイズする方法を推奨します。
PROFILE.confをカスタマイズする
HTTP/HTTPSで異なる内容をカスタマイズする場合には、 conf.d/PROFILE.conf をカスタマイズします。この設定ファイルは以下のような形式になっています。
例えば HTTP で特定のリダイレクトを行いたい場合などには、上のブロックに記述します。
server {
listen 80;
listen [::]:80;
// HTTPに関する内容
}
server {
include conf.d/ssl_listen.inc;
// HTTPSに関する内容
}
Nginxに詳しい方向けに説明すると、 それぞれ server コンテキストで記述できるディレクティブを定義ができます。
PROFILE.TYPE.incをカスタマイズする
HTTP/HTTPSで共通の内容をカスタマイズする場合には、 conf.d/PROFILE.TYPE.inc をカスタマイズします。HTTPSでのみ運用しているサイトであっても、ロードバランサー経由などでHTTPでアクセスを受ける場合があります。サイトに関する設定は共通の内容に記述することをおすすめします。
例えば、新しい location に関する処理を追加する場合が該当します。
index index.php index.html index.htm;
(略)
location ~* /secret {
satisfy all;
deny all;
}
(略)
なお、Nginxの location ディレクティブは書く順番によって動作が変わります。詳細は Nginxのlocationの書き方で注意すること や Nginxのlocationでアクセス制限をかける際の落とし穴 を参照してください。
カスタマイズできない設定ファイルを変更する場合
どうしてもRPMパッケージが提供しているカスタマイズできない設定ファイルを変更する場合は、次の点に気を付けてください。
- 変更が巻き戻る可能性があることを認識して、変更したファイルもバックアップしておく。
- dnf upgrade等でアップデートを行った後は設定ファイルを確認し、必要に応じて変更を再度反映する。
カスタマイズの確認と反映
設定ファイルのテスト
設定ファイルに加えた変更をテストするには以下のコマンドを使用します。
# kusanagi nginx --test
設定ファイルの反映
設定ファイルに加えた変更を反映するには以下のコマンドを使用します。なお、--reloadを指定した場合には同時にテストも行います。この際にテストがエラーとなった場合にはリロードは行いません。
# kusanagi nginx --reload
KUSANAGI Security Editionでの注意事項
KUSANAGI Security EditionではWebサーバ構成によって参照する設定ファイルが変わります。
プロファイルごとの設定ファイルのディレクトリである /etc/opt/kusanagi/nginx/conf.d 以下のファイルを雛形として、それぞれのWebサーバ構成に合わせて設定ファイルを生成します。そのため、常にカスタマイズは /etc/opt/kusanagi/nginx/conf.d 以下のファイル に行ってください。また、変更を反映するには各 kusanagi コマンドに --test/--reload をつけて実行してください。
参考
- デフォルトサーバ (default_server) の定義がない場合、Nginxは最初にマッチした server コンテキストの内容を返します。これは、アルファベット順で検索した最初のプロファイルの設定ファイルになります。 ↩︎



