バックエンドのキャッシュを尊重するように nginx に指示するにはどうすればいいですか? uWSGI

バックエンドのキャッシュを尊重するように nginx に指示するにはどうすればいいですか? uWSGI

あります同様の質問しかし、その解決策は私には機能しません。

nginx と uWSGI 広告バックエンドがあります。応答ヘッダーの内容に従ってバックエンド応答をキャッシュするには、nginx が必要です。

たとえば、 を実行しますcurl -I https://example.com/api/project_data/。 を使用するとtcpdump、バックエンドが次のように応答することがわかります。

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept, Accept-Language, Origin
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=3600
X-Request-ID: 6aa...0d99
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Set-Cookie:  longterm_session=45c6...67; Domain=example.com;

ただし、応答はキャッシュされず、nginx はリクエストを受信するたびにバックエンドに問い合わせます。

nginx の設定:

http {
        uwsgi_cache_path /var/local/nginx_cache levels=2:2 use_temp_path=off inactive=1h keys_zone=mycache:20m ;
....

  server {
    ....
    uwsgi_cache mycache;
    uwsgi_cache_key "$request_method$request_uri";

    location /api/project_data/ {
      add_header X-Cache $upstream_cache_status;
      add_header Pragma "public";
      uwsgi_pass 127.0.0.1:49002;
      include uwsgi_params;

      uwsgi_cache mycache;
      uwsgi_cache_key "$request_method$request_uri";

    }

uwsgi_cache一部のディレクティブは に継承されないため、念のため複製しました。また、 nginx がクライアントに送信する応答にもlocationあります。x-cache: MISS

何が間違っているのでしょうか?

答え1

Nginx ドキュメント明示的に述べるそれ

ヘッダーに「Set-Cookie」フィールドが含まれている場合、そのような応答はキャッシュされません。

対応する応答をキャッシュするには、アプリケーションが Cookie を送信しないようにする必要があります。理由は明らかです。Cookie は、応答本体などと同様に、クライアントとサーバーの両方にとって追加データだからです。

関連情報