我最近听说 Nginx 在其反向代理功能中添加了缓存。我环顾四周,但找不到太多关于它的信息。
我想将 Nginx 设置为 Apache/Django 前面的缓存反向代理:让 Nginx 代理请求一些(但不是全部)动态页面到 Apache,然后缓存生成的页面并从缓存中为这些页面提供后续请求。
理想情况下,我想以两种方式使缓存无效:
- 设置缓存项的到期日期
- 显式地使缓存项无效。例如,如果我的 Django 后端更新了某些数据,我想告诉 Nginx 使受影响页面的缓存无效
是否可以设置 Nginx 来做到这一点?如何?
我不认为有一种方法可以显式地使缓存项无效,但这里有一个如何做其余部分的示例。更新:正如 Piotr 在另一个答案中提到的,您可以使用一个缓存清除模块。您还可以使用 nginx 的 proxy_cache_bypass 强制刷新缓存项目 - 有关更多信息,请参阅Cherian 的答案。
在此配置中,未缓存的项目将从 example.net 检索并存储。缓存的版本将提供给未来的客户端,直到它们不再有效(60 分钟)。
您的 Cache-Control 和 Expires HTTP 标头将受到尊重,因此,如果您想明确设置到期日期,您可以通过在您要代理的任何内容中设置正确的标头来实现。
您可以调整很多参数 - 请参阅 nginx 代理模块文档以获取有关所有这些的更多信息,包括有关不同设置/参数含义的详细信息:http: //nginx.org/r/proxy_cache_path
您可以通过以下方式专门使缓存页面无效
假设你要缓存一个页面,这样设置缓存
现在,当您想使该页面无效并再次缓存时
使用标题进行秘密 curl 调用
它将使其无效并缓存。
从 nginx 0.7 开始工作。
作为一个额外的好处,
add_header X-Cache-Status
可以用来检查页面是否来自缓存。我建议你试试Varnish 。Varnish 专门设计为反向代理缓存。它将尊重您从原始服务器发送的所有缓存控制标头,以满足您的第一个请求。
对于您的第二个请求,显式无效。我的强烈建议是通过重命名文件或使用某种形式的查询字符串缓存破坏器来更改要使资源无效的 url 的名称。Varnish 确实有一个
PURGE
操作可以从 Varnish 的缓存中删除资源,但它不会让您控制您和用户之间的任何其他缓存。正如您所说,您想显式清除资源,那么标准的 http 控制标头对您没有帮助。在这种情况下,打败资源缓存的最简单的方法是重命名它。大多数缓存工具 (Citrix) 允许强制刷新 (Ctrl+r) 重新填充缓存页面。
这是我发现在 nginx 中做类似事情的一个技巧。
这假定当您在浏览器中执行 Ctrl+r 时,Cache-Control 标头在其请求中具有 max-age=0。我知道 Chrome 会这样做,但我没有在其他浏览器中尝试过。添加更多标题字段很容易,只需添加更多将
$eac
变量设置为 1 的 if 语句。为了使所选页面无效,您可以使用 nginx-0.8.x 的“cache_purge”补丁,这正是您想要的;)
它在这里可用。
缓存是 nginx 中相当新的功能(目前还没有很好的文档记录),但足够稳定,可以在生产中使用。
使用英文文档
在邮件列表中询问
用谷歌翻译之类的东西翻译俄语文档
使用清漆
我相信NginxHttpProxyModule能够缓存 http 请求。查找以以下开头的指令:
是的,可以通过以下指令控制缓存行为:
基于你在上面找不到文档的事实,我会对在生产中依赖它有点警惕。你考虑过清漆吗?这是我的“反向代理的 nginx”,小巧轻便,做一项工作并且做得很好。
如果您在应用程序上使用 eTag 并将 nginx 放在其前面,那么它将为您处理到期,因为如果 eTag 更改,它将使缓存无效。
您可以使用多个指令/参数控制 Nginx 的缓存过期:
proxy_cache_valid 200 302 10m;
Expires
Cache-Control
X-Accel-Expires
inactive
指令中的参数proxy_cache_path
:proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;
如果您想了解有关 Nginx 缓存的更多信息,我推荐我的博客文章。
清除主题非常有趣,因为此功能仅存在于 Nginx Plus(Nginx 的商业版)中。我真的很喜欢@randy-wallace 的回答。但还有其他可能性,例如ngx_cache_purge 模块。
您可以做的最简单的事情是手动删除缓存文件:
生成您的哈希键:
从文件系统中删除文件: