代码之家  ›  专栏  ›  技术社区  ›  Roman Puchkovskiy

响应后缓存在nginx中不起作用

  •  4
  • Roman Puchkovskiy  · 技术社区  · 6 年前

    我的任务是使用nginx实现微缓存策略,即将一些POST端点的响应缓存几秒钟。

    在里面 http 第节 nginx.conf 我有以下几点:

    proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;
    

    那我有 location 在里面 server :

        location /my-url/ {
          root dir;
          client_max_body_size 50k;
          proxy_cache cache;
          proxy_cache_valid 10s;
          proxy_cache_methods POST;
          proxy_cache_key "$request_uri|$request_body";
          proxy_ignore_headers Vary;
    
          add_header X-Cached $upstream_cache_status;
    
          proxy_pass http://my-upstream;
        }
    

    应用程序位于 my-upstream 输出 Cache-Control: max-age=10 如果我理解正确,应该可以缓存响应。

    但当我在短时间内(不到10秒)使用curl重复请求时

    curl -v --data "a=b&c=d" https://my-host/my-url/1573
    

    它们都到达后端(根据后端日志)。而且 X-Cached 始终是 MISS

    请求和响应如下:

    > POST /my-url/1573 HTTP/1.1
    > Host: my-host
    > User-Agent: curl/7.47.0
    > Accept: */*
    > Content-Length: 113
    > Content-Type: application/x-www-form-urlencoded
    > 
    * upload completely sent off: 113 out of 113 bytes
    < HTTP/1.1 200 OK
    < Server: nginx
    < Date: Tue, 08 May 2018 07:16:10 GMT
    < Content-Type: text/html;charset=utf-8
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < Keep-Alive: timeout=60
    < Vary: Accept-Encoding
    < X-XSS-Protection: 1
    < X-Content-Type-Options: nosniff
    < Strict-Transport-Security: max-age=31536000
    < Cache-Control: max-age=10
    < Content-Language: en-US
    < X-Cached: MISS
    

    因此缓存不起作用。

    1. 我做错了什么?
    2. nginx中是否有任何日志记录功能可以查看它选择不缓存响应的原因?
    2 回复  |  直到 5 年前
        1
  •  5
  •   Roman Puchkovskiy    6 年前

    事实证明,以下指令(全局定义)阻止了缓存的工作:

    proxy_buffering off;
    

    当我在下面覆盖它时 location 使用配置 proxy_buffering on; ,缓存开始工作。

    因此,要使缓存与POST请求一起工作,我们必须执行以下操作:

    1. 输出 Cache-Control: public, max-age=10 服务器上的标头
    2. 添加 proxy_cache_path 配置和 地方 nginx中的config(问题文本中给出了示例)
    3. 确保 proxy_buffering on 对于要启用缓存的位置。
        2
  •  0
  •   Adam    2 年前

    为了详细说明上面@Roman Puchkovskiy的回答,我的源服务器返回了以下标题:

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    

    我将服务器配置为返回以下内容:

    Cache-Control: max-age=3600, public
    

    现在Nginx的行为与预期一样

    我首先尝试将此指令添加到 nginx.conf :

    ...
    location /blah {
      ...
      proxy_ignore_headers Cache-Control;
    }
    

    但看起来这个指令并不像我想象的那样有效。

    请注意,我不需要添加 proxy_buffering on 给我的 nginx公司。形态 看来我没有受到这个问题的影响。