如何将Nginx设置为caching逆向代理?

我最近听说Nginx已经将caching添加到其反向代理function。 我环顾四周,但找不到有关它的很多信息。

我想将Nginx设置为Apache / Django之前的caching逆向代理:将一些(但不是全部)dynamic页面的Nginx代理请求发送给Apache,然后caching生成的页面并为来自caching的后续请求提供服务。

理想情况下,我想要以两种方式使caching无效:

  1. 在caching的项目上设置到期date
  2. 显式使caching项无效。 例如,如果我的Django后端更新了某些数据,我想告诉Nginx使受影响页面的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语句,将$eacvariables设置为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;
  • 添加下面的HTTP头之一(优先级是重要的 – 检查我的博客文章 ):
    • 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更快更高效”。