我最近听说Nginx已经将caching添加到其反向代理function。 我环顾四周,但找不到有关它的很多信息。
我想将Nginx设置为Apache / Django之前的caching逆向代理:将一些(但不是全部)dynamic页面的Nginx代理请求发送给Apache,然后caching生成的页面并为来自caching的后续请求提供服务。
理想情况下,我想要以两种方式使caching无效:
是否可以设置Nginx来做到这一点? 怎么样?
我不认为有一种方法可以显式地使caching的项目无效,但这里是一个如何去做其余的例子。 更新:正如Piotr在另一个答案中提到的那样,有一个可以使用的caching清除模块 。 您也可以使用nginx的proxy_cache_bypass强制刷新一个caching项 – 请参阅Cherian的答案以获取更多信息。
在此configuration中,未caching的项目将从example.net中检索并存储。 caching的版本将被提供给未来的客户,直到他们不再有效(60分钟)。
您的Cache-Control和Expires HTTP标头将会得到遵守,所以如果您想明确设置到期date,您可以通过在代理中设置正确的标头来实现。
有很多参数可以调整 – 请参阅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; } } }
您可以通过特定的方式使caching的页面无效
proxy_cache_bypass
假设你想要caching一个页面,这样设置caching
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; }
现在,当您想要使该页面无效并再次caching时
与标题做一个秘密的curl调用
curl "www.site.com/pageid" -s -I -H "secret_header:true"
它将无效并caching它。
从nginx 0.7开始。
作为额外的好处, add_header X-Cache-Status
可以用来检查页面是否来自caching。
我build议你试一试清漆 。 清漆专门devise为反向代理caching。 它将遵循从源服务器发送的所有caching控制标头,满足您的第一个请求。
对于你的第二个请求,显式失效。 我强烈build议更改要失效的资源的URL的名称,通过重命名文件或使用某种forms的查询stringcaching工具。 清漆确实有一个PURGE
操作,将从Varnish的caching中移除资源,但是它不会让您控制您和用户之间的任何其他caching。 正如你所说的你想明确地清除资源,那么标准的http控制头将不会帮助你。 在这种情况下,打破资源caching的最简单的方法是重命名它。
为了使所select的页面无效,你可以使用“cache_purge”补丁来完成你想要的nginx-0.8.x;)
它在这里可用。
大多数caching工具(Citrix)允许强制刷新(Ctrl + r)重新填充caching页面。
这里有一个技巧,我发现在nginx中做类似的事情。
server { # Other settings proxy_pass_header Set-Cookie; # I want to cache logged-in users proxy_ignore_headers X-Accel-Redirect; proxy_ignore_headers X-Accel-Expires Expires Cache-Control; if ($http_cache_control ~ "max-age=0") {set $eac 1;} proxy_cache_bypass $eac; }
这假定在浏览器中执行Ctrl + r时,Cache-Control头在其请求中的max-age = 0。 我知道Chrome做到了这一点,但是我没有尝试在其他浏览器。 添加更多的头字段可以很容易,只需添加更多的if语句,将$eac
variables设置为1。
caching在nginx中是非常新的function(现在还没有很好的logging),但是足够稳定,可以在生产环境中使用。
使用英文文档
在邮件列表中询问
用Google Translate翻译俄文文档
使用清漆
我相信NginxHttpProxyModule是能够caheing http请求。 查找以下列指令:
proxy_cache
是的,可以通过如下指令来控制caching行为:
proxy_cache_valid
基于你找不到文档的事实,在生产中依靠它我会有一点警惕。 你有没有考虑清漆? 这是我的“反向代理的nginx”,小巧轻便,做一份工作,做得很好。
如果您在应用程序中使用eTags并将nginx放在应用程序的前面,那么它会为您处理过期,因为如果eTag发生更改,则会使caching失效。
您可以使用多个指令/参数来控制Nginx的caching过期:
proxy_cache_valid 200 302 10m;
Expires
Cache-Control
X-Accel-Expires
proxy_cache_path
指令中的inactive
参数:
proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;
如果您想了解更多关于Nginxcaching的信息,我推荐我的博文 。
清除话题非常有趣,因为这个function只存在于Nginx Plus(Nginx的商业版)中。 我真的很喜欢@兰迪 – 华莱士的回答。 但是也有其他的可能性,比如ngx_cache_purge模块 。
你可以做的最简单的事情是手动删除caching的文件:
生成你的哈希键:
echo -n 'httpczerasz.com/time.php' | md5sum
从文件系统中删除文件:
rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
fastcgi_cache_path / opt / nginx-cache levels = 2:2 keys_zone = img:50m; location / img / { fastcgi_pass $ backend; 包括fcgi_params; fastcgi_intercept_errorsclosures; fastcgi_cache_key $ server_addr $ request_uri; fastcgi_cache img; fastcgi_cache_valid任何1m; fastcgi_hide_header Set-Cookie; }
这会为/ img / location创buildcaching。 它在/ opt / nginx-cache中。 对象被caching1分钟。
您可以编写不同的响应码而不是任何响应码。
现在,您无法使所选页面的caching无效。 也许在0.8.x这将是可能的。
有一个名为ncache的nginx插件,它声称是“一个基于nginx web服务器的webcaching系统,比squid更快更高效”。