2023.12.14  

【Nginx】default.confを部分的にファイルを分けて管理したい

Nginx    

Nginxの設定ファイルdefault.confを部分的に(環境ごとに)異なる設定を行いたかったため、locationディレクティブを別ファイルを分割しました。そこで思ったより苦労したのでメモ書きします。

この設定を後でDockerfileから読み込ませて運用する想定です。

分割したいdefault.conf

まず、分割したいdefault.confは下記のような状態です。
locationディレクティブでlocation /user/loginlocation /user/reset-passwordと設定している箇所は環境によりpassが異なるのでファイルを分けたいです。
default.conf/etc/nginx/conf.dに配置することで読み込まれます。

# /etc/nginx/conf.d/default.conf

server {
    # NGINXの受付ポート
    listen       4000;
    server_name  nginx;

    # 最大転送ファイルサイズ設定
    client_max_body_size 200M;

    # タイムアウト時間の設定(秒)
    proxy_read_timeout 60;
    proxy_connect_timeout 60;
    proxy_send_timeout 60;

    # ヘッダー情報設定
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 通常の通信は127.0.0.1(localhost)に飛ばす
    location / {
  
        proxy_pass http://127.0.0.1:3000;
    }

    # 上記以外はapiサーバーに通信を行う。passのdev部分は環境によりことなるのでファイルを分けたい
    location /user/login {
        proxy_pass "https://api.dev.jp/user/login";
    }
    location /user/reset-password {
        proxy_pass "https:/api.dev.jp/user/reset-password";
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

default.confを分割

default.confを分割を分割すると下記のようになります。
ポイントとしては分割したファイルを/etc/nginx/conf.d以外におくもしくは拡張子を.confにしないことです。

# /etc/nginx/conf.d/default.conf

server {
    # NGINXの受付ポート
    listen       4000;
    server_name  nginx;

    # 最大転送ファイルサイズ設定
    client_max_body_size 200M;

    # タイムアウト時間の設定(秒)
    proxy_read_timeout 60;
    proxy_connect_timeout 60;
    proxy_send_timeout 60;

    # ヘッダー情報設定
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 通常の通信は127.0.0.1(localhost)に飛ばす
    location / {
        proxy_pass http://127.0.0.1:3000;
    }

    # 各環境の設定を別ファイルから読み込む(includeなどのディレクトリを自分で作成して子ファイルを置く)
    include /etc/nginx/conf.d/include/dev.conf;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# /etc/nginx/conf.d/include/dev.conf

location /user/login {
    proxy_pass "https://api.dev.jp/user/login";
}
location /user/reset-password {
    proxy_pass "https:/api.dev.jp/user/reset-password";
}

今回分割したファイル名はdev.confとしていますが、etc/nginx/conf.dでこちらのファイルを読み込ませるとディレクティブの宣言場所がおかしいとエラーになってしまいます。(locationディレクティブはserverディレクティブの中で宣言しないといけない)

つまり、dev.confdefault.confと同じ設定ファイルとして読み込まれてしまい、エラーとなる訳です。

それを回避するため、dev.confetc/nginx/conf.d以外で作成します。
そうすることで上記ファイルは問題なく読み込まれます。

今回dev.confを配置している/etc/nginx/conf.d/includeディレクトリは私が作成したものであり、デフォルトでは存在しません。

分割ファイルは他の適当なディレクトリか自作ディレクトリに配置しましょう。

includeで指定しているファイル名をDockerfile内で変える

次のようなDockerfileを作成してdocker build --build-arg TARGET=stg .と実行するとdefault.confのincludeで指定していたファイル名がdev.conf からstg.confになる仕組みです。

# Dockerfile
FROM nginx:latest

# 引数から変数を取得
ARG TARGET
ENV environment=$TARGET

# 環境情報ファイル配置ディレクトリ作成
WORKDIR /etc/nginx/conf.d/include

# 環境情報ファイル配置
ADD "./nginx/${environment}.conf" "/etc/nginx/conf.d/include"

# default.conf配置
ADD ./nginx/default.conf /etc/nginx/conf.d/default.conf

# default.confの中で読み込むファイル名を環境毎に書き換える
RUN sed -i "s/dev/${environment}/g" /etc/nginx/conf.d/default.conf

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信