nginx auth_request のキャッシュ

nginx auth_request のキャッシュ

マイクロサービスへのリクエストを1.12.2使用auth_requestおよび認証するために、nginx リバース プロキシを設定しようとしています。エンド ユーザーはリクエストとともにシンプルなトークンを送信し、サーバーはそれを使用してリソースを取得して、続行できるかどうかを判断します。認証エンドポイントの負荷を軽減するために、そのリソース取得は特定のトークンに対してキャッシュする必要があります。これまでの設定は次のとおりです。proxy_cacheBearer

ssl_certificate                 /etc/nginx/ssl/certificate;
ssl_certificate_key             /etc/nginx/ssl/key;
proxy_cache_path                /var/cache/nginx/auth_cache levels=1:2 keys_zone=auth_cache:1m max_size=1g inactive=60m;
server {
    listen                      80;
    listen                      443 ssl;
    server_name                 myapi.mydomain.com;
    location / {
        proxy_pass              http://myapi/;
        auth_request            /auth;
    }
    location = /auth {
        internal;
        proxy_pass              https://authendpoint.mydomain.com/api/user/verify;
        proxy_cache             auth_cache;
        proxy_cache_key         "$http_x_auth_token$request_uri";            
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

クライアントの観点からは、これはうまく機能していますが、nginx サーバーを見ると、キャッシュ フォルダーに何も書き込まれていません。フォルダーは/var/cache/nginx/auth_cache作成されますが、常に空です。何が欠けているのでしょうか?

アップデート

新しい nginx ( 1.17.9、現在) でこれを試しても、キャッシュ フォルダーに書き込まれたものは何も表示されません。別の場所で、Cookie がキャッシュをブロックする可能性があるという提案を見ました。このアプリは Cookie を使用しませんが、とにかく試しました。

location = /auth {
    internal;
    proxy_pass              http://authservice/api/user/verify;
    proxy_cache             auth_cache;
    proxy_cache_key         "$http_x_auth_token$request_uri";   
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
    proxy_hide_header       Set-Cookie;
    proxy_ignore_headers    Set-Cookie;
    proxy_set_header        Cookie "";
}

動作は同じです。auth_cache フォルダーは作成されますが、そこには何も書き込まれず、認証エンドポイントへのリクエストはキャッシュされません。

参考までに、認証エンドポイントからの結果は非常に最小限です。

< HTTP/1.1 200 OK
< Date: Sun, 12 Apr 2020 18:04:08 GMT
< Server: Kestrel
< Content-Length: 0

最初にこの質問をしたときから、リモート認証エンドポイントも簡素化しました。現在は、httpnginx プロセスと同じクラスター内で実行される単純なリソースになっています。上記の例を更新して、それを反映させました。

最終更新

万が一、他の誰かがこれを参照として使用しようとする場合に備えて、以下の 2 つの役立つ回答に加えて、上記の例のキャッシュ キーを修正する必要がありました。

proxy_cache_key         "$http_x_auth_token$request_uri";            

X-Auth-Token実際に をヘッダーとして使用している場合のみ意味があり、 だけを使用している場合は意味がありませんAuthorization。上記のキーは機能しますが、これは、URI の最初のプロキシ認証応答がキャッシュされ、実際のトークンが無視されることを意味します。実際には、次のものが必要でした。

proxy_cache_key         "$http_authorization$request_uri";            

答え1

NGINX をアップグレードしてみてください。

1.14.0 でも同じ問題が発生しました。curl を使用した /auth への手動リクエストはキャッシュされましたが、auth_request サブリクエストはキャッシュされませんでした。

NGINX 1.16.1 にアップグレードしたら動作するようになりました。

答え2

私は初心者なのでコメントを残すことはできませんが、proxy_ignore_headers が役立つかもしれません。

proxy_ignore_headers Expires Cache-Control;

Nginx のドキュメントによると、 プロキシされたサーバーからの特定の応答ヘッダー フィールドの処理を無効にします。

アプリケーション サーバーが「キャッシュなし」の指示を返す場合、Nginx はそれを尊重し、これらのヘッダーを無視することで、キャッシュの指示はすべて無視されます。

また、クライアント マシンの Nginx からの http 応答ヘッダーのキャッシュ ステータスはどうなっていますか。BYPASS では、nginx はそれをキャッシュしません。

再度申し上げますが、コメントを残すことができませんが、できることなら協力したいと思いました。

関連情報