4

我有一个使用 apache httpd 作为服务器和 mysql 作为后端的网站。它发布了一个“当天的想法”,该想法非常受欢迎,以至于服务器由于请求的数量而崩溃。既然请求的是同一个页面(思想一天只变一次),是否可以在我的主服务器前面放一个缓存服务器,这样当不同客户端发出相同请求时,缓存服务器返回该页面无需访问数据库?

4

8 回答 8

12

对于变化缓慢的页面,缓存肯定会降低 CPU 使用率;但在您的极端情况下,页面每天更改一次,并且完全可以预测,使用简单快速的静态文件服务器(lighthttpnginx等)和 cron 作业来改变您的“想法”会容易得多白天”每晚。

事实上,很多非交互式网页都可以这样完成:定期从数据库或任何其他来源重建 html 文件,并使用简单、快速的静态 Web 服务器。

于 2008-10-04T19:28:40.713 回答
2

绝对地。有许多产品可以很好地解决这个问题。Apache 本身可以配置为以这种方式运行,但如果您在 Linux 或 UNIX 上,Squid 是更好的选择,因为它是专门为完成这项工作而设计的。

在 Windows 上,MS 一直提供可以执行此功能的缓存/代理产品。目前这是 ISA Server 2006。虽然这对于这种类型的应用程序来说太过分了。

鱿鱼是我的推荐。

于 2008-10-04T17:14:10.253 回答
2

是的。您正在谈论反向代理(或“http 加速器”,这是对同一事物的不精确术语)。它可以非常有效,并且非常多的高吞吐量站点使用该技术。

正确的关键要素是与缓存相关的 HTTP 标头。所以我强烈推荐阅读HTTP RFC(实际上可以做到)。如果您没有正确获取标题,您可能会产生很小的影响,甚至可能会出现安全问题(如果个性化页面被缓存并呈现给错误的人)。

另外:您可能必须将页面拆分为多个部分,以获得最佳缓存效果。示例:如果您坚持在页面的角落放置一个时钟,将当前服务器时间精确到秒,那么整个页面只能缓存一秒。所以 1) 放弃愚蠢的时钟,或者 2) 让它由客户端脚本生成 - 或者 3) 让客户端脚本从一个特殊的 URL 中拉出页面的特定部分,然后只输出一个小的不断变化的, 不可缓存的 HTML 片段。

我曾经使用 Squid 作为大型网站的反向代理。如今,如果我要再做一次,我会尝试Varnish

于 2008-10-04T17:23:00.233 回答
2

我肯定会推荐 Javier 的解决方案,它是最简单、最强大且最容易维护的。只是不要忘记在未来 24 小时内发送正确的 Expires 标头并正确设置 ETag。

于 2008-10-04T19:59:17.767 回答
1

如果您的“当天思考”页面除了每天一次之外从未改变,那么简单的事情就是每天启动一次类似的东西

wget http://your_site/your_page.php -O /var/www/your_site_directory/your_page.html

(并将此页面的链接从 your_page.php 更改为 your_page.html)

然后,您将减少 apache 服务器和 SQL 服务器的负载...

于 2008-10-04T23:42:03.760 回答
0

您也可以尝试memcached。这就是我的公司使用的,我认为 LiveJournal 也使用它。它缓存数据库请求并严重影响数据库访问。

于 2008-10-04T17:23:41.497 回答
0

我完全同意Javier 的建议(生成静态网页)。我只想补充一点以澄清一下:

将静态文件存储为“.html”,而不是“.php”或用于从数据库中提取数据的任何语言。使用静态文件比启动解析器或可执行文件要快得多静态文件(HTML、GIF、...)只是在脚本、CGI 和所有其他东西被启动、解析、执行和其他任何东西时被传递到网络......这将需要比真正的静态文件更多的服务器资源。

于 2008-10-04T23:57:12.013 回答
0

静态文件只是将 I/O 作为开销。缓存在内存中的对象很棒,但您仍然需要管理这些对象的开销,并且在大量使用时,这变得很棘手。因此静态文件的易用性和美观性。

另一个好处是您可以让不属于 Web 服务器线程的进程执行更新和维护。如果您更新服务锁,您将不会锁定您的 Web 服务器。

于 2008-10-05T00:03:57.257 回答