【问题标题】:best pratice for varnish cache content with authorization header使用授权标头清漆缓存内容的最佳实践
【发布时间】:2017-08-21 17:37:53
【问题描述】:

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

我使用 oauth2 来授权/验证用户,因此检索用户消息的请求是这样的。

curl -X GET user/{id}/message/thread/{thread} -H 'Authorization: Bearer XXX'

据我了解清漆缓存,如果请求具有授权或 Cookie 标头,清漆的默认设置不会缓存内容,我可以在清漆设置中对标头信息进行条带化,但如果这样做,我将失去控制权后端以识别用户是否是经过身份验证的用户。

所以我的问题是:在这种情况下使用清漆缓存的最佳做法是什么?

目前,我有一个解决方法,而是在标头中发送授权,我将其作为查询字符串附加,所以它将类似于

curl -X GET user/{id}/message/thread/{thread}?access_token=XXX

它有效,但我觉得这不是一个正确的方法,有什么想法吗?

谢谢!

【问题讨论】:

    标签: web-services caching authorization varnish


    【解决方案1】:

    很简单,如果内容因 http 标头而改变,那么您需要返回一个 Vary 标头来指定。

    让 Varnish 缓存带有授权标头的内容很容易。您只需定义自己的 vcl_recv 方法并删除这部分:

    if (req.http.Authorization) { return (pass); }

    这会让 Varnish 缓存它。这是第一部分。第二部分是不为一个用户缓存内容并将其提供给另一个用户。为此,最好的方法是让您的后端使用列表中包含 Authorization 的 HTTP Vary 标头进行响应。这告诉 Varnish 内容会根据该标头而变化。并且该请求标头的更改意味着不同的内容。

    对于不同的用户,授权标头会有所不同,因此您会为同一个 url 获得许多对象。但这就是你想要的。

    【讨论】:

    • 调用“返回(通过);” from vcl_recv 将阻止请求被缓存。见:varnish-cache.org/docs/4.0/users-guide/vcl-actions.html
    • Bruno,是的,这就是为什么评论说要删除默认清漆配置中的那部分。我已经编辑,现在将删除字加粗
    • 详细说明如何define your own vc;_recv:默认实现“在任何用户指定的VCL之后立即执行,并且始终存在。您无法删除它。但是,如果您终止vcl_recv函数使用终止语句之一(通过、管道、查找、错误),默认 VCL 将不会执行,因为控制权从 VRT(VCL 运行时)交回给 Varnish。” book.varnish-software.com/3.0/VCL_Basics.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2011-08-06
    • 2015-11-03
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多