あります同様の質問しかし、その解決策は私には機能しません。
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 は、応答本体などと同様に、クライアントとサーバーの両方にとって追加データだからです。