Nginx:仅缓存特定网址和命名位置

时间:2014-09-30 13:54:06

标签: nginx

我有rails应用程序。它的nginx配置有部分:         上游app_server {           server unix:/var/www/app/shared/unicorn.sock fail_timeout = 0;         }

    server {
      listen 80;

      server_name app hostname;
      keepalive_timeout 5;

      root /var/www/app/current/public;
      try_files $uri/index.html $uri.html $uri @app;

      location @app {
        proxy_pass http://app_server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_cache off;
      }

      location ~ /assets/*\.(png|gif|jpg|jpeg|css|js|swf|ico|gz)(\?[0-9]+)?$ {
        access_log off;
      }
    }

我想缓存几个应用程序页面(例如所有* .json网址)。我怎么能这样做?

根据nginx文档,我不能

  • 在指定位置使用嵌套位置
  • 在if block
  • 中使用proxy_cache

1 个答案:

答案 0 :(得分:2)

如果它们不是虚拟URL,您可以将Json添加到静态文件块中的扩展中。 如果是这样,您需要通过默认情况下将所有内容转发到您的应用并设置例外来进行不同的设置,这样您就可以避免使用命名位置。或者,您可以根据命名位置中的if语句设置变量:

location @app {
    set $proxy_cache_cfg "off";
    if($request_uri ~ \.json$) {
        set $proxy_cache_cfg "json_zone";
    }
}

未经测试,不确定是否应该引用“关闭”以及它是否在此处起作用。如果这不起作用,您可以始终使用反向方法并根据变量设置proxy_no_cache,因为这对非空和非零的任何内容都有效。