清漆和http标头

Ido*_*lon 3 varnish

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

ivy*_*ivy 10

是的你可以.该API密钥应该如何考虑?如果您希望为每个用户提供唯一的缓存条目,则仅在特定用户多次请求相同数据时使用缓存.通过设置正确的Cache-Control HTTP Response标头(尽管数据新鲜度未重新验证),您可以在不使用清漆等高速缓存代理的情况下获得很长的路要走.

在Varnish中至少有两种方法;

  1. 让您的应用程序返回HTTP-Response标头Vary:apikey.如果apikey请求标头相同,则指示任何HTTP级缓存(如清漆)仅重用缓存结果.

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

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

  • 散列/密钥查找是O(1),Vary标头查找是O(n),其中n是不同api密钥的数量.如果您有许多具有相同散列的不同缓存条目,则必须考虑每个条目并检查它们的所有Vary-header是否与当前请求匹配.如果你有许多不同的api密钥,只有很少的缓存密钥/响应,这可能是低效的.检查方法VRY_Match中bin/varnishd/cache_vary.c中的代码. (3认同)
  • 对于#2,您还需要在“ vcl_recv”末尾进行“ return(hash);”操作,以避免默认逻辑默认情况下“通过”所有带有“ Authorization”或“ Cookie”标头的请求。 (2认同)