Varnish的'vcl_hash`

时间:2015-08-20 01:24:34

标签: varnish varnish-vcl

我的理解是varnish的vcl配置文件只是C文件。我的新理解是,清漆的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在幕后做一些聪明的事情?

2 个答案:

答案 0 :(得分:1)

VCL中的return语句实际上是指“actions”。它有效地迫使Varnish进入请求处理的下一阶段。什么都不返回它return (hash)本身对vcl_hash来说实际上看起来很奇怪,因为通常你会从vcl_recv那样做,告诉它进入对象查找阶段。

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

答案 1 :(得分:0)

Hash是一个Varnish变量,来自varnish documentation

  

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

请记住,您可以找到hash作为req.hash(req.hash适用于早于3.0的Varnish版本)

hash_data按照你的说法工作,更具体地说(再次来自varnish documentation):

  

hash_data(STR)

     

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