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の設定を忘れないように。

参考URL