如何将 Nginx 设置为缓存反向代理?

如何将 Nginx 设置为缓存反向代理?

我最近听说 Nginx 在其反向代理功能中添加了缓存。我四处寻找,但找不到太多相关信息。

我想在 Apache/Django 前面设置 Nginx 作为缓存反向代理:让 Nginx 代理向 Apache 发送一些(但不是全部)动态页面的请求,然后缓存生成的页面并从缓存中提供对这些页面的后续请求。

理想情况下,我希望通过两种方式使缓存无效:

  1. 设置缓存项目的到期日期
  2. 明确使缓存项无效。例如,如果我的 Django 后端更新了某些数据,我想告诉 Nginx 使受影响页面的缓存无效

是否可以设置 Nginx 来执行此操作? 怎么做?

答案1

我认为没有办法明确地使缓存的项目无效,但是这里有一个如何完成其​​余操作的示例。更新:正如 Piotr 在另一个答案中提到的那样,有一个缓存清除模块您可以使用。您还可以使用 nginx 的 proxy_cache_bypass 强制刷新缓存项 - 请参阅Cherian 的回答了解更多信息。

在此配置中,未缓存的项目将从 example.net 检索并存储。缓存版本将提供给未来的客户端,直到它们不再有效(60 分钟)。

您的 Cache-Control 和 Expires HTTP 标头将受到尊重,因此如果您想明确设置到期日期,您可以通过在代理的任何内容中设置正确的标头来实现。

您可以调整许多参数 - 有关所有这些参数的更多信息(包括不同设置/参数的含义的详细信息),请参阅 nginx 代理模块文档: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

答案2

您可以具体使缓存无效翻阅

proxy_cache_bypass       

假设你想缓存一个页面,可以这样设置缓存

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

现在,当你想使该页面无效并再次缓存

使用标头进行秘密 curl 调用

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

它将使其无效并缓存。

从 nginx 0.7 开始运行。

作为额外的好处,它add_header X-Cache-Status可以用于检查页面是否来自缓存。

答案3

我建议你给试试吧。Varnish 专门设计为反向代理缓存。它将遵守您从原始服务器发送的所有缓存控制标头,从而满足您的第一个请求。

对于您的第二个请求,显式失效。我强烈建议更改要失效的资源的 URL 名称,方法是重命名文件或使用某种形式的查询字符串缓存破坏器。Varnish 确实有一个PURGE操作可以从 Varnish 的缓存中删除资源,但它不会让您控制您和用户之间的任何其他缓存。正如您所说,您想明确清除资源,那么标准 http 控制标头将无法帮助您。在这种情况下,破坏资源缓存的最万无一失的方法是重命名它。

答案4

为了使选定的页面无效,您可以使用 nginx-0.8.x 的“cache_purge”补丁,它完全可以满足您的要求;)

可用这里

相关内容