如何告訴 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只是為了安全起見,因為據我所知,某些指令不會繼承到location.此外,還有x-cache: MISSnginx 發送給客戶端的回應。

我究竟做錯了什麼?

答案1

Nginx 文檔明確說明

如果標頭包含「Set-Cookie」字段,則不會快取此類回應。

您必須讓您的應用程式不發送 cookie 才能快取相應的回應,原因很明顯 - cookie 對於客戶端和伺服器來說都是額外的數據,與回應正文相同。

相關內容