2015-07-03 70 views
0

我在调查是否可以使用Varnish来加速REST API。我可以使用Varnish使任意缓存条目无效吗?

基本上,我想缓存GET需要很长时间。但是,当接收到PUT/POST/DELETE请求时,我想分析该URL,并根据我找到的信息,我想清除缓存条目。

例如:

GET /documents/:docType // return document list for specified docType 
DELETE /document/:docType/:docId // delete a document 

GET /documents/A0 <-- cached 
GET /documents/A1 <-- cached 
DELETE /document/A0/333 <-- first entry is purged 

我可以与VCL实现这一目标?

回答

0

我建议这varnish tutorial entry其中清除和禁令的解释。

清除时应该小心,因为您不应该允许每个人清除网址。

为了做到这一点,你应该这样做:

# IPs allowed to purge 
acl purgeIps { 
    "localhost"; 
    "192.168.55.0"/24; 
} 

然后在你的vcl_recv,你必须决定何时清除/禁令:

if (req.request == "PUT" || 
    req.request == "POST" || 
    req.request == "DELETE"){ 
    if (!client.ip ~ purgeIps) { 
     error 405 "Not allowed."; 
    } 
    purge; #I'm not sure if purge can be done here, if it doesn't work you should use it in vcl_hit and vcl_miss 
    # Also, if purge does not work here you should change this line for return(lookup); 
    error 200 "Purged"; 
} 

Here你可以找到更多的例子禁止和清除

+0

启用PURGE不会造成太大的伤害,因为它清除了一个单一的对象,与确切的URL匹配,并且该URL不能包含通配符(如Varnish sto使用散列标识符而不是URL本身的res对象,所以模式是没有意义的)。另一方面,BAN可能是危险的, – karatedog

+0

是的,这就是我的意思。尽管如此,深入思考它并不是100%肯定的,也许如果你允许清除一个沉重的静态对象,你可以通过清除和重复加载来暴露DDoS攻击。 – Redithion

+0

无论您使用哪种方法,如果在请求中启用 - 说 - PUT方法,然后是新生成的响应,则您仍然易受DDoS攻击,因为此进程无法缓存。潜在的攻击者只需要为该PUT找到适当的URL。虽然不知道应用程序的内部结构,但知道这些重物是什么并不是微不足道的。 – karatedog

相关问题