2012-02-10 47 views
15

我试图缓存基本上在虚拟服务器配置下面的路径内的静态内容。由于某些原因文件没有被缓存。我看到缓存目录中的几个文件夹和文件,但它总是像20mb不高不低。例如,如果缓存图片需要至少500mb的空间。nginx作为缓存代理不缓存任何

这里是nginx.conf缓存部分:

** nginx.conf ** 
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$ 
proxy_temp_path /usr/share/nginx/www/tmp; 
proxy_read_timeout 300s; 

继承人的默认虚拟服务器。

**sites-available/default** 
server { 
    listen 80; 

    root /usr/share/nginx/www; 
    server_name myserver; 
    access_log /var/log/nginx/myserver.log main; 
    error_log /var/log/nginx/error.log; 

    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ { 
      proxy_pass http://backend; 
      proxy_cache static; 
      proxy_cache_min_uses 1; 
      proxy_cache_valid 200 301 302 120m; 
      proxy_cache_valid 404 1m; 
      expires max; 
    } 

    location/{ 
      proxy_pass http://backend; 
    } 
} 
+0

缓存状态有土特产品tryed打开错误日志? – 2012-02-10 17:47:36

+1

是的。没有结论。 – 2012-02-10 18:07:50

回答

35

确保您的后端不返回Set-Cookie标头。如果Nginx看到它,它会禁用缓存。

如果这是你的情况,最好的选择是修复你的后端。当固定后端是不是一种选择,它可能指示Nginx的忽略Set-Cookie

proxy_ignore_headers "Set-Cookie"; 
proxy_hide_header "Set-Cookie"; 

documentation

proxy_ignore_header将确保高速缓存发生。 proxy_hide_header将确保Cookie有效内容不包含在缓存的有效内容中。这对避免通过NGINX缓存泄漏cookie非常重要。

+4

实际上它没有设置cookie,但缓存控制。我发现IIS实际上是在缓存静态文件,而对nginx的响应是不会长时间缓存这些文件,因为它已经缓存了它。一旦我从iis缓存中删除这些文件,它就起作用了。 :) – 2012-02-10 19:14:28

+1

我爱你,你救了我的夜晚! – micred 2013-10-21 20:13:07

+0

和我的夜晚......剩下什么吧 – mkoryak 2014-02-20 02:42:08

10

我想补充说,多个配置选项和组合可以在Nginx中禁用代理缓存。不幸的是,这是记录不完善。

在我的配置中,我设置了proxy_buffering on并按预期启用了缓存。

+1

那么,'proxy_buffering on'如何关联,请你解释一下吗? – Meglio 2016-03-18 08:01:42

+0

我正在寻找一些关于代理缓冲和代理缓存之间关系的官方文档,但是我找不到任何可以引用的好资源。我添加了这个答案,因为关闭'proxy_buffering'只是禁用任何配置的缓存行为,没有警告或其他任何东西。 我的猜测是,没有缓冲nginx无法存储,从而缓存来自它正在代理的服务器的响应。 这个答案暗示了一些事情,甚至可以问问Tero Kilkanen谁给了答案:http://serverfault.com/a/692585/144118 – Overbryd 2016-03-18 10:57:38

+0

让我有一天。我花了3天!弄清楚我们的配置有什么****错误。非常感谢@Overbryd,从我的内心深处。 – 2016-04-03 13:37:13

0

对于它的价值,我的经验是,nginx并不总是缓存你告诉它的东西。

例如,在centos7,与配置选项

proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g; 

的nginx实际上是在缓存中的文件:通过多个答案和意见会后

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache 
+2

这可能是systemd或RedHat的补丁。尝试systemctl cat nginx.service,看看是否有一个选项给予chroot它或类似的东西 – Jason 2016-04-19 12:35:34

+0

很可能你必须指定'proxy_cache_path/tmp/my_nginx_cache use_temp_path = off ...',否则nginx会追加为前缀'proxy_temp_path ',在你的情况下它被设置为'/ tmp/systemd-private-phJlfG /'。 – antonbormotov 2017-05-23 11:36:59

+0

确认 - 来自RHEL nginx rpm的nginx.service systemd单元文件中的'PrivateTmp = true'。如果你把你的缓存放在/ tmp下,它不会在这个设置中持久化(重启nginx会导致它获得一个新的缓存目录)。 – 2017-11-19 21:39:28

0

,我发现这个配置最后的工作原理:

10m = 10mb密钥缓存,max_size为2GB,inactive = 120m(120分钟未激活后从源刷新),use_temp_path = off(减少io)

proxy_cache_valid - 200和30260分钟

proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g 
       inactive=120m use_temp_path=off; 
proxy_cache_key "$scheme$request_method$host$request_uri"; 
proxy_cache_valid 200 302 60m; 

server { 
    listen  80; 
    server_name example.com; 

    # https://www.nginx.com/blog/nginx-caching-guide 
    location/{ 
     proxy_cache default_cache; 
     proxy_buffering on; 
     proxy_ignore_headers Expires; 
     proxy_ignore_headers X-Accel-Expires; 
     proxy_ignore_headers Cache-Control; 
     proxy_ignore_headers Set-Cookie; 

     proxy_hide_header X-Accel-Expires; 
     proxy_hide_header Expires; 
     proxy_hide_header Cache-Control; 
     proxy_hide_header Pragma; 

     add_header X-Proxy-Cache $upstream_cache_status; 
     proxy_pass http://ip-of-host:80; 

     #set   $memcached_key "$uri?$args"; 
     #memcached_pass 127.0.0.1:11211; 
     # error_page  404 502 504 = @fallback; 
    } 
}