マイクロサービスへのリクエストを1.12.2
使用auth_request
および認証するために、nginx リバース プロキシを設定しようとしています。エンド ユーザーはリクエストとともにシンプルなトークンを送信し、サーバーはそれを使用してリソースを取得して、続行できるかどうかを判断します。認証エンドポイントの負荷を軽減するために、そのリソース取得は特定のトークンに対してキャッシュする必要があります。これまでの設定は次のとおりです。proxy_cache
Bearer
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
最初にこの質問をしたときから、リモート認証エンドポイントも簡素化しました。現在は、http
nginx プロセスと同じクラスター内で実行される単純なリソースになっています。上記の例を更新して、それを反映させました。
最終更新
万が一、他の誰かがこれを参照として使用しようとする場合に備えて、以下の 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 はそれをキャッシュしません。
再度申し上げますが、コメントを残すことができませんが、できることなら協力したいと思いました。