Varnish 通常放在 Rails 网络堆栈中的什么位置?

wor*_*rol 3 nginx varnish reverse-proxy ruby-on-rails unicorn

我在 Unicorn 上部署了一个生产 Rails 应用程序,前面有 nginx 用于静态文件服务。我现在需要 Varnish 的一些功能,我想知道如何引入它。

有些人把 Varnish 放在前面,而有些人把 nginx 放在前面。我还没有听说有人使用Varnish 和 Unicorn,但我想这是有效的。

前面有 nginx 的人似乎是为了 gzip 和 SSL 终止而这样做的。SSL 与我的应用程序无关,但 gzip 是。我想清漆很快就会得到它,所以为了简单起见,我可以不用一段时间。

这两种方法还有其他优点/缺点吗?是否有规范的最佳实践布局?

小智 10

Heroku(例如)可能出于您提到的原因将nginx 放在清漆前面。

所以,nginx -> varnish -> 应用服务器。

在我的工作中,我们在所有内容(varnish -> nginx -> apache/wsgi)之前使用 Varnish,并且效果很好。那里的想法是,如果缓存命中,则从堆栈中的最高点提供服务。虽然有一些怪癖。VCL 非常特定于它的任务,因此它使得 nginx 可以轻松处理的诸如重定向(例如,用于移动检测)之类的事情变得有点困难。一般来说,它的灵活性稍差一些,因为这不是它的本意。

一般来说,根据我所读到的(并根据我的工作经验),最好将 nginx 放在堆栈前面,并在它和您的应用程序服务器之间使用清漆。

使用 Unicorn 时,这种方法的一个缺点是您将无法在 nginx 和 unicorn 中使用 unix socket 方法,因为您必须在两者之间使用清漆,而清漆不支持它们。不过,这可能是一件小事。

更新:对于选择一个而不是另一个的一些其他更具体的原因,请查看此答案的评论。这取决于您是否需要 SSL、ESI 和 gzip 压缩。