Nginx不缓存数据


15

我在nginx代理后面有一个REST API。代理工作正常,但是我无法缓存任何响应。任何帮助将非常感激:

Nginx配置:

worker_processes  10;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
        proxy_cache_path /path/to/cache/dir keys_zone=one:60m;
        proxy_cache_methods GET HEAD POST;

     upstream backend {
        server server1 backup;
        server server2 weight=5;
    }
    access_log  logs/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       7076;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log;

        location / {
            add_header 'Access-Control-Allow-Origin' *;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

            proxy_cache one;
            proxy_cache_key $host$uri$is_args$args;

            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Cache-Control;

            proxy_hide_header Cache-Control;
            proxy_hide_header Set-Cookie;
            proxy_pass http://backend;
        }
    }
}

无论我尝试了什么,代理缓存始终会以MISS的形式返回:

请求标头为:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:nginxserver:portnumber
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

响应标题为:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,Accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/plain;charset=UTF-8
Date:Wed, 15 Oct 2014 16:30:18 GMT
Server:nginx/1.7.4
Transfer-Encoding:chunked
X-Proxy-Cache:MISS

我怀疑这与客户端标头有关,但是即使我通过curl发出呼叫并检查标头,也没有响应。

提前致谢


1
在请求标头中:Cache-Control:max-age=0...表示“不要缓存此请求”。
内森·C

有没有办法让我忽略客户端标头中的内容?这并不能解释为什么它也不能通过卷曲工作
。...– user2630270

@ user2630270初始请求URL和方法是什么?中间反应是什么?
Xavier Lucas

@XavierLucas上面标题的方法是GET,因为我现在正在解决Chrome问题。该请求类似于nginxserver:port / solr / asd / select?q = *:*。我不知道如何捕捉中间反应。在哪里可以找到相关说明?
user2630270

如果我不经过nginx而直接打应用程序,使用完全相同的查询,我将得到以下响应标头:Content-Type:text / plain; charset = UTF-8 Transfer-Encoding:分块
user2630270 2014年

Answers:


44

您没有告诉nginx响应多少时间有效,必须从缓存中提供。

必须使用proxy_cache_valid指令指定。

proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;

但是,这不适用于POST请求,因为您没有与该POST请求到另一个URL的缓存键不同的缓存键(如果它们没有相同的内容)。

因此,您需要将缓存键调整为$host$request_uri|$request_body。您将必须监视缓存大小(proxy_cache_path参数max_size)和代理响应缓冲区,proxy_buffer_size以便适合您的需求。


很好,谢谢!有效。希望它在更明确的地方有记载。
user2630270

如果未设置此指令,则将缓存任何响应。但是一个被应用程序的标头X-Accel-Expire,Cache-Control或Expire覆盖。至少,Set-Cookie和Vary可以避免缓存。这些事实已在文档中公开。我创建了一个简单的脚本进行测试,因为我的框架Laravel总是发送上述标头。
维克多·阿吉拉尔

16

来自:http : //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

语法:proxy_cache_valid [code ...]时间;

...

缓存参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级

  • “ X-Accel-Expires”标题字段以秒为单位设置响应的缓存时间。零值禁用缓存响应。如果该值以@前缀开头,则它设置自Epoch以来的绝对时间(以秒为单位),直到该时间为止,响应都可以被缓存。
  • 如果标题不包括“ X-Accel-Expires”字段,则可以在标题字段“ Expires”或
    “ Cache-Control”中设置缓存参数。
  • 如果标头包含“ Set-Cookie”字段,则不会缓存此类响应。
  • 如果标头包含带有特殊值“ *”的“ Vary”字段,则不会缓存此类响应(1.7.7)。如果标头包含
    带有另一个值的“ Vary”字段,则将
    考虑相应的请求标头字段(1.7.7)来缓存此类响应。

可以使用proxy_ignore_headers指令禁用对这些响应头字段中的一个或多个的处理。

大多数Web应用程序都设置Set-Cookie标头,因此不会缓存响应。要解决此问题,请使用以下指令:

proxy_ignore_headers Set-Cookie;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.