Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/nginx/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching HTTP缓存和ETAG头_Caching_Nginx_Varnish_Etag - Fatal编程技术网

Caching HTTP缓存和ETAG头

Caching HTTP缓存和ETAG头,caching,nginx,varnish,etag,Caching,Nginx,Varnish,Etag,在进行了大量不成功的研究之后,我想知道是否可以使用nginx或varnish cache函数来检查它所包含的数据新鲜度,使用头中的etag属性 使用图表更容易解释此场景,请参见以下内容: 你认为这个用例可行吗 谢谢你,对不起我的英语:你可以用清漆做类似的事情,但不完全一样。前端缓存的想法是,当后端将对象发送到缓存时,它会设置一个Expires头,允许缓存在不影响后端的情况下提供此内容。如果缓存会用后端检查每个请求,那么就不会有太多的速度可以提高,因为您最终会在每个请求上等待后端 要解决这个问题

在进行了大量不成功的研究之后,我想知道是否可以使用nginx或varnish cache函数来检查它所包含的数据新鲜度,使用头中的etag属性

使用图表更容易解释此场景,请参见以下内容:

你认为这个用例可行吗


谢谢你,对不起我的英语:你可以用清漆做类似的事情,但不完全一样。前端缓存的想法是,当后端将对象发送到缓存时,它会设置一个Expires头,允许缓存在不影响后端的情况下提供此内容。如果缓存会用后端检查每个请求,那么就不会有太多的速度可以提高,因为您最终会在每个请求上等待后端

要解决这个问题,您应该相应地设置Expires头,并且/或者如果突然需要在Expires之前清除过时的内容,则清除/禁止URL。这样,缓存将从自己的缓存发送内容,如果没有内容或内容过时,则从后端获取内容

编辑:

我使用Varnish 4.0.1进行了测试,它支持对后端的有条件请求

我的测试设置是一个Apache虚拟主机,具有
ExpiresByType text/html“访问加5秒”

结果是:

*   << BeReq    >> 65539
-   Begin          bereq 65538 bgfetch
-   Timestamp      Start: 1418403624.141695 0.000000 0.000000
-   BereqMethod    GET
-   BereqURL       /prueba.html
-   BereqProtocol  HTTP/1.1
-   BereqHeader    User-Agent: lwp-request/6.03 libwww-perl/6.05
-   BereqHeader    X-Forwarded-For: 127.0.0.1
-   BereqHeader    Host: localtest
-   BereqHeader    Surrogate-Capability: key=ESI/1.0
-   BereqHeader    Accept-Encoding: gzip
-   BereqHeader    If-Modified-Since: Thu, 01 Dec 2011 10:37:55 GMT
-   BereqHeader    If-None-Match: "3e8be5-46-4b30571f606c0"
-   BereqHeader    X-Varnish: 65539
-   VCL_call       BACKEND_FETCH
-   VCL_return     fetch
-   Backend        17 vdir server1(127.0.0.1,,80)
-   Timestamp      Bereq: 1418403624.141869 0.000174 0.000174
-   Timestamp      Beresp: 1418403624.143205 0.001510 0.001336
-   BerespProtocol HTTP/1.1
-   BerespStatus   304
-   BerespReason   Not Modified
-   BerespHeader   Date: Fri, 12 Dec 2014 17:00:24 GMT
-   BerespHeader   Server: Apache
-   BerespHeader   ETag: "3e8be5-46-4b30571f606c0"
-   BerespHeader   Expires: Fri, 12 Dec 2014 17:00:29 GMT
-   BerespHeader   Cache-Control: max-age=5
-   TTL            RFC 5 -1 -1 1418403624 1418403624 1418403624 1418403629 5
-   BerespProtocol HTTP/1.1
-   BerespStatus   200
-   BerespReason   OK
-   BerespHeader   Last-Modified: Thu, 01 Dec 2011 10:37:55 GMT
-   BerespHeader   Content-Type: text/html
-   VCL_call       BACKEND_RESPONSE
-   TTL            VCL 5 21600 0 1418403624
-   VCL_return     deliver
-   Storage        malloc s0
-   ObjProtocol    HTTP/1.1
-   ObjStatus      200
-   ObjReason      OK
-   ObjHeader      Date: Fri, 12 Dec 2014 17:00:24 GMT
-   ObjHeader      Server: Apache
-   ObjHeader      ETag: "3e8be5-46-4b30571f606c0"
-   ObjHeader      Expires: Fri, 12 Dec 2014 17:00:29 GMT
-   ObjHeader      Cache-Control: max-age=5
-   ObjHeader      Last-Modified: Thu, 01 Dec 2011 10:37:55 GMT
-   ObjHeader      Content-Type: text/html
-   BackendReuse   17 server1(127.0.0.1,,80)
-   Timestamp      BerespBody: 1418403624.143465 0.001770 0.000260
-   Length         70
-   BereqAcct      289 0 289 181 0 181
-   End
后端回答为:

-   BerespStatus   304
-   BerespReason   Not Modified
-   BerespHeader   Date: Fri, 12 Dec 2014 17:00:24 GMT
-   BerespHeader   ETag: "3e8be5-46-4b30571f606c0"
-   BerespHeader   Expires: Fri, 12 Dec 2014 17:00:29 GMT
-   BerespHeader   Cache-Control: max-age=5
所以不会传输任何正文字节,varnish会用新更新的头刷新它的对象

也许这就是你想要的行为

请记住,验证条件的
GET
请求(
如果自
起修改,则返回
;如果不匹配,则返回
),只返回一个
304未修改
、一些头和没有正文(与具有相同条件的
请求完全相同),如果不验证,它将返回标题和新正文。但是未验证的
请求将返回
200ok
,并返回NO正文,迫使您使用GET重新请求它

:

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。元信息 包含在响应HEAD请求的HTTP标头中的 与响应GET请求而发送的信息相同


其想法是,缓存可以在发送给客户端之前,通过HEAD调用检查每个请求的ressource的etag属性中的值。这样,客户就可以确保所请求资源的更新版本。你认为这是个好办法吗?我明白,如果varnish在缓存中有一个对象仍然有效,它至少在默认情况下不会这样做。我将发送自己的缓存版本而不进行检查。在每个请求上都做一个HEAD的问题是,您最终仍然会等待后端服务器,那么,为什么您要在前面放置一个缓存呢?我认为HEAD对于后端来说并不像ressource那么密集,至少比GET调用要少。如果不将整个响应从后端发送到客户端,而只是比较Resources freshness,则此缓存可能会很有帮助。我错了吗?这取决于:)。实际上,这取决于后端的功能。例如,假设资源是一个动态生成的映像,缓存执行的请求是“GET/image If Modified因为:5分钟前”,后端可能是智能的,如果看到没有新数据,它可能会使用一个未修改的304来回复。另一个请求“GET/image If None Match:“random etag”则取决于后端如何生成etag,它是生成图像的哈希吗?然后它必须再次重新生成它(或从缓存文件读取),可能是使用的数据散列。。。你明白了,好的。实际上,etag属性(或任何其他属性)可以“手动”与ressource的版本号关联?在这种情况下,缓存可以检查后端ressource的etag是否与它包含的ressource的etag相同?另一种方法是首先调用缓存,如果ressource未过期,则发送缓存的ressource;如果已过期,则向后端发送head调用并检查etag,如果etag与缓存中的extend Expire相同,则重新加载。我明白了吗?
-   BerespStatus   304
-   BerespReason   Not Modified
-   BerespHeader   Date: Fri, 12 Dec 2014 17:00:24 GMT
-   BerespHeader   ETag: "3e8be5-46-4b30571f606c0"
-   BerespHeader   Expires: Fri, 12 Dec 2014 17:00:29 GMT
-   BerespHeader   Cache-Control: max-age=5