在大型站点上使用 Silverstripe 进行静态发布
Static Publishing in Silverstripe on Large Sites
我的公司使用 SilverStripe v3.1.21 以及 Subsite 模块来显示和管理许多销售产品的客户网站。这导致将近 200 个子站点和数万个页面。网站加载速度非常慢,Google 的 PageSpeed 等工具告诉我们页面速度很差。我们已经完成了合并和最小化 JS 以及压缩图像等资源的步骤,这带来了一些改进,但是页面仍然很慢。系统是在这种状态下交给我们的,进一步的硬件升级不在 table 作为选项,也没有获得额外的资源来重新开发。
我们查看了静态发布模块 (https://github.com/silverstripe/silverstripe-staticpublisher),发现当我们生成静态页面时,页面变得很快,并且在各种工具上获得了很好的分数,但是重新生成的过程所有这些页面都需要超过 14 个小时,这是 unacceptable,因为这些产品每天都从外部来源更新。我们还发现重新生成过程是一个内存消耗大户,因为模块在转储到文件之前会在内存中构建所有页面,从而导致进程崩溃。我们不得不改变流程以逐个子站点进行访问,以使其成为 运行.
然后我们查看了静态发布队列模块 (https://github.com/silverstripe/silverstripe-staticpublishqueue),它似乎通过让页面根据需要对页面进行排队以重新生成来解决我们的问题,从而使其对更改的响应更快。但是,该模块似乎有很多bug,在生成页面时经常崩溃。
有没有人有在大型网站上使用这些模块(或类似模块)的经验,并且可以提供有关如何成功实施静态发布的任何指示或想法?
我们目前在多个站点上使用 staticpublishqueue。我们遇到的唯一问题是由于构建时间长和锁定不佳而导致崩溃。或者准确地说,它实际上并没有崩溃,而是不断产生越来越多的实例,直到服务器变得不负责任。
我认为我们在 fork. At least we haven't had any problems after using the modified locking. You could try installing the fork 而不是官方版本中对此进行了修复。如果这能为您解决问题,也许我们应该提出拉取请求 :)
首先:我们只使用staticpublishqueue,我对子站点模块没有任何经验。所以我不能代表你的确切组合。
我们在大型站点上使用 staticpublishqueue。设置:我们有多个服务器 运行 连接 SilverStripe 网站。他们共享一个 MySQL 数据库并使用 Redis 作为会话存储。
staticpublishqueue 的一大优点:您可以 运行 并行处理它。所以服务器都是 运行 staticpublishqueue 的一个实例并发布到一个共享文件夹,然后同步到实际网络服务器前面的 nginx 负载平衡器。效果很好,但不能无限扩展。在某些时候,staticpublishqueue 实例开始选择相同的记录来呈现和浪费资源。我认为 6 是我们的最大值。
关于 staticpublishqueue 我们学到的一些东西:
不要同时 运行 多个实例(见上文)
确保它有足够的 ram
确保它运行与网站的用户相同
它使用的记录外观与 MariaDB Galera 集群不兼容
如果可能,切换到 SilverStripe 3。6.x 和 PHP7。性能提升巨大。
我们正在从 staticpublishqueue 迁移到 Cloudflare(或者可能是另一个 CDN)。为什么?因为如果请求的页面尚未呈现,服务器将为每个请求单独呈现它,然后将其丢弃。直到que为缓存做一个单独的渲染。完全浪费资源,特别是如果您在站点范围内的布局更改或其他内容后清除缓存。
我的公司使用 SilverStripe v3.1.21 以及 Subsite 模块来显示和管理许多销售产品的客户网站。这导致将近 200 个子站点和数万个页面。网站加载速度非常慢,Google 的 PageSpeed 等工具告诉我们页面速度很差。我们已经完成了合并和最小化 JS 以及压缩图像等资源的步骤,这带来了一些改进,但是页面仍然很慢。系统是在这种状态下交给我们的,进一步的硬件升级不在 table 作为选项,也没有获得额外的资源来重新开发。
我们查看了静态发布模块 (https://github.com/silverstripe/silverstripe-staticpublisher),发现当我们生成静态页面时,页面变得很快,并且在各种工具上获得了很好的分数,但是重新生成的过程所有这些页面都需要超过 14 个小时,这是 unacceptable,因为这些产品每天都从外部来源更新。我们还发现重新生成过程是一个内存消耗大户,因为模块在转储到文件之前会在内存中构建所有页面,从而导致进程崩溃。我们不得不改变流程以逐个子站点进行访问,以使其成为 运行.
然后我们查看了静态发布队列模块 (https://github.com/silverstripe/silverstripe-staticpublishqueue),它似乎通过让页面根据需要对页面进行排队以重新生成来解决我们的问题,从而使其对更改的响应更快。但是,该模块似乎有很多bug,在生成页面时经常崩溃。
有没有人有在大型网站上使用这些模块(或类似模块)的经验,并且可以提供有关如何成功实施静态发布的任何指示或想法?
我们目前在多个站点上使用 staticpublishqueue。我们遇到的唯一问题是由于构建时间长和锁定不佳而导致崩溃。或者准确地说,它实际上并没有崩溃,而是不断产生越来越多的实例,直到服务器变得不负责任。
我认为我们在 fork. At least we haven't had any problems after using the modified locking. You could try installing the fork 而不是官方版本中对此进行了修复。如果这能为您解决问题,也许我们应该提出拉取请求 :)
首先:我们只使用staticpublishqueue,我对子站点模块没有任何经验。所以我不能代表你的确切组合。
我们在大型站点上使用 staticpublishqueue。设置:我们有多个服务器 运行 连接 SilverStripe 网站。他们共享一个 MySQL 数据库并使用 Redis 作为会话存储。 staticpublishqueue 的一大优点:您可以 运行 并行处理它。所以服务器都是 运行 staticpublishqueue 的一个实例并发布到一个共享文件夹,然后同步到实际网络服务器前面的 nginx 负载平衡器。效果很好,但不能无限扩展。在某些时候,staticpublishqueue 实例开始选择相同的记录来呈现和浪费资源。我认为 6 是我们的最大值。
关于 staticpublishqueue 我们学到的一些东西:
不要同时 运行 多个实例(见上文)
确保它有足够的 ram
确保它运行与网站的用户相同
它使用的记录外观与 MariaDB Galera 集群不兼容
如果可能,切换到 SilverStripe 3。6.x 和 PHP7。性能提升巨大。
我们正在从 staticpublishqueue 迁移到 Cloudflare(或者可能是另一个 CDN)。为什么?因为如果请求的页面尚未呈现,服务器将为每个请求单独呈现它,然后将其丢弃。直到que为缓存做一个单独的渲染。完全浪费资源,特别是如果您在站点范围内的布局更改或其他内容后清除缓存。