【问题标题】:Implementation of Varnish's `vcl_hash`Varnish的`vcl_hash`的实现
【发布时间】:2015-10-01 01:10:07
【问题描述】:

据我了解,varnish 的vcl 配置文件只是C 文件。我的新理解是 varnish 的 VCL 文件是一种特定于领域的语言,与 C 有许多相似之处。但是,我不熟悉现代 C,而且对我的穴居人学院 C 非常生疏,我不明白 varnish 的vcl_hash 函数有效。

具体来说,典型的vcl_hash 函数将如下所示。

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (hash);
}

hash_data 函数调用看起来非常简单——我假设它会将缓存键所需的信息添加到某种数据结构中。

让我困惑的是最后的电话

return (hash);

vcl_hash 返回这里是什么? (hash) 是什么?它是一个函数吗?如果是这样,C 是如何在没有括号的情况下调用它的 (hash())——或者 varnish 在幕后做了什么聪明的事情?

【问题讨论】:

  • sub 是 C 关键字吗?新标准?
  • 感谢两位,澄清问题以消除错误假设。
  • @Olaf sub 不是 C 关键字,它只是定义函数的 varnish 关键字。
  • @Redithion:不开玩笑!我真的在寻找 C15 标准。 ;-) - 免责声明:如果你发现讽刺,请善待它并给它一个好家。与巨魔一起喂食。

标签: varnish varnish-vcl


【解决方案1】:

VCL 中的返回语句实际上是指“动作”。它有效地强制 Varnish 进入请求处理的下一个阶段。什么都不返回 从vcl_hash 本身对return (hash) 来说实际上似乎很奇怪,因为通常您会从 vcl_recv 执行此操作以告诉它进入对象查找阶段。

通常 vcl_hash 将 return (lookup) 或什么都没有(使用“内置”vcl_hash 来完成,它应用主机名和 url)。 “查找”将短路可能存在的任何其他 vcl_hash 实现并直接进入查找阶段。

【讨论】:

    【解决方案2】:

    Hash 是 Varnish 变量,来自varnish documentation:

    用于引用缓存中对象的哈希键。两者都使用 读取和写入缓存。

    请记住,您可以找到哈希作为 req.hash(req.hash 用于 3.0 之前的 Varnish 版本)

    hash_data 正如你所说的那样工作,更具体地说(再次来自varnish documentation):

    hash_data(str)

    将字符串添加到哈希输入。在 default.vcl 中,hash_data() 在请求的主机和 URL 上被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2012-01-19
      • 2014-06-13
      • 2017-05-23
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多