我有一个 django 应用程序,我想在它前面的服务器上设置 Varnish。在另一个 serverfault 线程有人建议将 Nginx 放在 Varnish 前面。
我是否应该在缓存服务器上将 Nginx 放在 Varnish 前面?如果是这样,我应该在应用服务器上使用 Nginx 吗?
答案1
我们讨论的是总共 1 - 3 台前端服务器,而不是在各层之间进行负载平衡的大型服务器场?
将 nginx 放在 Vanish 前面可让您即时进行 HTTP 压缩。这是性能最佳实践,但可以省去。(Varnish 中的内容通常保持未压缩状态,以便 ESI Includes 可以工作,因此您不必根据 Vary 标头/浏览器匹配来处理同一对象的多个缓存版本。)
关于应用服务器上的 nginx --带有 mod_wsgi 的 Apache这不是目前部署新 Django 安装的推荐和最常用的方法吗?我不知道有什么令人信服的理由在 Django 中使用 nginx/fastcgi 而不是 Apache/mod_wsgi;但你应该向 Django 专家寻求建议。
关于 Varnish 具有 nginx 所不具备的有吸引力的负载平衡功能,我看不出它们是什么?Varnish 具有随机和循环平衡。nginx 具有循环、客户端 IP 和一致性哈希——我看不出 Varnish 有什么显著的优势?是 VCL 还是 Varnish 的优雅配置重新加载,还是其他什么?
对于 1-3 个服务器的小型设置,我想我会这样做
Varnish——>Apache / mod_wsgi / Django
或者可能
Squid——>Apache / mod_wsgi / Django
为了简单起见,忽略 HTTP 压缩,除非带宽昂贵。
更新:
Graham Dumpleton 在下面发表了一条有价值的评论。他提到了一种非常常见的设置,例如 VPS 上的博客或没有缓存的小型网络农场:
nginx——>Apache / mod_wsgi / Django
这是一个非常好的解决方案,原因如下:
- 设置简单
- nginx 速度快、开销小,可处理静态文件服务和浏览器连接保持。
- Django 在 Graham Dumpleton 的优秀的 mod_wsgi 中运行,这是 Django 的推荐平台。
我最初没有提到这一点的原因是 OP 似乎需要 Varnish,这是一种非常高性能的缓存解决方案。nginx / Apache / mod_wsgi 组合无法以与 Varnish 相匹配的性能和灵活性进行缓存。
答案2
您可以使用不带varnish的nginx来代理和缓存内容。
答案3
我已经成功使用了 Nginx、Varnish 和 Apache/mod_wsgi/Django。我从以下配置开始:
Nginx -> Apache/mod_wsgi/Django
当我开始看到 Apache 上的负载显著增加时,我添加了 Varnish:
Nginx -> Varnish -> Apache/mod_wsgi/Django
我使用 Nginx 作为一种“URL 路由器”。Django 管理请求直接从 Nginx 发送到 Apache。客户端请求从 Nginx 发送到 Varnish,后者缓存来自 Apache 的请求,如果应用服务器不可用,还会从缓存中提供“优雅”项目。
我的 Nginx 服务器还直接提供某些静态内容(例如图像、CSS 和 javascript 文件)。
总体而言,性能表现非常出色。我注意到以下几点需要注意:
- 在繁忙的网站上,重新启动 Varnish 可能会导致应用服务器负载激增,因此最好将 Varnish 重新启动次数保持在最低限度。(Varnish 似乎没有像 Nginx/Apache 那样的“重新加载”,它只是重新读取其 VCL 文件)。相反,重新加载 Nginx 配置的影响很小。出于这个原因,我在 Nginx 中完成了大部分 URL 重写和“路由”。
- Varnish 很容易在 Nginx 和 Apache 之间切换。如果您开始注意到应用服务器的负载过高,那么即使使用默认配置添加 Varnish 也确实会产生影响。
- 如果您确实使用 Varnish,那么您肯定需要考虑如何处理缓存失效。
- 我的经验是,Varnish 处理失败的后端比 Nginx 更为优雅(正如您之前指出的那样)。
答案4
我正在使用 Nginx->Varnish->uWSGI->Django