【问题标题】:varnish and http header清漆和http头
【发布时间】:2011-08-31 05:34:29
【问题描述】:

我是 Varnish 的新手,我想知道 Varnish 是否支持使用 http 标头进行缓存。 我们设计了一个基于 Rest 的 web 服务,我正在考虑使用 Varnish 来缓存结果。 一些请求信息(apikey)是如何通过 http 标头传递的,我想知道 Varnish 在检查传入请求(与查询字符串)时是否可以考虑到它。

【问题讨论】:

    标签: varnish


    【解决方案1】:

    是的,你可以。应该如何考虑这个 API 密钥?如果您希望每个用户都有唯一的缓存条目,则仅当特定用户多次请求相同数据时才使用缓存。通过设置正确的 Cache-Control HTTP 响应标头(尽管不会重新验证数据新鲜度),您可以在不使用 varnish 之类的缓存代理的情况下取得长足进步。

    在 Varnish 中至少有两种方法;

    1. 让您的应用程序返回一个 HTTP-Response 标头 Vary: apikey。这指示任何 HTTP 级别缓存(如 varnish)仅在 apikey 请求标头相同时重用缓存结果.

    2. 或者,更有效的是,修改 vcl 配置中的 vcl_hash 函数以考虑 apikey 标头。

      sub vcl_hash { 设置 req.hash += req.http.apikey; }

    【讨论】:

    • 为什么您认为 vcl_hash 更改比 Vary 标头更有效?我认为“Vary: apikey”标头选项是一个更好的选择,因为它可以与任何中间缓存一起使用,并且不依赖于对您的应用程序逻辑隐藏的 Varnish“魔法”。
    • Hash/Key 查找为 O(1),Vary 标头查找为 O(n),其中 n 是不同 api 键的数量。如果您有许多具有相同哈希的不同缓存条目,则必须考虑每个条目并检查它的所有 Vary-headers 是否与当前请求匹配。如果您有许多不同的 api 键,并且只有很少的缓存键/响应,这可能会效率低下。在方法 VRY_Match 中检查 bin/varnishd/cache_vary.c 中的代码。
    • 对于#2,您还需要在vcl_recv 的末尾加上return (hash); 以避免默认逻辑默认pass 所有带有AuthorizationCookie 标头的请求.
    猜你喜欢
    • 2013-07-16
    • 2012-06-22
    • 1970-01-01
    • 2014-01-08
    • 2014-01-09
    • 1970-01-01
    • 2012-07-20
    • 2011-07-31
    • 2011-09-28
    相关资源
    最近更新 更多