缓存 PHP 页面、Varnish、nginx 还是其他?

缓存 PHP 页面、Varnish、nginx 还是其他?

我有一个在低端机器(1GB RAM)上运行的 Web 应用程序,提供静态和动态(php)页面的混合服务。这些 PHP 页面正在查询 MYSQL 数据库,而该数据库根本不经常更改 - 每周一次?。

我希望进行大量缓存,以保持一切顺利和快速。我的页面虽然是 php,但信息很少更改(获取可能每隔几个月更改一次的项目列表?)。几个页面可能列出多达 400 条记录。

我安装了 Varnish、nginx、PHP-FPM、APC 和 MYSQL。我“认为”我已经正确设置了所有内容。页面正在提供,并且我在 Varnish 中看到了点击量……太棒了!但是,由于网站的性质,我不确定它是否已经尽可能地优化。

最近的搜索提出了一些可能对我的 php 页面有帮助的东西:

  • nginx FastCGI 缓存
  • memcached
  • MYSQL 查询缓存

一个例子:一个新的 PHP 页面,其中列出了相当多(200+)条记录:2 秒刷新后,1.5(左右)秒。编辑:我期望这个页面被缓存在某个地方,并在访问后更快地提供,这不切实际吗?

我的最佳选择是什么?以上一个还是全部?

答案1

  • Memcached 需要您的代码才能实际使用它。但是如果您编写了此代码,那么这应该很容易做到 :)
  • MySQL 缓存在一定程度上有效。理想情况下,如果尚未升级到 SSD 驱动器,则升级为 SSD 驱动器。
  • 我从未听说过 FastCGI 缓存。您指的是将动态页面缓存为静态吗?

老实说,如果你已经尽力调整了一切,我会考虑升级硬件。如果你有时间,可以看看 Facebook 的研究,比如 HipHop(https://github.com/facebook/hiphop-php/wiki)他们在创建快速加载动态页面方面进行了一些令人惊叹的研究和开发。

祝你好运!

答案2

小心使用 MySQL 的查询缓存 - 它使用全局锁,因此当您开始获得过多活动时,您会看到周期性死锁。查询缓存仅对以下查询有用:一模一样,如果您有很多这样的情况,则说明您没有正确执行应用程序级缓存。

提高性能的第一步始终是进行分析;基于直觉的优化是浪费时间的好方法。

在工作中,我们使用石墨作为我们的数据存储,修改后的版本统计局管道至石墨作为主要的数据发送方法。这两种工具都使数据发送变得非常容易,而且 Graphite 还拥有大量的分析工具。

例如,使用管道至石墨清漆脚本,我们从中获取所有统计数据varnishstats。这使我们能够轻松地在 Graphite 中制作命中/未命中图表,如下所示:

Varnish 命中率图表

您可以对 memcached 执行相同的操作,并将钩子添加到您自己的应用程序中以记录...好吧,任何事情!

您还可以找到以下单页分析工具专家慢速有用。

有了指标后,您不仅会知道自己应该做什么,还能在完成后衡量改进情况。每个人都喜欢确认!

答案3

当你不需要 varnish 的特殊功能时,你可以放弃它并使用nginx 的 fastcgi_cache. 但请注意,与 proxy_cache 相反,整个设置中只能有 1 个 cache_zone。

也许您的设置有点过度优化...我会考虑只使用 nginx 或 varnish。

当谈到 memcache 时:取决于您每秒有多少个请求,memc 可以真正提高速度,但在您的情况下可能没有必要。当您有一个好的前端缓存时,您不需要启用 memcache,但 YMMV。我的理解是:您提供的页面不经常更改,对吗?

我总是尝试通过以下方式进行优化:

  1. 尽量避免请求被你的应用程序堆栈应答 -> 尽可能拦截前端(nginx/varnish)缓存和静态服务器的请求
  2. 如果是 php,请使用 APC 之类的操作码缓存
  3. 调整你的数据库
  4. 监控您的系统(负载、内存、RAM、netio、hdio、netconns、netconns:http、site_stats)
  5. 重复调音

相关内容