先日今年最後と言いつつ、友人からnginxの設定がわけわからんと質問されて新たなネタができたので本当の最後と思ってきいてくださいな。
問題、設定Aの直接の子は?
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/**.tech/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/**.tech/privkey.pem;
index index.html index.php index.htm;
server_name **.tech;
#--CONF A--#
location ~ /\.ht {
deny all;
#--CONF B--#
}
location / {
location ~* \.(jpg|jpeg|png|css)$ {
access_log off;
#--CONF C--#
}
#--CONF D--#
}
}
便宜上親子とか言ってしまいますね。しかし設定の読み込みに明確な親子関係はありません。
BCD全部と答えた場合なかなかだけれど、基本的にnginxに親子はなく各設定項目は「項目の性質」と「locationの優先順位と読まれる順番」を総合で判断します。
心配なら同じことでも二回書きましょう。安心してください、致命的な項目を間違えて二重設定したら、致命傷を追わせて起動できないだけですから…
大事なことなので二回言います。不安なら二回書くほうがすっきりします。
locationで一致した場合は{}内へすすみ、設定の上書きや付け足しをして、一度入ったかっこからはもう出ない。
例えばプロキシサーバーを設定すると、取りに行くか行かないかと目に見えた結果があるのでわかり易いです。
上記は条件によってCを追加してDに進むかの如く見えます。しかし、実際は下記のようにしないといけません。
#--CONF A--#
proxy_set_header X-Arekore nanikore;
location / {
location ~* \.(jpg|jpeg|png|css)$ {
access_log off;
#--CONF C--#
set $proxuri https://host418.jpu.jp/;
proxy_pass $proxuri$uri;
proxy_ssl_server_name on;
proxy_set_header X-C-Dake nanikore;
}
#--CONF D--#
proxy_pass https://host418.jpu.jp/;
proxy_ssl_server_name on;
proxy_set_header X-CD-Dake nanikore;
}
こんな感じで二度手間なことしないとだめです。
ただこの場合Aに書いたproxy_set_headerはCDで有効(Bでは意味をなさない)になります。Dに書いたproxy_set_headerはCD有効だけれど、D時にCのproxy_passは実行されません。
じゃぁ下記でどうだ!って思った方、鋭い、でも...
#--CONF A--#
proxy_set_header X-Arekore nanikore;
location / {
location ~* \.(jpg|jpeg|png|css)$ {
access_log off;
#--CONF C--#
proxy_set_header X-C-Dake nanikore;
}
#--CONF D--#
set $proxuri https://host418.jpu.jp/;
proxy_pass $proxuri$uri;
proxy_ssl_server_name on;
proxy_set_header X-CD-Dake nanikore;
}
あら不思議、泣きの502になってしまいます。
ということで親も子もない、設定項目によって違うのでとてもややこしいです!
まとめると…
サーバーなのでバージョンアップしたとたん挙動が変わるとかなり危険です。バージョンアップされても優先順位の仕様が変えられず、設定項目ごとにネスト時の挙動が決められてきました。
なんでこんなに設定がややこしいんだって回答になりましたでしょうか?
これが仕様書読んでもよくわからないとチマタで騒がれるゆえんです。
演算子ありなし時の優先順位とか、URIの最後のスラッシュ有り無しなどは他サイトに詳しいページがあるので割愛します。
疑問を解決出来たところで良い年越しをーーー
2023/12/15
--------------------------------