it-swarm.cn

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

最近我听说Nginx已将缓存添加到其反向代理功能中。我环顾四周,但找不到更多信息。

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

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

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

是否可以设置Nginx来做到这一点?怎么样?

145
Continuation

我不认为有一种方法可以使缓存的项目显式无效,但是这里有一个示例,说明如何进行其余操作。 更新:正如Piotr在另一个答案中提到的那样,有一个 缓存清除模块 可以使用。您还可以使用nginx的proxy_cache_bypass强制刷新缓存的项目-有关更多信息,请参见 (谢里安的答案 )。

在此配置中,未缓存的项目将从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;
    }
  }
}
97
Casey

您可以专门 使缓存无效 页面

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可用于检查页面是否来自缓存。

47
Cherian

我建议您尝试 清漆 。 Varnish特别设计为反向代理缓存。它将满足您从原始服务器发送的所有缓存控制标头,这些标头可以满足您的第一个请求。

对于您的第二个请求,显式无效。我的强烈建议是通过重命名文件或使用某种形式的查询字符串缓存无效化程序来更改要失效的资源的URL名称。 Varnish确实有PURGE操作,该操作将从Varnish的缓存中删除资源,但不会让您控制您与用户之间的任何其他缓存。正如您所说的,您想显式清除资源,那么标准的HTTP控件标头将无济于事。在那种情况下,破坏资源缓存的最简单的方法是重命名它。

36
Dave Cheney

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

可用 这里

8
Piotr Sikora

大多数缓存工具(Citrix)允许强制刷新(Ctrl + r)重新填充缓存的页面。

这是我发现在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可以做到这一点,但是我没有在其他浏览器中尝试过。添加更多的标头字段很容易,只需添加更多设置$eac变数为1。

8
Randy Wallace

缓存是nginx中的一个相当新的功能(目前尚不完善),但足够稳定,可用于生产。

5
SaveTheRbtz

我相信 NginxHttpProxyModule 能够缓冲HTTP请求。查找以以下内容开头的指令:

proxy_cache

是的,可以通过以下指令来控制缓存行为:

proxy_cache_valid
4
Taras Chuhay

基于您无法找到文档的事实,我会在生产中依赖它有些警惕。您是否考虑过Varnish?这是我的“反向代理nginx”,小巧,轻巧,能出色地完成一项工作。

3
womble

如果在应用程序上使用eTag并将nginx放在它的前面,则它将为您处理到期时间,因为如果eTag更改,它将使缓存无效。

2
Martin Murphy

您可以使用多个指令/参数来控制Nginx的缓存过期:

  • 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;

如果您想了解有关Nginx缓存的更多信息,我建议 我的博客文章

清除主题确实很有趣,因为此功能仅在Nginx Plus(Nginx的商业版)中存在。我真的很喜欢@ randy-wallace的答案。但是还有其他可能性,例如 ngx_cache_purge模块

您可以做的最简单的事情是手动删除缓存的文件:

  • 生成您的哈希密钥:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • 从文件系统中删除文件:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
2
czerasz

对于未来的访问者:同时,nginx反向代理已集成了缓存,并且可以从以下位置获得文档:

语法:proxy_cache区域|关

默认值:proxy_cache off;

上下文:http,服务器,位置

定义用于缓存的共享内存区域。同一区域可以在多个地方使用。参数值可以包含变量(1.7.9)。 off参数禁用从先前配置级别继承的缓存。

2
Tarik Huclaslun
 fastcgi_cache_path/opt/nginx-cache level = 2:2 keys_zone = img:50m; 
 
 location/img/{
 fastcgi_pass $ backend; 
 include fcgi_params; 
 fastcgi_intercept_errors off; 
 fastcgi_cache_key $ server_addr $ request_uri; 
 fastcgi_cache img; 
 fastcgi_cache_valid 1m; 
 fastcgi_hide_header Set-Cookie; 
} 

这将为/ img /位置创建缓存。它在/ opt/nginx-cache中。对象被缓存1分钟。

您可以编写其他任何形式的响应代码。

现在,您无法使所选页面的缓存无效。也许在0.8.x中是可能的。

0
lexsys

有一个名为 ncache 的nginx插件,该插件声称是“基于nginx Web服务器的Web缓存系统。比squid更快,更高效。”

0
sajal