【问题标题】:Static Publishing in Silverstripe on Large Sites大型网站上 Silverstripe 中的静态发布
【发布时间】:2017-09-20 05:19:41
【问题描述】:

我的公司使用 SilverStripe v3.1.21 以及 Subsite 模块来显示和管理许多销售产品的客户网站。这导致近 200 个子站点和数万页数。这些网站的加载速度非常慢,Google 的 PageSpeed 等工具告诉我们页面速度很差。我们已经完成了合并和最小化 JS 以及压缩图像等资源的步骤,这带来了一些改进,但是页面仍然很慢。系统在这种状态下交给了我们,进一步的硬件升级不是一个选项,也没有获得额外的资源进行重新开发。

我们查看了静态发布模块 (https://github.com/silverstripe/silverstripe-staticpublisher),发现当我们生成静态页面时,页面会变得很快并且在各种工具上都获得了不错的分数,但是重新生成所有这些页面的过程需要超过 14 小时,这是不可接受的,因为这些产品每天都从外部来源更新。我们还发现,重新生成过程是一个内存占用,因为模块在转储到文件之前在内存中构建所有页面,导致进程崩溃。我们不得不更改流程以逐个子站点运行以使其运行。

然后我们查看了静态发布队列模块 (https://github.com/silverstripe/silverstripe-staticpublishqueue),它似乎解决了我们的问题,方法是让它根据需要对页面进行排队以进行重新生成,使其对更改的响应更加灵敏。但是,该模块似乎有很多错误,并且在生成页面时经常崩溃。

有没有人在大型网站上使用过这些模块(或类似模块),并且可以提供有关如何成功实施静态发布的任何指示或想法?

【问题讨论】:

  • 添加部分缓存也可能会加快静态发布者的速度,因为它不必一直计算所有内容。见docs.silverstripe.org/en/3/developer_guides/performance/…
  • 部分缓存可能有帮助也可能没有帮助,主要取决于瓶颈是什么。我们主要在导航生成性能方面遇到了麻烦。如果导航需要 HTML 中的 active / path 等类,则部分缓存没有多大帮助,因为它需要为每个页面重新生成。
  • @koodimyyra 当然,但你可以例如缓存一个不活动的子树,所以它可能会有所帮助
  • @wmk true,如果您需要显示不活动的子树

标签: silverstripe


【解决方案1】:

我们目前在多个网站上使用 staticpublishqueue。我们遇到的唯一问题是由于构建时间长和锁定不佳而导致崩溃。或者准确地说,它实际上并没有崩溃,而是不断产生越来越多的实例,直到服务器变得不负责任。

我认为我们在fork 中有解决此问题的方法。至少我们在使用修改后的锁定之后没有任何问题。您可以尝试安装the fork 而不是官方版本。如果这可以为​​您解决问题,也许我们应该提出拉取请求:)

【讨论】:

  • 谢谢,它让我们更加稳定。我们再次分叉,因为我们有许多作为页面生成的 DataObject 子类,它们不在 SiteTree 下,因此需要一种方法来使它们也可发布。
  • 很高兴听到它也对您有用!很快就会创建一个拉取请求。
  • 终于可以提出拉取请求了,见github.com/silverstripe/silverstripe-staticpublishqueue/pull/68
【解决方案2】:

首先:我们只使用staticpublishqueue,我对子站点模块没有任何经验。所以我不能说出你的确切组合。

我们在一个巨大的网站上使用 staticpublishqueue。设置:我们有多个服务器运行 SilverStripe 网站。他们共享一个 MySQL 数据库并使用 Redis 作为会话存储。 关于 staticpublishqueue 的一件好事:您可以并行运行它。因此,所有服务器都运行一个 staticpublishqueue 实例并发布到一个共享文件夹中,然后将其同步到实际 Web 服务器前面的 nginx 负载均衡器。效果很好,但它不会无限扩展。在某些时候,staticpublishqueue 实例开始选择相同的记录来呈现和浪费资源。我认为 6 对我们来说是最大值。

我们学到了一些关于 staticpublishqueue 的知识:

  • 不要同时运行多个实例(见上文)

  • 确保它有足够的内存

  • 确保它以与网站相同的用户身份运行

  • 它使用的记录外观与 MariaDB Galera 集群不兼容

  • 如果可能,切换到 SilverStripe 3.6.x 和 PHP7。性能提升巨大。

我们正在从 staticpublishqueue 迁移到 Cloudflare(或者可能是另一个 CDN)。为什么?因为如果请求的页面尚未呈现,服务器将为每个请求单独呈现它,然后将其丢弃。直到 que 对缓存进行单独渲染。完全浪费资源,尤其是在站点范围内的布局更改或其他内容后清除缓存时。

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2021-05-05
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多