あけましておめでとうございます、フライさんです。
ブログ機能があるのに誰も投稿してないので、せっかくならということで書いてみます 📝
🚴 TL;DR
/etc/nginx/templates/に置くファイルの拡張子は.conf.templateにしなきゃダメ
🗃️ Template機能
(Template機能は正式な名前ではないですが便宜上こう呼びます)
もともとのnginxにはない機能ですが、Docker版のnginxには環境変数の中身を設定ファイルに展開するというイカした機能があります。
listen ${NGINX_LISTEN_PORT};
こんな風に書くと環境変数が展開されます。
こんな感じで書いた設定テンプレートファイルを/etc/nginx/templates/ディレクトリに
XXX.templateという形式のファイル名でコンテナ内に配置すると、
コンテナが起動したときに、環境変数が展開された設定ファイルが展開され、/etc/nginx/conf.dに
XXXという名前で配置されます。
(/etc/nginx/templates/web-server.conf.template → /etc/nginx/conf.d/web-server.conf といった具合に)
🤦 動かない
あるPJでnginxをこねこねしていたときこれを知り、 「こりゃ便利だ、使ってみよう」 となったので、
conf.templateを作成し/etc/nginx/templates/にぶん投げ、コンテナ起動。
ぼく「さぁ、できてるかな?」
ぼく「http://localhost:12739/login[1]、オラァッ!!!!!!!!!!!!!!!!!!!!!」
Dockerコンテナ「404 Not found」
ぼく「ンヒィッ」
🤔 なんでよ
🔍 原因を探る
いろいろ原因を洗い出してみて、調査してみましたが…
-
展開されてない? (テンプレートファイル置く場所ミスとかファイル名ミスとか)
➡️ コンテナ内の/etc/nginx/conf.dにconfという名前で展開されてた
➡️ 加えてdockerのログにも「conf.templateを展開したぜ!」というログが出てた -
設定ファイルがおかしい?
➡️/etc/nginx/nginx.confを上書きして環境変数を手動で展開して動かしてみたら動いた -
あえて構文ミスさせてみる
➡️ エラーログは観測できず
ということは、設定ファイルが読み込まれてないということになります。
🏄 読み込まれない原因を探る
ググったり/etc/nginx/conf.dの中身をつんつんしたりしてもなかなか動かない中、
/etc/nginx/nginx.confにある記述を見つけました。
include /etc/nginx/conf.d/*.conf;
ファイル名の最後に .conf がつくファイルが読み込まれることが見て取れますね。
そういえば、展開されたファイルの名前は conf でしたが…んっ?
🤸 そして問題解決へ
コンテナにぶん投げるファイルの名前をconf.templateから web.conf.templateへリネーム、
コンテナへぶん投げました。結果…
nginx「あーーーー待て、web.confにセミコロンないやん、ダメ!起動できません!」
ぼく「ッッッッッウシッッッッッッッッッッッッッッッッッッッッッッッッッッッ!!!!!!!!!!!!!!!!!!!!!!!!!!!」
ちゃんと読み込めました。
📖 わかったこと
/etc/nginx/templates/に置くファイル名の拡張子は.conf.template
.templateを消したときに、拡張子が.confになればOK。app.set.templateとかは拡張子が.setになるのでダメです- 設定ファイルに適当な名前をつけるのはやめたほうがいい
👋 おわりに
初ブログがお粗末になってしまった、またリベンジしたいと思います。
12739は適当に決めたポート番号です。キーボードの数字キーの上に指を添え、同時にすべてのキーを押して決めます。 ↩︎