nginxでGoogle認証させる際recursive_error_pagesで嵌った話
はじめに
開発環境で動いているものを特定のIP外から見たいときが時々ある(例: 社内IPから許可している場合に自宅から見たいなど)
そんな時はGatewayサーバーからProxyをしてもいいが、都度都度設定するのは面倒なので
nginx-omnioath-adapterのGolangポートを作った
を参考にGoogle認証をかけることにした
設定
server {
listen 80;
server_name nginx.example.hoge;
include /etc/nginx/include/go-nginx-oauth2-adapter.conf;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
error_page 418 = @auth_required;
recursive_error_pages on;
if ($internal_access = 0) {
return 418;
}
proxy_pass http://some-app;
}
location @auth_required {
include /etc/nginx/include/auth-request.conf;
proxy_pass http://some-app;
}
}
これが正常に動いているnginxの設定の一部です。
しかし作業の途中
recursive_error_pages on;
を記述していなくて、認証の前にエラーになってしまった。
recursive_error_pages
nginxの公式ドキュメント を見ると
Enables or disables doing several redirects using the error_page directive.
The number of such redirects is limited.
とあり
error_page
を使用して複数回リダイレクトさせることを有効/無効にする。 リダイレクト回数は制限されています。 とのこと
ちなみに、デフォルトは無効になっています。
つまり、これの設定が有効になっていないと1回目のエラーでnginxがエラーを返してしまうことになります。
nまた、リダイレクト回数は
requests redirected by the “X-Accel-Redirect” response header field
from an upstream server;
upstream server の X-Accel-Redirect
で決まるそうです。
まとめ
nginxで何かしらの処理をさせてからエラーにしたい場合はrecursive_error_pages
の設定を忘れないように。