速さの理由を知る。安全の仕組みを知る。WordPress運用の「なぜ?」を解く技術コラム。

KUSANAGIの設定ファイルのカスタマイズ (Nginx編)

石川英典
LinuxKUSANAGIOSSNginx

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.confinclude 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.confinclude 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.confinclude 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.confKUSANAGI Security Editionのみ
nginx-proxy.confKUSANAGI Security Editionのみ
nginx-staging.confKUSANAGI Security Editionのみ
nginx-with_httpd.confKUSANAGI Free Edition, Business Edition, Premium Editionのみ
nginx.conf
conf.d/505.inc
conf.d/acme.inc
conf.d/backend.incKUSANAGI 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.confinclude により自動的に読み込む方法を推奨します。

例えば、ドメイン名 (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.confincludehttp コンテキスト内で記述されているので、 http コンテキストで記述できるディレクティブを定義ができます ( serverhttp コンテキスト内に記述できるディレクティブです) 。

他には以下のような 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 をつけて実行してください。

参考

  1. デフォルトサーバ (default_server) の定義がない場合、Nginxは最初にマッチした server コンテキストの内容を返します。これは、アルファベット順で検索した最初のプロファイルの設定ファイルになります。 ↩︎

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解