Nginxの設定ファイルdefault.conf
を部分的に(環境ごとに)異なる設定を行いたかったため、locationディレクティブを別ファイルを分割しました。そこで思ったより苦労したのでメモ書きします。
この設定を後でDockerfileから読み込ませて運用する想定です。
分割したいdefault.conf
まず、分割したいdefault.conf
は下記のような状態です。
location
ディレクティブでlocation /user/login
、location /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.conf
もdefault.conf
と同じ設定ファイルとして読み込まれてしまい、エラーとなる訳です。
それを回避するため、dev.conf
をetc/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