ADC

配置选择器和基本内容组

您可以配置选择器并将其应用于内容组。向一个或多个内容组添加选择器时,您可以指定选择器是用于标识缓存请求还是标识要失效(过期)的缓存对象。选择器是可选的。或者,您可以将内容组配置为使用 hit 参数和失效参数。但是,Citrix 建议您配置选择器。

配置选择器或决定改用参数后,就可以设置基本内容组了。创建基本内容组后,您需要决定如何从缓存中过期对象,并配置缓存过期。您可以按照 提高缓存性 能和 配置 Cookie、标头和轮询中所述进一步修改缓存,但是您可能首先要配置缓存策略。

注意

内容组参数和选择器仅在请求时使用,通常将它们与使用 MAY_CACHE 或 MAY_NOCACHE 操作的策略相关联。

选拔者的优势

选择器是用于在内容组中定位特定对象的过滤器。如果您未配置选择器,Citrix® ADC 设备将在内容组中查找完全匹配的内容。这可能会导致内容组中存在同一个对象的多个副本。例如,没有选择器的内容组可能需要存储 host1.domain.com\ mypage.htm、host2.domain.com\ mypage.htm 和 host3.domain.com\ mypage.htm 的 URL。相比之下,选择器只能匹配 URL(mypage.html,使用表达式 http.req.url)和域(.com,使用表达式 http.req.hostname.domain),从而允许使用相同的 URL 满足请求。

选择器表达式可以执行参数的简单匹配(例如,查找与一些查询字符串参数及其值相匹配的对象)。选择器表达式可以使用布尔逻辑、算术运算和属性组合来识别对象(例如,URL 词干的分段、查询字符串、POST 请求正文中的字符串、HTTP 标头中的字符串、Cookie)。选择器还可以执行编程功能来分析请求中的信息。例如,选择器可以提取 POST 正文中的文本,将文本转换为列表,并从列表中提取特定项目。

有关表达式以及可以在表达式中指定的内容的详细信息,请参阅 策略和表达式

使用参数而不是选择器

尽管 Citrix 建议将选择器与内容组结合使用,但您可以改为配置 hit 参数和失效参数。例如,假设您在内容组中为错误报告配置三个 hit 参数:BugID、颁发者和受理人。如果请求包含 BugID=456、Issuer=RohitV 和 Assignee=Robert,NetScaler 设备可以提供与这些参数-值对匹配的响应。

内容组中的失效参数会使缓存的条目过期。例如,假设 BugID 是一个失效参数,用户发出 POST 请求以更新错误报告。失效策略将请求定向到该内容组,内容组的失效参数会使所有与 bugID 值匹配的缓存响应过期。(下次用户为此报告发出 GET 请求时,缓存策略可以让 NetScaler 设备刷新来自原始服务器的报告的缓存条目。)

请注意,同一个参数可以用作 hit 参数或失效参数。

内容组按以下顺序提取请求参数:

  • URL 查询
  • 帖子正文
  • Cookie标题

在参数首次出现之后,无论它出现在请求中的哪个位置,其后续出现的所有情况都将被忽略。例如,如果 URL 查询和 POST 正文中都存在一个参数,则只考虑 URL 查询中的参数。

如果您决定对内容组使用命中和失效参数,请在配置内容组时配置这些参数。

注意:Citrix 建议您使用选择器而不是参数化内容组,因为选择器更灵活,可以适应更多类型的数据。

配置选择器

内容组可以使用命中选择器来检索缓存命中,或者使用失效选择器来过期的缓存对象并从原始服务器获取新的对象。

选择器包含一个名称和一个称为 高级表达式的逻辑表达式

有关高级表达式的详细信息,请参阅 策略和表达式

要配置选择器,请为其分配一个名称并输入一个或多个表达式。作为最佳实践,选择器表达式应包含 URL 主和主机,除非有充分的理由将其省略。

使用 CLI 配置选择器

在命令提示符下,键入:

add cache selector \<selectorName\> ( \<rule\> ... )

有关配置 一个或多个表达式的信息,请参阅使用命令行界面配置选择器表达式。

>add cache selector product_selector "http.req.url.query.value("ProductId")" "http.req.url.query.value("BatchNum")" "http.req.url.query.value("depotLocation")"

> add cache selector batch_selector "http.req.url.query.value("ProductId")" "http.req.url.query.value("BatchId")" "http.req.url.query.value("depotLocation")"

> add cache selector product_id_selector "http.req.url.query.value("ProductId")"

> add cache selector batchnum_selector "http.req.url.query.value("BatchNum")" "http.req.url.query.value("depotLocation")"

> add cache selector batchid_selector "http.req.url.query.value("depotLocation")" "http.req.url.query.value("BatchId")"

<!--NeedCopy-->

使用 GUI 配置选择器

导航到 优化 > 集成缓存 > 缓存选择器,然后添加缓存选择器。

内容组

内容组是用于存放可在响应中提供的缓存对象的容器。首次启用集成缓存时,可缓存的对象将存储在名为 Default 的内容组中。您可以创建具有唯一属性的内容组。例如,您可以为图像数据、错误报告和股票报价定义单独的内容组,并且您可以将股票报价内容组配置为比其他组更频繁地刷新。

您可以配置整个内容组或内容组中选定条目的到期时间。

内容组中的数据可以是静态的,也可以是动态的,如下所示:

  • 静态内容组。在请求上的 URL 主干和主机名与响应的 URL 主干和主机名之间找到完全匹配的结果。
  • 动态内容组。查找包含特定参数值对、任意字符串或字符串模式的对象。当缓存频繁更新的数据(例如,错误报告或股票报价)时,动态内容组非常有用。

提供来自内容组的请求

  1. 用户输入项目的搜索条件,例如错误报告,然后单击 HTML 表单中的查找按钮。
  2. 浏览器发出一个或多个 HTTP GET 请求。这些请求包含参数(例如,错误所有者、错误 ID 等)。
  3. 当 NetScaler 设备收到请求时,它会搜索匹配的策略,如果找到与这些请求匹配的缓存策略,它会将请求定向到内容组。
  4. 内容组根据您在选择器中配置的条件在内容组中查找合适的对象。

例如,内容组可以检索匹配的响应 NameField=username and BugID=ID

  1. 如果找到匹配的对象,NetScaler 设备可以将它们提供给用户的浏览器,然后将它们汇编成完整的响应(例如,错误报告)。

使内容组中的对象失效

  1. 用户修改数据(例如,用户修改错误报告并单击“提交”按钮)。
  2. 浏览器以一个或多个 HTTP 请求的形式发送这些数据。例如,它可以以多个 HTTP POST 请求的形式发送错误报告,其中包含有关错误所有者和错误 ID 的信息。
  3. NetScaler 设备将请求与失效策略进行匹配。通常,这些策略被配置为检测 HTTP POST 方法。
  4. 如果请求与失效策略匹配,NetScaler 设备将搜索与此策略关联的内容组,并使符合配置的失效标准的响应过期。

例如,失效选择器可以找到匹配的响应 NameField=username and BugID=ID

  1. 下次当 NetScaler 设备收到对这些响应的 GET 请求时,它会从原始服务器获取刷新版本,缓存刷新后的响应,并将这些响应提供给用户的浏览器,在那里它们汇编成一份完整的错误报告。

设置基本内容组

默认情况下,所有缓存数据都存储在默认内容组中。您可以配置更多内容组并在一个或多个策略中指定这些内容组。

您可以为静态内容配置内容组,并且必须为动态内容配置内容组。您可以修改任何内容组的配置,包括默认组。

使用命令行界面设置基本内容组

在命令提示符下,键入:

add cache contentgroup <name> (-hitSelector <hitSelectorName> -invalSelector <invalidationSelectorName> | -hitParams <hitParamName> -invalParams<invalidationParamName>) -type <type> [-relExpiry <sec> | -relExpiryMilliSec <msec>] [-heurExpiryParam <positiveInteger>]

add cache contentgroup Products_Details –hitSelector product_selector –invalSelector id_selector

add cache contentgroup bugrep -hitParams IssuePage RecordID Template TableId -invalParams RecordID -relExpiry 864000

使用 GUI 设置基本内容组

导航到 优化 > 集成缓存 > 内容组,然后创建内容组。

过期或刷新缓存对象

如果响应没有过期标头或带有过期时间(Max-Age 或 Smax-Age)的 Cache-Control 标头,则必须使用以下方法之一使内容组中的对象过期:

  • 配置内容组过期设置以确定是否保留对象以及保留多长时间。
  • 为内容组配置失效策略和操作。有关更多信息,请参阅 配置缓存和失效的策略
  • 手动使内容组或其中的对象过期。

缓存的响应到期后,NetScaler 设备会在下次客户端发出响应请求时刷新该响应。默认情况下,当缓存已满时,NetScaler 设备会首先替换最近最少使用的响应。

以下列表描述了使用内容组的设置使缓存响应过期的方法。通常,这些方法以百分比或秒为单位指定:

  • 手动。手动使内容组中的所有响应或缓存中的所有响应失效。
  • 基于响应。正面和负面回复的特定到期间隔。只有在响应中缺少 Last-Modifided 标头时,才会考虑基于响应的过期时间。
  • 启发式过期。对于具有“上次修改”标头的响应,启发式过期指定修改响应时间的时间(计算为当前时间减去上次修改时间,乘以启发式过期值)。例如,如果“最后修改”标头指示响应在 2 小时前更新,并且启发式过期设置为 10%,则缓存的对象在 0.2 小时后过期。此方法假设经常更新的响应必须更频繁地过期。
  • 绝对或相对。以 HH: MM 格式、当地时间或 GMT 指定响应每天到期的确切(绝对)时间。本地时间可能不适用于所有时区。

相对过期时间指定从缓存未命中导致前往源服务器的行程到响应过期之间的几秒或毫秒。如果以毫秒为单位指定相对过期,请输入 10 的倍数。这种过期形式适用于所有正面回复。将忽略响应中的 Last-Modified、Expires 和 Cache-Control 标头。

绝对和相对过期时间将覆盖响应本身中的任何到期信息。

  • 正在下载。“收到完整回复后过期”选项将在下载响应时过期。这对于频繁更新的响应非常有用,例如股票报价。默认情况下,此选项处于禁用状态。

启用 Flash Cache 和“收到完整响应后过期”可提高动态应用程序的性能。当您同时启用这两个选项时,NetScaler 设备仅为一组并发请求获取一个响应。

  • 已固定。默认情况下,当缓存已满时,NetScaler 设备会首先替换最近最少使用的响应。NetScaler 设备不会将此行为应用于标记为已固定的内容组。

如果不为内容组配置过期设置,则以下是用于在组中使对象过期的更多选项:

  • 使用应用于内容组的 INVAL 操作配置策略。
  • 配置使用 INVAL 操作的策略时,输入内容组的名称。

过期方法是如何应用的

对于正面和负面响应,过期效果不同。下面提到的“正面回复到 期”和“否定回复”表中描述了正面和负面回复

以下是用于了解应用于内容组的过期方法的经验法则:

  • 在决定是否使对象过期时,您可以控制 NetScaler 设备是否评估响应标头。
  • 绝对和相对过期会导致 NetScaler 设备忽略响应标头(它们会覆盖响应中的任何过期信息)。
  • 启发式过期设置以及“弱阳性”和“弱负值”过期时间(在配置实用程序中标记为 默认 值)会导致 NetScaler 设备检查响应标头。这些设置可协同工作,如下所示:
    • 过期或 Cache-Control 标题中的值会覆盖这些内容组设置。
    • 对于缺少过期或 Cache-Control 标头但带有最后修改标头的肯定回复,NetScaler 设备会将启发式过期设置与标头值进行比较。
    • 对于缺少过期、缓存控制或上次修改标头的积极响应,NetScaler 设备使用“弱正值”值。
    • 对于缺少过期或 Cache-Control 标头的负面响应,NetScaler 设备使用“弱负值”。

下表介绍了如何应用这些方法。

响应类型 到期标题类型 内容组设置 对象在缓存中停留的时间段
积极的 任何标题 无需其他设置即可使内容过期 (relexPiry) 使用“在内容后过期”设置的值。
积极的 任何标题 无需其他设置即可在 (absExPiry) 将内容过期 从“过期 内容时间”设置的值中减去当前日期
积极的 任何标题 在 (relexPiry) 之后使内容过期并将内容在 (absExpiry) 过期 使用两个值中的较小值进行内容组设置。参见此表中的前几行。
积极的 上次修改时间(与任何其他标题一起修改) 具有任何其他设置的启发式(heureXpiry 参数) 从当前日期中减去上次修改日期,将结果乘以启发式到期设置的值,然后除以 100。
积极的 上次修改时间(与任何其他标题一起修改) 默认(正数)(WeakpoSrel 到期),没有其他设置 使用默认(正)到期时间设置的值。
积极的 Expires 或 Cache-Control:存在 Max-Age 标头 上次修改的标题不存在、启发式(heureXpiry 参数)、默认值(正)(WeakpoSrel 到期)或两者兼有 从过期或日期中减去当前日 Cache-Control:Max-Age 期。
积极的 不缓存标题 默认(正数)(WeakpoSrel 到期)和任何其他到期设置 使用默认(正)设置的值。
积极的 不缓存标题 启发式(heureXpiry 参数)存在,默认(正)(WeakpoSrel 过期)设置不存在。 如果缺少最后修改的标头,则不缓存响应或缓存为“已过期”状态。如果存在上次修改的标头,请使用启发式到期值。
负面的 过期或 Cache-Control:Max-Age Expire Content After (relExpiry)、Expire Content At (absExpiry) 或两个设置 从 Expires 标头的值中减去当前日期,或者使用 Cache-Control: Max-Age 标头的值。
负面的 过期或缓存控制标头不存在 Expire Content After (relExpiry)、Expire Content At (absExpiry) 或两个设置 响应未缓存,或者响应的缓存状态为“已过期”。
负面的 过期或 Cache-Control:Max-Age 任何设置 从过期或日期中减去当前 Cache-Control:Max-Age 日期。
负面的 过期和 Cache-Control: Max-Age 头文件不存在 Default (negative) (weakNegRel Expiry) 使用默认(负数)设置的值。
负面的 过期和 Cache-Control: Max-Age 头文件不存在 除默认(负值)以外的任何设置(WeakneGrel 到期) 对象未缓存或缓存状态为“已过期”。

通过手动方法使内容组过期

您可以手动使内容组中的所有条目过期。

使用命令行界面手动使内容组中的所有响应失效

在命令提示符下,键入:

expire cache contentGroup <name>

使用 GUI 手动使内容组中的所有响应过期

导航到“优化”>“集成缓存”>“内容组”,选择内容组,然后单击“失效”以使内容组中的所有响应过期。

使用 GUI 手动使缓存中的所有响应过期

导航到“优化”>“集成缓存”>“内容组”,然后单击“全部失效”以使缓存中的所有响应过期。

配置内容组的定期到期

您可以配置内容组,使其对其条目执行选择性过期或完全过期。到期间隔可以是固定的,也可以是相对的。

使用命令行界面配置内容组到期时间

在命令提示符下,键入:

set cache contentgroup \<name> (-relExpiry|-relExpiryMilliSec|-absExpiry|-absExpiryGMT| -heurExpiryParam|-weakPosRelExpiry|-weakNegRelExpiry| -expireAtLastBye) \<expirationValue>

使用 GUI 配置内容组到期时间

导航到 优化 > 集成缓存 > 内容组,选择内容组,然后指定过期方法。

使个人回复过期

响应到期会强制 NetScaler 设备从原始服务器获取刷新的副本。例如,没有验证器 ETag 或“上次修改的标头”的响应无法重新验证。因此,刷新这些响应具有与过期响应相同的效果。

要使静态数据的内容组中缓存响应过期,您可以指定必须与存储 URL 匹配的 URL。如果缓存的响应是参数化内容组的一部分,则必须指定组名称和确切的 URL 干。主机名和端口号必须与缓存响应的主机 HTTP 请求标头中的相同。如果未指定端口,则假定为端口 80。

使用命令行界面使内容组中的单个响应失效

在命令提示符下,键入:

expire cache object -url <URL> -host <hostName> [-port <port>] [-groupName<contentGroupName>] [-httpMethod GET|POST]

使用 CLI 使内容组中的单个响应失效

在命令提示符下,键入以下命令:

expire cache object -locator <positiveInteger>

使用 GUI 使缓存的响应失效

导航到 优化 > 集成缓存 > 缓存对象,选择缓存的响应,然后过期。

使用 GUI 使响应失效

导航到“优化”>“集成缓存”>“缓存对象”,单击“搜索”,设置搜索条件以查找所需的缓存响应并过期。

刷新内容组中的回复

您可以删除或刷新内容组中的所有回复、组中的某些回复或缓存中的所有响应。刷新缓存的响应可以为新的缓存响应腾出内存。

注意:

要一次刷新多个对象的响应,请使用配置实用程序方法。命令行界面不提供此选项。

使用命令行界面刷新内容组的响应

在命令提示符下,键入:

flush cache contentGroup <name> [-query <queryString> | [-selectorValue <selectorExpressionIDList> -host <hostName>]]

使用 GUI 刷新内容组的响应

  1. 导航到“优化”>“集成缓存”>“内容组”。
  2. 在详细信息窗格中,按如下方式刷新响应:
    • 要刷新所有内容组中的所有响应,请单击“全部无效”,然后刷新所有响应。
    • 要刷新特定内容组中的回复,请选择该内容组,单击“失效”,然后刷新所有回复。

注意: 如果此内容组使用选择器,则可以通过在选择器值文本框中输入字符串,在主机文本框中输入主机名来选择性地刷新响应。然后单击“刷新”和“确定”。选择器值可以是最多 2319 个字符的查询字符串,用于参数化失效。

如果内容组使用失效参数,则可以通过在 查询 字段中输入字符串来选择性地刷新响应。

如果内容组使用失效参数,并且配置了属于目标主机的对象失效,请在 查询和主机 字段中输入字符串。

使用命令行界面刷新缓存的响应

在命令提示符下,键入:

flush cache object -locator <positiveInteger> | -url <URL> -host <hostName> [-port <port>] [-groupName <contentGroupName>] [-httpMethod GET|POST]

使用 GUI 刷新缓存的响应

导航到“优化”>“集成缓存”>“缓存对象”,选择缓存的对象,然后刷新。

删除内容组

如果任何在缓存中存储响应的策略未使用内容组,则可以将其删除。如果内容组绑定到某个策略,则必须先删除该策略。删除内容组会删除该组中存储的所有响应。

您无法删除默认值、BASEFILE 或 Deltas 组。默认组存储不属于任何其他内容组的缓存响应。

使用命令行界面删除内容组

在命令提示符下,键入:

rm cache contentgroup <name>

使用 GUI 删除内容组

导航到 优化 > 集成缓存 > 内容组, 选择内容组,然后删除。

配置选择器和基本内容组