自定义VCL快速入门

Fastly支持自定义版本的Varnish Configuration Language (VCL),以根据您的要求定制Fastly服务配置。

自定义VCL代码段是添加到已上传到Adobe Commerce站点的活动VCL版本中的VCL逻辑块。 自定义VCL代码段可修改Fastly缓存服务响应请求流量的方式。 例如,您可以添加自定义VCL代码片段,以仅允许来自指定客户端IP地址的请求流量。 或者,创建一个代码片段以阻止来自已知向Adobe Commerce网站发送推荐垃圾邮件的网站的流量。

自定义VCL片段(生成、编译并传输到所有Fastly缓存)无需服务器停机即可加载和激活。

NOTE
在将自定义VCL代码、边缘词典和ACL添加到Fastly模块配置之前,请验证Fastly缓存服务是否可与默认配置配合使用。 请参阅配置Fastly服务

Fastly支持两种类型的自定义VCL片段:

  • 常规代码片段 — 针对特定VCL版本对自定义常规VCL代码片段进行编码。 您可以从Admin或Fastly API创建、修改和部署常规VCL片段。

  • 动态代码片段 — 使用Fastly API创建的VCL代码片段。 您可以修改和部署动态代码片段,而无需更新服务的Fastly VCL版本。

我们建议将自定义VCL片段与Edge字典和访问控制列表(ACL)结合使用,以存储自定义代码中使用的数据。

  • Edge词典 — 将数据作为键值对存储在可从自定义VCL代码片段引用的词典容器中

  • Edge ACL — 存储客户端IP地址数据,该数据定义了使用自定义VCL代码段实现的块或允许规则的访问控制列表

字典和ACL数据会部署到可跨网络区域访问的Fastly Edge节点。 此外,数据可以跨网络动态更新,无需您为暂存或生产环境重新部署VCL代码。

NOTE
如果为暂存环境配置了Fastly服务,则只能将自定义VCL代码段添加到该环境。

教程

本教程和示例演示了如何结合使用常规自定义VCL片段与Edge字典和Edge ACL来自定义Adobe Commerce的Fastly服务配置。 有关更多详细信息,请参阅Fastly文档:

  • Fastly VCL指南 — 有关Fastly Varnish实现、Fastly VCL扩展以及了解有关Varnish和VCL的更多信息的资源。
  • Fastly VCL参考 — 用于开发和排除Fastly自定义VCL和自定义VCL片段的详细编程参考。

您可以从Adobe Commerce管理员或使用Fastly API创建和管理自定义VCL片段:

  • Adobe Commerce管理员 — 我们建议使用Adobe Commerce管理员来管理自定义VCL片段,因为它会自动验证、上传和将VCL更改应用于Fastly服务配置的过程。 此外,您还可以从Admin查看和编辑添加到Fastly服务配置的自定义VCL代码片段。

  • Fastly API — 如果您无法访问管理员,请使用Fastly API管理自定义VCL代码片段。 例如,使用API在站点关闭时对Fastly服务配置进行故障排除,或添加自定义VCL代码片段。 此外,某些操作只能使用API来完成。 例如,必须使用API来重新激活较旧的VCL版本,或查看指定VCL版本中包含的所有VCL片段。 请参阅VCL代码片段的API快速参考

示例VCL代码片段

以下示例显示了按客户端IP地址过滤流量的自定义VCL片段(JSON格式):

{
  "service_id": "FASTLY_SERVICE_ID",
  "version": "{Editable Version #}",
  "name": "apply_acl",
  "priority": "100",
  "dynamic": "1",
  "type": "hit",
  "content": "if ((client.ip ~ {ACLNAME}) && !req.http.Fastly-FF){ error 403; }"
}
WARNING
在此示例中,VCL代码的格式为JSON有效负荷,该有效负荷可以保存到文件中并在Fastly API请求中提交。 要防止在作为API请求的JSON发送代码片段时出现JSON验证错误,请使用反斜杠对代码中的特殊字符进行转义。 请参阅Fastly VCL文档中的使用动态VCL代码片段。 如果您从Admin提交VCL代码片段,则不必转义特殊字符。

content字段中的VCL逻辑执行以下操作:

  • 检查每个请求的传入IP地址client.ip

  • 阻止在​ ACLNAME ​边缘ACL中包含IP地址的任何请求,返回403 Forbidden错误

下表提供了有关自定义VCL代码片段的关键数据的详细信息。 有关更详细的参考,请参阅Fastly文档中的VCL代码片段参考。

描述
API_KEY
用于访问您的Fastly帐户的API密钥。 请参阅获取凭据
active
代码片段或版本的活动状态。 返回truefalse。 如果为true,则表示正在使用代码片段或版本。 使用活动片段的版本号对其进行克隆。
content
要运行的VCL代码段。 Fastly不支持所有VCL语言功能。 此外,Fastly为扩展提供了自定义功能。 有关支持的功能的详细信息,请参阅Fastly VCL编程参考
dynamic
代码片段的动态状态。 为Fastly服务配置的版本化VCL中包含的常规代码段返回false。 返回动态代码片段true,该代码片段可以修改和部署,而无需新的VCL版本。
number
包含代码片段的VCL版本号。 Fastly在其示例值中使用​ 可编辑版本#。 如果从API添加自定义代码片段,请在API请求中包含版本号。 如果从“管理员”添加自定义VCL,则会为您提供版本。
priority

1100的数值,指定自定义VCL代码片段的运行时间。 优先级值较低的代码片段首先运行。 如果未指定,则priority值默认为100

列入允许列表任何优先级值为5的自定义VCL代码段都会立即运行,这最适合实现请求路由(块和以及重定向)的VCL代码。 优先级100最适合覆盖默认VCL代码片段。

Magento-Fastly模块中包含的所有默认VCL片段具有priority=50

  • 分配高优先级(如100)以在所有其他VCL函数之后运行自定义VCL代码并覆盖默认VCL代码。
service_id
特定暂存或生产环境的Fastly服务ID。 将您的项目添加到云基础架构Fastly服务帐户上的Adobe Commerce时,将分配此ID。
type
指定用于插入生成的代码片段的位置,如init(子例程上方)和recv(子例程内)。 有关详细信息,请参阅Fastly VCL片段参考。

从管理员管理自定义VCL

您可以从Admin的​ Fastly配置 > 自定义VCL片段 ​部分添加自定义VCL片段

管理自定义VCL代码片段

自定义VCL代码片段 ​视图仅显示通过管理员添加的代码片段。 如果使用Fastly API添加代码片段,请使用该API 管理它们

以下示例显示如何从管理员创建和管理自定义VCL代码段,以及如何使用Fastly Edge模块和Edge词典:

使用API管理VCL

以下演练向您展示了如何使用Fastly API创建常规VCL代码片段文件并将其添加到您的Fastly服务配置中。 您可以从​ 终端 ​应用程序创建和管理代码片段。 您不需要将SSH连接连接到特定环境。

先决条件:

  • 在云基础架构环境中为Fastly服务配置Adobe Commerce。 查看设置Fastly

  • 获取Fastly API凭据以验证Fastly API的请求。 确保您获得正确环境的凭据:暂存或生产。

  • 将Fastly服务凭据保存为bash环境变量,以便在cURL命令中使用:

    code language-bash
    export FASTLY_SERVICE_ID=<Service-ID>
    
    code language-bash
    export FASTLY_API_TOKEN=<API-Token>
    

    导出的环境变量仅在当前bash会话中可用,并在关闭终端时丢失。 您可以通过导出新值来重新定义变量。 要查看与Fastly相关的导出变量列表,请执行以下操作:

    code language-bash
    export | grep FASTLY
    

添加VCL代码片段

本教程提供了使用Fastly API添加自定义代码片段的基本步骤。

NOTE
要了解如何从Adobe Commerce管理员管理自定义VCL片段,请参阅从Adobe Commerce管理员管理VCL

先决条件

  • 您的环境必须配置为使用Fastly CDN。 请参阅配置Fastly服务

  • 确保您运行的是Magento2的最新版Fastly CDN模块。 请参阅升级Fastly模块

  • 验证Fastly服务的环境配置。 请参阅检查Fastly缓存

  • 您必须拥有管理员凭据才能访问暂存环境和生产环境。

步骤1:找到活动的VCL版本

使用Fastly API 获取版本操作获取活动的VCL版本号:

curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/active

在JSON响应中,请注意number键中返回的活动VCL版本号,例如"number": 99。 克隆VCL进行编辑时需要版本号。

{
  "testing": false,
  "locked": true,
  "number": 99,
  "active": true,
  "service_id": "872zhjyxhto5SIRb3GAE0",
  "staging": false,
  "created_at": "2019-01-29T22:38:53Z",
  "deleted_at": null,
  "comment": "Magento Module uploaded VCL",
  "updated_at": "2019-01-29T22:39:06Z",
  "deployed": false
}

将活动的版本号保存在bash环境变量中,以供在后续API请求中使用:

export FASTLY_VERSION_ACTIVE=<Version>

步骤2:克隆活动VCL版本和所有片段

必须先创建活动VCL版本的副本进行编辑,然后才能添加或修改自定义VCL代码段。 使用Fastly API 克隆操作:

curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_VERSION_ACTIVE/clone -X PUT

在JSON响应中,版本号是递增的,活动 ​键值为false。 可以在本地修改新的非活动VCL版本。

{
  "testing": false,
  "locked": false,
  "number": 100,
  "active": false,
  "service_id": "vW2bLFWhhto5SIRb3GAE0",
  "staging": false,
  "created_at": "2019-01-29T22:38:53Z",
  "deleted_at": null,
  "comment": "Magento Module uploaded VCL",
  "updated_at": "2019-01-29T22:39:06Z",
  "deployed": false
}

将新版本号保存在bash环境变量中,以供在后续命令中使用:

export FASTLY_EDIT_VERSION=<Version>

步骤3:创建自定义VCL代码片段

在JSON文件中创建并保存自定义VCL代码,该代码具有以下内容和格式:

{
  "name": "<name>",
  "dynamic": "0",
  "type": "<type>",
  "priority": "100",
  "content": "<code all in one line>"
}

这些值包括:

  • name - VCL代码片段的名称。

  • dynamic — 指示这是常规代码片段还是动态代码片段

  • type — 指定用于插入生成的代码片段的位置,如init(子例程之上)和recv(子例程内)。 有关这些值的信息,请参阅Fastly VCL代码片段对象值

  • priority — 一个从1100的值,该值决定自定义VCL代码段运行的时间。 首先运行具有较低值的自定义VCL代码段。

    来自Fastly VCL模块的所有默认VCL代码的priority50。 如果希望某个操作最后发生或覆盖默认VCL代码,请使用较高的数字,如100。 要立即运行自定义VCL代码片段,请将优先级设置为较低的值,如5

  • content — 要在一行中运行的VCL代码片段,不带换行符。 请参阅自定义VCL代码片段的示例

步骤4:将VCL代码段添加到Fastly配置

使用Fastly API 创建代码片段操作将自定义VCL代码片段添加到VCL版本中。

curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_EDIT_VERSION/snippet -H 'Content-Type: application/json' -X POST --data @<filename.json>

<filename.json>是您在上一步中准备的文件名。 对每个VCL代码段重复此命令。

如果您从Fastly服务收到500 Internal Server Error响应,请检查JSON文件语法以确保您上传的是有效文件。

步骤5:验证和激活自定义VCL代码片段

添加自定义VCL代码片段后,Fastly会将该代码片段插入到正在编辑的VCL版本中。 要应用更改,请完成以下步骤以验证VCL代码段并激活VCL版本。

  1. 使用Fastly API 验证VCL版本操作来验证更新的VCL代码。

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_EDIT_VERSION/validate
    

    如果Fastly API返回错误,请修复问题并再次验证更新后的VCL版本。

  2. 使用Fastly API 激活操作激活新的VCL版本。

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_EDIT_VERSION/activate -X PUT
    

VCL代码片段的API快速参考

这些API请求示例使用导出的环境变量提供凭据来通过Fastly进行身份验证。 有关这些命令的详细信息,请参阅Fastly API引用

NOTE
使用这些命令来管理您使用Fastly API添加的片段。 如果您从管理员中添加了代码片段,请参阅使用管理员管理VCL代码片段
  • 获取活动的VCL版本号

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/active
    
  • 列出附加到服务的所有常规VCL代码段

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_VERSION/snippet
    
  • 审阅单个代码片段

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_VERSION/snippet/<snippet_name>
    

    <snippet_name>是一个代码片段的名称,如my_regular_snippet

  • 更新代码片段

    修改准备好的JSON文件并发送以下请求:

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_VERSION/snippet/<snippet_name> -H 'Content-Type: application/json' -X PUT --data @<filename.json>
    
  • 删除单个VCL代码片段

    获取代码片段的列表,并使用下面带有特定代码片段名称的curl命令将其删除:

    code language-bash
    curl -H "Fastly-Key: $FASTLY_API_TOKEN" https://api.fastly.com/service/$FASTLY_SERVICE_ID/version/$FASTLY_VERSION/snippet/<snippet_name> -X DELETE
    
  • 覆盖默认Fastly VCL代码中的值

    创建具有更新值的代码片段并分配100优先级。

recommendation-more-help
05f2f56e-ac5d-4931-8cdb-764e60e16f26