fa蛤格伦数字 / packages-statamic-cache-server
将Statamic应用程序配置为缓存构建服务器
Requires
- php: ^8.2
- illuminate/support: ^10.0
- statamic/cms: ^4.0
Requires (Dev)
- orchestra/testbench: ^8.0
README
此包允许配置Statamic应用程序作为页面内容的缓存服务器。
安装
composer require fahlgrendigital/packages-statamic-cache-server
php artisan vendor:publish --provider=FahlgrendigitalPackages\StatamicCacheServer\CacheServerProvider
服务器
此包期望至少有两个服务器
- 应用服务器
- 缓存服务器
这两个服务器应该能够访问相同的内容、图像和缓存存储的真实来源。此文档的后续部分将概述这意味着什么。
Dev Ops
上述服务器还需要位于应用程序负载均衡器后面,该均衡器的工作方式与网络负载均衡器不同。AWS能够轻松地为您的EC2实例启动ALB。
使用
此包根据在Statamic static_caching
配置中配置的静态缓存策略,期望有两种类型的利用方式
- 部分
- 全部
根据您的应用程序使用的策略,缓存服务器的工作方式会有所不同。这些差异将在以下部分中概述。在进入特定策略的详细说明之前,我们将介绍缓存服务器包的一般工作方式。
概述
本概述将涵盖以下高级功能
启动
php artisan fm:static:warm
此包有一个命令,用作内容缓存过程的点火器。该命令类似于内置的Statamic缓存预热命令 php please static:warm --user={username} --password={password} --queue
。签名如下
此命令接受与核心Statamic命令相同的参数。
建议从应用服务器而不是缓存服务器运行此请求,以节省仅用于构建缓存的服务器资源。
注意:此命令不会在事先清除静态缓存。清除该缓存的责任在调用者身上,强烈建议这样做,否则静态缓存将基于已经缓存的页面进行构建。
此自定义命令通过在使用 --queue
标志时批量处理页面请求来改进基于静态的 warm
命令。它还通过确保将用户/密码参数传递给Guzzle请求来改进 --queue
选项。原生的Statamic命令不会这样做。
当运行自定义命令时,它会启动一个作业,该作业基本上只是访问配置的网站上的页面,从而触发该页面的缓存。这就是缓存服务器发挥魔力的地方。
包含所有页面请求的批次具有以下名称:Statamic自定义FM静态缓存预热
页面请求
此命令默认执行以下内容类型的页面请求
- 条目
- 分类法
- 术语
- 自定义路由
- 自定义跑道路由
注意:跑道路由可以在 cache-server.include.runway
中配置,通过提供Runway资源模型数组。它看起来像这样
'include' => [ \App\Models\Product::class ]
缓存构建
为了将页面请求路由到缓存服务器而不是您的应用服务器,您必须配置ALB以正确路由缓存请求。此包允许您向所有缓存请求发送可定制的头信息,您可以在ALB中使用这些信息来正确路由请求。
'header' => env('CACHE_SERVER_HEADER', 'X-Cache-Trigger')
您还可以在ALB中配置预期的头信息值,用于过滤和安全。
'triggers' => [ CacheHeader::BUILD => env('CACHE_SERVER_HEADER_BUILD', CacheHeader::BUILD), CacheHeader::STATIC_CLEAR => env('CACHE_SERVER_HEADER_STATIC_CLEAR', CacheHeader::STATIC_CLEAR), ],
构建和静态清除的默认值分别为
build
和static-clear
。
缓存响应
当缓存服务器检测到对页面的请求时,它像处理任何其他页面一样响应该页面,但在请求结束时,此包有一个可终止的中间件,用于处理额外的缓存逻辑,特别是对于full
缓存策略。
半缓存
Statamic提供了有关此策略如何工作的文档。请参阅他们的文档以获取更多详细信息。
全缓存
Statamic提供了有关此策略如何工作的文档。请参阅他们的文档以获取更多详细信息。
缓存传输
本节仅适用于使用
full
策略的情况,因为它生成平面HTML文件,您的Web服务器将提供这些文件。
一旦页面被访问并且确认了该请求的缓存条目和平面文件,此包将按以下顺序触发一系列工作
- 将平面文件发送到配置的远程存储
- 触发应用服务器将其下载到配置的静态缓存文件路径
架构
要充分利用此包,您需要进行一些测试,以查看哪种服务器架构最适合您的情况。无论选择哪种架构,此包都有一些限制需要考虑。
限制
- 一个中央、远程的缓存存储,应用和缓存服务器共享。
- 一个中央、远程的图像存储,应用和缓存服务器共享。
- 一个中央数据库,应用和缓存服务器共享内容(如果您正在利用数据库进行内容存储)
建议
缓存
Statamic允许配置针对目标redis数据库连接进行存储,例如:应用缓存、horizon数据、pulse数据、glide数据。对数据进行分区将使其更容易管理。
建议:Redis
图像
当缓存服务器构建缓存时,它将触发glide图像转换,这些glide图像(和缓存路径)需要被应用和缓存服务器访问。这就是为什么需要有一个中央存储这些图像的原因。
建议:S3
数据库设置
如果您的Statamic应用正在利用数据库存储内容,该数据库需要可由应用和缓存服务器访问。
缓存队列
缓存服务器利用数据库队列连接类型来管理在成功页面缓存后负责上传和触发静态缓存文件下载的工作。
为了避免缓存和应用程序服务器之间的数据库连接冲突,强烈建议为缓存服务器队列设置特定的数据库连接。可以通过在queue
配置中指定缺少的配置来实现。
在数据库队列连接中添加以下行
'connections' => [ 'database' => [ 'connection' => env('QUEUE_DB_CONNECTION', 'mysql'), // add this line 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, 'after_commit' => false, ], ]
QUEUE_DB_CONNECTION
值需要指向缓存服务器上的特定数据库连接。例如,如果它被称为queue-mysql
,那么在您的database
配置中需要添加以下部分
'connections' => [ 'queue-mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('QUEUE_DB_HOST', '127.0.0.1'), 'port' => env('QUEUE_DB_PORT', '3306'), 'database' => env('QUEUE_DB_DATABASE', 'forge'), 'username' => env('QUEUE_DB_USERNAME', 'forge'), 'password' => env('QUEUE_DB_PASSWORD', ''), 'unix_socket' => env('QUEUE_DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], ]
失败的工作表
类似于特定的队列数据库连接设置,还需要为失败的任务表建立连接,以便正确地重新运行那些失败的任务。在queue
配置中,修改以下行,使其指向上一节中配置的连接。
'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 'database' => env('QUEUE_DB_CONNECTION', 'queue-mysql'), 'table' => 'failed_jobs', ],
迁移注意事项
如果您的缓存服务器需要与主应用服务器共享一个用于内容的数据库连接,则migrations
表也将共享。这意味着在使用数据库连接时所需的必要jobs
表可能会变得有些复杂。这个表只需要存在于缓存服务器上。根据您何时以及如何运行php artisan migrate
,该jobs
表可能会出现在错误的服务器和错误的数据库中。
目前,我们还没有一个优雅的解决方案,除了导出jobs
模式并将其导入到正确的队列数据库中。修复了该表的存储位置后,缓存队列应该能按预期运行。抱歉!