Web services 具有授权标头的varnish缓存内容的最佳实践

Web services 具有授权标头的varnish缓存内容的最佳实践,web-services,caching,authorization,varnish,Web Services,Caching,Authorization,Varnish,我已经在我的应用程序中实现了一个类似facebook的消息系统,现在我尝试使用varnish来提高性能(即缓存用户消息对话)。必须保护用户对话,以便只有经过身份验证的用户才能查看它 我使用oauth2对用户进行授权/身份验证,因此检索用户消息的请求是这样的 curl -X GET user/{id}/message/thread/{thread} -H 'Authorization: Bearer XXX' 就我对varnish缓存的理解而言,如果请求具有授权或Cookie头,varnish的

我已经在我的应用程序中实现了一个类似facebook的消息系统,现在我尝试使用varnish来提高性能(即缓存用户消息对话)。必须保护用户对话,以便只有经过身份验证的用户才能查看它

我使用oauth2对用户进行授权/身份验证,因此检索用户消息的请求是这样的

curl -X GET user/{id}/message/thread/{thread} -H 'Authorization: Bearer XXX'
就我对varnish缓存的理解而言,如果请求具有授权或Cookie头,varnish的默认设置将不会缓存内容,我可以在varnish设置中条带化头信息,但如果这样做,我将失去后端的控制,无法识别用户是否是经过身份验证的用户

所以我的问题是:在这种情况下,使用varnish缓存的最佳实践是什么

目前,我有一个变通方法,可以在标题中发送授权,我将其附加为查询字符串,因此类似于

curl -X GET user/{id}/message/thread/{thread}?access_token=XXX
这是可行的,但我觉得这不是一个合适的方式,有什么想法吗


谢谢

非常简单,如果内容因为http头而更改,那么您需要返回一个Vary头来指定它

让Varnish使用授权头缓存内容很容易。您只需定义自己的
vcl\u recv
方法并删除此部分:


if(请求http授权){
返回(通行证);
}

这将让Varnish缓存它。这是第一部分。第二部分是不缓存一个用户的内容,而是将其提供给另一个用户。要做到这一点,最好的方法是让您的后端响应一个HTTP
Vary
头,该头在列表中具有
授权
。这会告诉Varnish,内容会根据标题的不同而变化。请求头中的更改意味着不同的内容


授权头对于不同的用户是不同的,因此对于同一个url,您将获得许多对象。但这正是您想要的。

从vcl_recv调用“return(pass);”将阻止缓存请求。请看:Bruno,是的,这就是为什么评论说要删除默认varnish配置中的部分。我已经编辑过,现在就把删除这个词改成粗体,详细说明如何
定义你自己的vc_recv
:默认实现“在任何用户指定的VCL之后立即执行,并且始终存在。您不能删除它。但是,如果您使用终止语句之一(pass、pipe、lookup、error)终止VCL_recv函数,则默认VCL将不会执行,因为控制权从VRT(VCL运行时)返回上光。”