如何告诉 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 对客户端和服务器来说都是额外的数据,与响应主体相同。

相关内容