目前,我正在使用 nginx 和 APC 作为 php 缓存,使用 memcache 作为 mysql 缓存。我在考虑实施 varnish,我想知道 Varnish 缓存在我现有的环境中能做什么,有什么想法吗?
答案1
Varnish 通常设置为将缓存的数据副本存储在内存中,并直接从内存中提供这些数据。因此,它应该分配大量内存才能正常运行。Varnish 可以设置为使用磁盘支持的缓存,但这会失去它提供的一些好处。
与 nginx 相比,如果您使用 Varnish,在处理小型、频繁访问的静态文件时,您不会注意到性能上的显著差异。原因是,设置良好的 nginx 将直接处理静态文件(即不会将请求传递给 PHP),并且您的操作系统会缓存磁盘请求(这意味着它们本质上是从内存中处理的)。
如果您可以缓存动态内容,那么 Varnish 的一大优势就在于此。假设一篇文章或主页的更改频率与浏览量相比并不高(即使每 5 分钟更改一次,但在此期间浏览量达到 100 次,则更改量很小)。这样做的好处是 Varnish 可以缓存动态页面的副本,并将其直接提供给用户。这大大减少了重新生成动态页面的必要性,而重新生成动态页面往往是一项计算量很大的操作。(这不仅可以减少 PHP 的负载,还可以减少 MySQL 的负载 - 结果是需要后端处理的请求可以更快地返回)。
设置好后,Varnish 会允许您在缓存中有更新时清除缓存中的单个文件 - 从而防止您提供过时的副本。此外,Varnish 还允许对缓存的存储方式进行相当细粒度的控制 - 允许您不缓存某些页面(例如特定于登录用户的页面等)、根据请求者的 IP 地址缓存页面、更改标头等。
总结一下:在您的环境(nginx + php-fpm + APC)中,Varnish 可以提供的好处是减少到达后端的动态页面的请求。如果您只打算将其用于静态资产,我建议您坚持使用 nginx。
在不同的设置(例如 Apache)中,使用 Varnish 提供静态资产会非常有意义。
即使您有足够的内存,与 nginx 相比,Varnish 对静态资产提供的性能改进并不像动态页面那么明显。
(值得一提的是,nginx 确实提供了 fastcgi_cache,但它没有提供 Varnish 所提供的选项范围,我觉得这使得 Varnish 更适合缓存动态页面)。
編輯:APC
PHP 是一种解释型语言 - 您编写的脚本随后通过解释器运行并转换为底层操作系统可以理解的形式。APC 是一种操作码缓存 - 它特定于 PHP(尽管其他语言可能存在类似的产品)。
本质上,APC 存储“编译”过程的中间产品,以便可以更快地处理对相同代码的后续调用。这意味着,如果您多次运行相同的代码,则第一次调用将经历完整的解释过程,而下一个请求将能够使用预处理的代码 - 这就是 APC 带来的加速效果。
此外,APC 并不针对整个 PHP 文件进行操作 - 而是针对文件的部分内容 - 因此如果您在两个单独的 PHP 脚本中使用(例如通过包含)相同的函数,则该函数的缓存副本将对两个脚本都有益。
APC 使用内存映射 - 这意味着其缓存文件可以由共享/匿名内存或实际文件支持。内存支持的缓存通常提供更好的性能,但在重启后不会持续存在。
与存储脚本生成的最终“静态”输出(即发送给用户的输出)的 Varnish 不同,APC 存储的是更动态的版本 - 为每个输入产生不同输出的函数将受益于 APC,但不会受益于 Varnish。
本质上:
- Varnish 会保存 PHP 脚本要发送给用户的任何内容的副本 - 对 Varnish 缓存的命中完全绕过后端(命中意味着 nginx 和 php/mysql 均不参与,内容直接从缓存中提供)
- APC 加速了 PHP - 因此当请求到达 PHP 时,它可以得到更快的处理。
APC 和 Varnish 执行不同的功能,您当然可以将它们一起使用,以获得最佳效果。
从另一个角度考虑 - 不涉及 PHP/MySQL 总是会更快 - 静态页面(本质上是缓存副本的数量)比动态页面更快,但是当您确实需要提供动态页面时,您希望使其尽可能快。
(不过需要注意的是 - Varnish 的正确设置比较棘手 - 默认情况下它不会缓存任何带有 cookie 的页面 - 这是为了防止向错误的用户提供受限信息。如果设置不当,Varnish 可以轻松缓存只应向特定(例如登录/管理员)用户显示的页面副本,并将其提供给所有人。)
答案2
Varnish 特别擅长提供“静态”内容。
例如图片、js、css
因此,如果您的网站上有大量很少更改的静态内容,则您可以跳过遍历整个服务器堆栈的步骤,直接切换到 Varnish。
答案3
Varnish 缓存是一种 Web 应用程序加速器,也称为缓存 HTTP 反向代理。它更像是客户端(即用户)和 Web 服务器之间的中间人。这意味着,您的 Web 服务器无需一直直接监听特定内容的请求,Varnish 将承担这一责任。
首次收到请求后,PHP 中的 Varnish 会将其定向到 Web 服务器以获得适当的响应。PHP 中的 Varnish 会缓存此响应,然后再将其发送到客户端。有趣的是,任何后续的此类内容请求都将直接从 Varnish 缓存中提供,而不是直接发送到 Web 服务器。有了这一点,您的 Web 应用程序将能够管理来自多个用户的大量并发请求,因为服务器甚至不会启动。这将为您的应用程序带来神奇的性能提升。
PHP Varnish 使用 Varnish 配置语言 (VCL),允许您通过添加逻辑来操纵请求,从而修改其行为。您可以操纵从 Web 服务器返回的响应、删除 cookie 或向响应添加标头。
Varnish 工作流程
获取/某些网页(客户端)—→ 缓存 –→ 获取/某些网页(服务器)—-→ 缓存 –→ 返回客户端。
我们假设对该页面的第一个请求大约需要 200 毫秒。
现在,一旦完全缓存了该页面的内容,流程就会完全改变,客户端对同一页面的请求不会再直接到达服务器,因为 Varnish 之前已经缓存了它。请看下面的插图:
GET /some-web-page (客户端) -→ 缓存 (命中) . —– > 然后返回到客户端
后续对该页面的请求需要10ms…..
很棒吧?
因此,我们的想法是尽可能减少发送到后端服务器的请求数量。这将反过来提高 Web 应用程序的页面渲染速度。
您可以阅读完整的文章这里。