Nginx:仅缓存特定的 url 和命名位置

标签 nginx

我有 Rails 应用程序。它有 nginx 配置的一部分: 上游应用服务器{ 服务器 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

最佳答案

如果静态文件 block 中的扩展名不是虚拟 URL,您可以将 Json 添加到扩展名中。 如果是,您需要通过默认将所有内容转发到您的应用程序并进行异常(exception)设置来进行不同的设置,从而避免使用命名位置。或者您可以根据命名位置内的 if 语句设置变量:

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

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

关于Nginx:仅缓存特定的 url 和命名位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122637/

相关文章:

ruby-on-rails - 如何使用 nginx 设置从 http 到 https 的重定向?

django - 我如何强制 nginx 使用来自上游服务器的 header 将响应保存在缓存文件夹中?

macos - Nginx 未运行。没有这样的文件或目录消息 -Mac

php - Docker php 设置安装 pdo 扩展

apache - 服务器可以为某些站点运行 Nginx,而为其他站点运行 Apache Nginx 反向代理吗?

php - 子文件夹中带有 CakePHP 的 Nginx 不提供静态文件(CSS、JS、IMG)

Nginx php-fpm 子目录

javascript - Nginx 反向代理到 Node.js 并重写

php - Nginx 重写 CodeIgniter 应用程序主 CodeIgniter 应用程序子目录中的配置

php - 更新后通过存储在 php-fpm 容器中的 nginx 提供新的静态文件