理想的清漆和nginx设置,以确保跨多个实例的caching一致性

寻找理想的设置,包括nginx作为我们的顶层负载均衡器,负载分布在多个Varnish实例中。

什么是分配这个负载的最佳方式? 一种方法是简单地在实例之间均匀分配,另一种方式是根据请求URL模式分配负载。 有这个最好的做法吗?

另外 – 我们需要手动(从后端)清除caching中的特定项目。 要做到这一点,最简单的方法是向我们的每个Varnish实例发出一个小的HTTP“PURGE”请求。

什么是分配这个负载的最佳方式? 一种方法是简单地在实例之间均匀分配,另一种方式是根据请求URL模式分配负载。 有这个最好的做法吗?

这取决于。 有两个原因,你想基地分配像URL哈希:

  1. caching大小。 如果你caching足够的数据,你会填充给定后端的caching,这将有助于有一个特定的URL总是碰到相同的后端,以分配后端之间的caching数据存储,而不是存储重复。
  2. 错过的请求/caching生存期的速度。 如果客户端请求丢失caching是一个问题,并且caching不会持续很长时间,那么如果给定内容总是碰到给定的Varnish服务器,则可能会失去更less的失败次数。

另外 – 我们需要手动(从后端)清除caching中的特定项目。 要做到这一点,最简单的方法是向我们的每个Varnish实例发出一个小的HTTP“PURGE”请求。

这是有效的,但留下内容的下一个请求者可能缓慢的caching未命中。 另一种方法是使用Varnish的req.hash_always_miss来强制更新caching中的资源,而不是仅仅使其无效,所以来自外部的请求不会被强制丢失。

所以在你的vcl里有这样的东西:

 acl purge { "localhost"; } sub vcl_recv { /* add this into your existing config: */ if (req.http.X-Varnish-Nuke == "1" && client.ip ~ purge) { set req.hash_always_miss = true; } } 

然后,带有该头部集合的请求将强制后端请求更新caching中的内容(使用curl或wget, – --header "X-Varnish-Nuke: 1" )。