【问题标题】:Why can header.copy not be used in vcl_deliver?为什么在 vcl_deliver 中不能使用 header.copy?
【发布时间】:2021-05-12 18:40:24
【问题描述】:

我想知道 varnish 和标头 vmod 的意外行为。 由于header.copyvcl_deliver 中的使用,以下vcl 将无法编译。

为什么这里不允许使用header.copy?有没有关于这种行为的文档? varnish 的文档和标题都没有说明任何内容。

我不需要解决方法。我已经有了。

vcl 4.1;

import header;
backend default {
    .host = "127.0.0.1";
    .port = "8888";
}

sub vcl_backend_response {
  header.copy(beresp.http.Set-Cookie, beresp.http.X-Set-Cookie);
  unset beresp.http.Set-Cookie;
}

sub vcl_deliver {
  header.copy(beresp.http.X-Set-Cookie, beresp.http.Set-Cookie);
  unset beresp.http.X-Set-Cookie;
}

编译时会出现如下错误

2 月 9 日 06:40:11 epcentos7.dev varnishd[12938]:错误:2 月 9 日 06:40:11
epcentos7.dev varnishd[12938]:来自 VCC 编译器的消息:2 月 9 日
06:40:11 epcentos7.dev varnishd[12938]: ('/etc/varnish/default.vcl'
第 15 行,第 15 行)-(第 20 行)2 月 9 日 06:40:11 epcentos7.dev
varnishd[12938]: header.copy(beresp.http.X-Set-Cookie,
beresp.http.Set-Cookie); 2 月 9 日 06:40:11 epcentos7.dev
清漆[12938]:
--------------######------------------------------ --------------
2 月 9 日 06:40:11 epcentos7.dev varnishd[12938]:在子程序中不可用
'vcl_deliver'。 2 月 9 日 06:40:11 epcentos7.dev varnishd[12938]:运行
VCC 编译器失败,退出 2 Feb 09 06:40:11 epcentos7.dev
varnishd[12938]:VCL 编译失败 2 月 9 日 06:40:11 epcentos7.dev
systemd[1]: varnish.service: 控制进程退出,code=exited
status=255 Feb 09 06:40:11 epcentos7.dev systemd[1]: 启动失败
Varnish Cache,一种高性能的 HTTP 加速器。

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

    beresp 对象在 vcl_deliver 中不可用,因为它是不同流程的一部分。等效为resp,这将导致以下header.copy() 行:

    sub vcl_deliver {
      header.copy(resp.http.X-Set-Cookie, resp.http.Set-Cookie);
      unset resp.http.X-Set-Cookie;
    }
    

    交易范围

    Varnish 有 2 种事务:

    • 客户端事务:从客户端接收请求,并将响应提供给客户端
    • 后端事务:向后端发送后端请求,从后端接收后端响应

    当一个请求导致缓存命中时,Varnish 只需要一个客户端事务来处理它。没有与后端建立连接,因此不使用后端事务

    当请求导致缓存未命中时,Varnish 将使用客户端事务与客户端交互,以及后端事务从后端获取非缓存数据

    子程序范围

    考虑到事务范围,我们现在可以将VCL 子例程映射到它。

    以下是客户端子例程的概述:

    • vcl_recv
    • vcl_hash
    • vcl_miss
    • vcl_hit
    • vcl_pass
    • vcl_deliver
    • vcl_synth
    • vcl_purge

    这些事务可以访问req 对象和resp 对象以获取请求和响应。

    还有后端子程序如:

    • vcl_backend_fetch
    • vcl_backend_response
    • vcl_backend_error

    这些子例程可以访问bereqberesp 对象。

    对象流

    当收到请求时,请求信息存储在req对象中。当请求导致缓存未命中时,req 对象信息被复制到bereq 对象中。

    当后端响应时,beresp 对象包含(潜在的)可缓存信息。 beresp 对象数据被复制到 obj 对象中,该对象表示存储在缓存中的内容,同时也复制到 resp 对象中,该对象用于向请求它的客户端提供响应。

    【讨论】:

    • 谢谢!不敢相信我没有看到。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多