elgentos / magento2-varnish-extended
此扩展扩展了内置的Varnish功能
Requires
- magento/framework: >=103.0.7
- magento/module-page-cache: *
This package is auto-updated.
Last update: 2024-09-19 13:36:28 UTC
README
本模块旨在为Magento中的Varnish功能添加一些额外功能。
可配置的跟踪参数
核心Magento VCL 包含硬编码的市场跟踪参数。 几乎没有人更改它们,但添加您网站上常用的跟踪参数可以大大提高命中率。
此扩展在后台添加了一个字段,在“商店”>“配置”>“系统”>“全页缓存”>“Varnish配置”>“跟踪参数”下,以自定义自己的参数。
重要提示:此操作不会自动应用!您需要使用自定义VCL并将营销GET参数部分替换为包含占位符的新部分;
您可以使用核心Magento VCL作为基础;
cp vendor/magento/module-page-cache/etc/varnish6.vcl custom-varnish6.vcl
或者使用本readme中“自定义优化VCL”子节中解释的自定义优化VCL;
现在将相关部分替换为包含占位符的这一部分;
# Remove all marketing get parameters to minimize the cache objects
if (req.url ~ "(\?|&)(/* {{ tracking_parameters }} */)=") {
set req.url = regsuball(req.url, "(/* {{ tracking_parameters }} */)=[-_A-z0-9+(){}%.]+&?", "");
set req.url = regsub(req.url, "[?|&]+$", "");
}
然后,您需要生成新的VCL并应用它;
bin/magento varnish:vcl:generate --export-version=6 ---input-file=custom-varnish6.vcl -output-file=/data/web/varnish6.vcl
varnishadm vcl.load new-custom-vcl /data/web/varnish6.vcl
varnishadm vcl.use new-custom-vcl
检查Varnish命中率
建议在应用这些更改前后检查Varnish命中率,以便您可以看到命中率是否实际上有所提高。
wget --quiet https://raw.githubusercontent.com/olivierHa/check_varnish/master/check_varnish.py
chmod +x check_varnish.py
./check_varnish.py -f MAIN.cache_hit,MAIN.cache_miss -r
B2C商店的好命中率大约在80-90%左右。对于B2B,这可能会低一些,具体取决于您的目录有多封闭。
自定义优化VCL
鼓励您使用这里找到的自定义优化VCL; https://gist.github.com/peterjaap/006169c5d95eeffde3a1cc062de1b514
您可以将它放在您的Git仓库中的app/etc/varnish6.vcl
,并通过以下Deployer任务在每个部署时自动应用它。
desc('Auto-apply VCL when custom VCL exists');
task('vcl:auto-apply', function () {
if (test('[ -f {{release_path}}/app/etc/varnish6.vcl ]')) {
$timestamp = date('YmdHis');
run('{{bin/php}} {{release_path}}/bin/magento varnish:vcl:generate --export-version=6 --input-file={{release_path}}/app/etc/varnish6.vcl --output-file=/data/web/varnish6.vcl');
run('varnishadm vcl.load vcl' . $timestamp . ' /data/web/varnish6.vcl');
run('varnishadm vcl.use vcl' . $timestamp);
}
})->select('stage=production');
与普遍看法相反,加载并激活(使用)新的VCL不会清除Varnish中已有的缓存对象。但是,新的VCL可能会改变处理未来请求的方式,这可能导致缓存项被更早地移除或以不同的方式检索。
显著差异
- VCL版本和兼容性
- Magento VCL:为了兼容性使用vcl 4.0,即使使用Varnish版本6或7。
- 优化VCL:使用vcl 4.1——一个更现代的版本——同时仍然与Varnish 6和7保持兼容。
- 请求处理(sub vcl_recv)
- Magento VCL:侧重于请求归一化(删除营销参数,处理特定URL路径的缓存控制),但缺乏查询参数排序或更复杂的请求清理等改进。
- 优化VCL:
- 查询字符串优化:使用std.querysort()对查询参数进行排序,以提高缓存效率。
- 删除空查询参数:消除用于归一化的空查询字符串。
- 主机头清理:从主机头中删除端口号,以获得更好的缓存键归一化。
- Httpoxy漏洞缓解:取消设置代理头以缓解潜在漏洞。
- 健康后端宽限期:根据后端健康动态调整宽限期。
- 高级查询参数删除:与原始的Magento VCL相比,删除更多与营销相关的查询参数,进一步优化缓存对象。
- Cookie和头部管理
- Magento VCL:在cookie上使用std.collect(),但不会执行额外的cookie头部折叠或清理不必要的头部。
- 优化VCL:合并多个Cookie头并移除代理等头信息,以实现更高效的处理和增强安全性。
- 缓存键生成(子vcl_hash)
- Magento VCL:对某些请求头进行哈希处理,并应用于GraphQL和Magento的X-Magento-Vary Cookie,但结构化和逻辑整合还有提升空间。
- 优化VCL:
- 整合:通过确保使用X-Magento-Cache-Id或回退头信息(商店、内容货币)进行哈希处理,优雅地处理GraphQL请求和Magento缓存ID。
- 通用安全:增加结构化逻辑进行SSL卸载,提高HTTPS处理和哈希键的完整性。
- 后端响应处理(子vcl_backend_response)
- Magento VCL:
- 基本TTL控制:缓存200和404响应,但以不太优化的方式清除Cookie。
- Hit-For-Pass:当响应不可缓存时,实施基本的Hit-For-Pass策略。
- 优化VCL:
- 优雅和陈旧内容:保留陈旧内容最多3天,使用异步重新验证在继续提供已过期内容的同时刷新缓存。
- Set-Cookie头:积极取消缓存内容的Set-Cookie(GET和HEAD请求),以提高缓存命中率。
- 严格TTL控制:为不可缓存内容和不匹配的GraphQL缓存ID设置短(120秒)TTL,以避免过多的直接传递。
- 交付时的头部管理(子vcl_deliver)
- Magento VCL:取消一系列头信息,如X-Magento-Tags、X-Powered-By和Server,但以基本形式包含调试信息。
- 优化VCL:
- 改进的调试:添加更具体的调试头(X-Magento-Cache-Debug),包括详细的缓存命中/未命中报告。
- 更积极的头部清理:取消额外的头信息,如X-Varnish、Via和Link,以简化响应并减少发送给客户端的不必要数据。
- 安全增强
- Magento VCL:通过移除敏感头信息实现基本安全,但缺乏更高级的威胁缓解。
- 优化VCL:包含显式的X-Forwarded-Proto逻辑以实现HTTPS,更好的安全头部管理(例如,移除代理头),以及优化如移除HTTPoxy漏洞等。
- GraphQL请求处理
- Magento VCL:仅缓存带有适当X-Magento-Cache-Id头的授权GraphQL请求,但哈希和缓存逻辑略低效。
- 优化VCL:处理GraphQL缓存键的更简洁、更优化的逻辑,包括在X-Magento-Cache-Id未设置的情况下确保缓存键完整性的回退机制。
- 简化逻辑和性能改进
- 优化VCL更为整洁,逻辑更集中,重复条件更少,性能增强更稳健(例如,cookie合并、更好的查询处理等)。它还引入了增强的调试功能和更细粒度的基于实时条件(如后端健康和动态宽限期)的缓存控制。
兼容性
至少需要Magento 2.4.7。