扩展node.js应用程序,nginx作为基础服务器,但varnish或redis进行caching?

我不是很熟悉使用nginxvarnish,但这是我目前的设置。

我有一个node.js服务器正在运行json,html模板或socket.io事件。 然后我有nginx运行在服务所有静态内容(CSS,JS等)的节点前面。

在这一点上,我想将静态内容和dynamic内容都caching到内存中。

这是我的理解,清漆可以caching静态内容相当好,它不会需要触摸我的应用程序代码。 我也认为它也可以cachingdynamic内容,但不能有任何cookie头?

目前我使用redis来保存会话数据,并计划在将来使用它来处理其他事情,比如logging非关键但有趣的统计信息。

我只是不知道我应该如何caching网站上的所有内容。 我认为这归结于这些select,但可能会有更多:

  1. 抛出nginx前的清漆,让清漆caching静态页面,没有应用程序代码的变化。 Redis会cachingdynamic数据库调用,这将需要修改我的应用程序代码。

  2. 完全忽略使用清漆并让redis处理caching所有内容,然后使用其中一个nginx-redis模块。 我不确定这是否需要大量的应用程序代码更改(对于静态文件)。

我没有find比较nginx + varnish vs nginx + redis的基准,我也没有经验来自己动手(我的configuration可能性很高)。

我基本上正在寻找在req / sec方面最高效的解决scheme,并且在将来可以扩展(在问题中抛出新的硬件+也许可以在configuration=新服务器上调整一些值,并且无痛地运行) 。

对于纯粹的静态内容,通常在任何成熟的Web服务器(如nginx或Apache)之前运行Varnish,都可以获得很less的优势。 (我不能说node.js,因为我还没有使用它。)原因是内核维护一个文件系统caching,最近访问的文件存储在RAM中。 在select确切的哪些文件保存在caching中以及哪些文件被popup的情况下,Varnish可能比内核做得稍微好一些,但是它也可能做得更糟。 这将取决于您的系统还有哪些function以及caching保留策略的差异。 在Web服务器前放置代理所带来的额外延迟将远远超过Varnish和内核文件系统caching之间的差异。

你是正确的关于Varnish没有caching与Set-Cookie:头发送的响应 。 如果请求包含Cookie:标头,它也跳过查看caching。 原因是每个访问任何给定页面的用户都会有一个这样的唯一响应,并且每个用户不太可能重新访问相同的页面,这意味着您的caching将充满永远不会被使用的实体。

清漆可以cachingdynamic内容,这是它发光的地方。 假设您网站的首页需要在冷藏caching中进行PHP代码编译和20个数据库查询。 在温暖的caching(APC,memcached,Redis,MySQL查询caching等)上,它仍然需要查找memcached / Redis,并在请求中包含的每个PHP文件上执行stat() 。 假设你有一个合理的优化网站,这仍然可能是至less十分之一秒(这是非常好的优化; 1 – 3整秒是在我的经验更为常见)。 油漆会在1/1000秒内愉快地服务于同一页面。 但是这意味着你的用户无法在你的网站的首页上login,因为他们不能得到他们的Cookie:标题,但如果这是你能接受的话,Varnish是一个简单的胜利。

清漆也需要正确的caching标题 。 如果不确定caching对象是否安全,则不会。 如果你满足所有这些要求,清漆可能是你的工具。 也就是说,只要将正确的标题放在适当的位置,就会导致客户端自己caching内容,这可能会比Varnish有更大的差别。

如果你缺乏经验来自己设定基准,现在是时候去体验了。 你是基准来衡量你的configuration的适当性。 尝试一下,然后运行ab ,然后改变一个方法 ,然后按照与configuration完全相同的方式运行ab 。 现在你知道哪一个“更好”了。 冲洗,重复。 (另外,总是运行ab两次,忽略第一个结果,这样可以确保你只testing温度高的caching,并且不会因为对低温caching的testing而错误地认为一个configuration更糟。

为您的网站构build一个可扩展的解决scheme是一个足够复杂的话题,它不适合ServerFault的答案。 当遇到这些问题时,我们当然可以帮助解决这些问题的各个方面(例如“如何将memcached服务器扩展到memcached集群?”)。

进一步阅读:

我前一段时间写了一个答案,有一个关于在基准testing中发现瓶颈的部分。
Womble最近指出了我在寻找瓶颈方面的出色表态 。