为什么用 Varnish 缓存静态文件,为什么不通过

Sai*_*han 10 configuration nginx web-server varnish

我有一个运行 nginx/php-fpm/varnish/wordpress 和 amazon s3 的系统。

现在我在设置系统时查看了很多配置文件,在所有这些文件中我发现了这样的内容:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }
Run Code Online (Sandbox Code Playgroud)

我不明白为什么要这样做。大多数示例还将 NginX 作为网络服务器运行。现在的问题是,为什么要使用 varnish 缓存来缓存这些静态文件。

对我来说只缓存动态文件更有意义,这样 php-fpm / mysql 就不会受到太多影响。

我是正确的还是我在这里遗漏了什么?

更新

我想根据给出的答案向问题添加一些信息。

如果您有一个动态网站,其中内容实际上发生了很大变化,则chaching 没有意义。但是,例如,如果您将 WordPress 用于静态网站,则可以将其缓存很长时间。

也就是说,对我来说更重要的是静态内容。我在不同的缓存应用程序和网络服务器应用程序上找到了一些测试和基准测试的链接。

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX 实际上在获取静态内容方面更快,因此让它通过更有意义。NginX 适用于静态文件。

——

除此之外,大多数时候静态内容甚至不在网络服务器本身中。大多数情况下,这些内容存储在 CDN 上的某个地方,可能是 AWS S3 之类的。我认为清漆缓存是您希望存储静态内容的最后一个地方。

cyb*_*x86 11

清漆有几个优点。您注意到的第一个是减少后端服务器上的负载。通常通过缓存动态生成但很少更改的内容(与访问频率相比)。以您的 Wordpress 为例,大多数页面可能不会经常更改,并且存在一些插件可以在页面更改(即新帖子、编辑、评论等)时使清漆缓存无效。因此,您无限期地缓存,并在更改时失效 - 这导致后端服务器的负载最小。

尽管有链接的文章,但大多数人会建议,如果设置正确,Varnish 的性能比 Nginx 好——尽管(我真的不想承认)——我自己的测试似乎同意 nginx 可以比 varnish 更快地提供静态文件(幸运的是,我不为此目的使用清漆)。我认为问题在于,如果您最终使用了 Varnish,那么您在设置中添加了一个额外的层。将额外的层传递到后端服务器总是比直接从后端提供服务要慢——这就是为什么允许 Varnish 缓存可能更快——你节省了一个步骤。另一个优势是在磁盘 io 方面。如果您将 varnish 设置为使用 malloc,则根本不会访问磁盘,这使得它可用于其他进程(并且通常会加快速度)。

我认为人们需要一个更好的基准来真正衡量性能。重复请求相同的单个文件会触发文件系统缓存,从而开始将注意力从 Web 服务器本身转移开。更好的基准测试将使用带有数千个随机静态文件(甚至可能来自您的服务器日志)的 siege 来模拟真实的流量。不过可以说,正如您所提到的,将静态内容卸载到 CDN 变得越来越普遍,这意味着 Varnish 可能不会从一开始就提供服务(您提到了 S3)。

在实际场景中,您可能会优先考虑内存使用 - 首先是动态内容,因为它的生成成本最高;然后是小的静态内容(例如 js/css),最后是图像 - 您可能不会在内存中缓存其他媒体,除非您有充分的理由这样做。在这种情况下,使用 Varnish 从内存加载文件,然后 nginx 从磁盘加载它们,Varnish 的性能可能会超过 nginx(请注意,nginx 的缓存仅用于代理和 fastCGI,并且默认情况下是基于磁盘的 - 尽管它是可以将 nginx 与 memcached 一起使用)。

(我的快速 - 非常粗略,没有任何可信度 - 测试表明 nginx(直接)是最快的 - 我们称之为 100%,varnish(使用 malloc)有点慢(大约 150%),并且 nginx 在 varnish 后面( with pass) 是最慢的(大约 250%)。这不言而喻 - 要么全部要么全无 - 增加额外的时间(和处理)与后端通信,只是建议如果您使用的是 Varnish,并有空闲的 RAM ,您也可以缓存所有可以缓存的内容并从 Varnish 提供它,而不是传回给 nginx。)