我最近听说 Nginx 在其反向代理功能中添加了缓存。我四处寻找,但找不到太多相关信息。
我想在 Apache/Django 前面设置 Nginx 作为缓存反向代理:让 Nginx 代理向 Apache 发送一些(但不是全部)动态页面的请求,然后缓存生成的页面并从缓存中提供对这些页面的后续请求。
理想情况下,我希望通过两种方式使缓存无效:
- 设置缓存项目的到期日期
- 明确使缓存项无效。例如,如果我的 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”补丁,它完全可以满足您的要求;)
可用这里。