今月は新卒の研修ぶりくらいにnginxを触ったのですが、あまりになじみがなくて苦戦したので万一もう一度出会った時のために整理しておこうと思います。
まず、nginxの設定ファイルをいじるときは下記を見る。
sudo vi /etc/nginx/nginx.conf
🐈ファイル内でincludeしているのであればそちらに書き加えても問題なし
今回は認証処理の書き換えだったので下記のようなserverブロックを変更しました。
#例
server {
listen 80;
listen [::]:80;
server_name _;
include /etc/nginx/default.d/*.conf;
}
serverブロック内にifが欠けるのですが、なんとifのネストができない!
てっきりsudo nginx -tで指摘が入るとおもいきや、指摘されずerror.logに上がっていました。
条件はあっているはずなのに上手く動かないときはマメにエラーログも見ておくことをお勧めします。
エラーログの確認はsudo tail /var/log/nginx/error.log
ifのネストの代替
ifのネストの代わりにフラグを利用するようです。
set $is_A 0;
set $is_B 0;
set $is_C 0;
if ({your conditionA}) {
set $is_A 1;
}
if ({your conditionB}) {
set $is_B 1;
}
set $is_C "${is_A}${is_B}";
if ($is_C = "11") {
return 400;
}
ifとlocationの実行順
前から評価されていくのか……!?という疑問を基にDevelopment guideを発見しました。
ドキュメントでは
NGX_HTTP_SERVER_REWRITE_PHASE→NGX_HTTP_FIND_CONFIG_PHASE→NGX_HTTP_REWRITE_PHASE
となっているので、server直下のif文→location直下のif文となるようです。
認証などはさらにその後ですね。
# 1.NGX_HTTP_SERVER_REWRITE_PHASE
if ({your conditionA}) {
return 400;
}
# 2.NGX_HTTP_FIND_CONFIG_PHASE
location ~ /auth/ {
# 3.NGX_HTTP_REWRITE_PHASE
if ({your conditionB}) {
return 400;
}
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}
request_uriとuriは何が違う?
-
request_uri:オリジナルのURI -
uri:正規化されたURIで、内部リダイレクト実行時などに変更される可能性あり