在我将解释我的stream程之前的快速问题:mod_cache只有在max-age已过期的情况下才执行使用if-none-match的重新validation,以防其在逆向代理模式下configuration?
我的目标是减less一些重新validation请求到我们的原始服务器。
例如:第一个请求到达原始服务器,然后mod_cache根据头caching控制:max-age将响应保存到caching中。 只有当max-age过期时,mod_cache将使用if-none-match重新validation。
目前,无论是否定义了max-age,mod_cache都会重新validation每个请求。
我的configurationApache 2.4.3(Windows),在Linux上我看到了相同的行为,我将在下面显示。
ServerName proxy.lo ProxyRequestclosures ProxyPreserveHostclosures 标题集“接受,内容types,内容编码,接受语言” RequestHeader设置X-Forwarded-Proto“http” #修改用户代理的标题 标题集caching控制“私有,无caching,无存储,无变换” CacheQuickHandlerclosures CacheDefaultExpire 300 #原始服务器不提供上次修改 CacheIgnoreNoLastMod打开 CacheIgnoreCacheControl On #原始服务器定义caching控制:私有,不存储用户代理 #因此,我想忽略代理服务器上的这些头。 CacheStorePrivate On CacheStoreNoStore打开 CacheEnable磁盘/ CacheRoot“C:/Apache.Cache” CacheDirLevels 5 CacheDirLength 4 CacheMinExpire 15 CacheDetailHeader CacheHeader 保持closures ProxyPass / http://origin.lo/ ProxyPassReverse / http://origin.lo/
此外,我已经打开debugging日志级别,看看mod_cache如何处理caching的内容:我提供这个来显示mod_proxy总是决定一个内容不新鲜。 为什么?我提供这个来显示mod_proxy总是决定一个内容不新鲜。 为什么? 最大年龄提供(见下文)。
[Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(624):[client 192.168.1.100:63741] AH00698:cache:实体/testing页密钥? )是http://proxy.lo/testpage? [Sun Nov 04 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(569):[client 192.168.1.100:63741] AH00709:调用的caching的URL信息头http:// proxy .LO / testpage? [Sun Nov 04 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(865):[client 192.168.1.100:63741] AH00720:调用URL http:// proxy的标头。 LO / testpage? [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(320):[client 192.168.1.100:63741] AH00695:/ testpage的caching响应不新鲜。 添加/replace条件请求标头。 [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(414):[client 192.168.1.100:63741] AH00757:为/ testpage添加CACHE_SAVEfilter [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(448):[client 192.168.1.100:63741] AH00759:为/ testpage添加CACHE_REMOVE_URLfilter [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] mod_proxy.c(1068):[client 192.168.1.100:63741] AH01143:正在运行的http处理程序(尝试0) [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(1976):AH00942:HTTP:已获取(origin.lo) [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2029):[client 192.168.1.100:63741] AH00944:连接http://origin.lo/testpage来源:80 [Sun Nov 04 11:58:42.901890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2151):[client 192.168.1.100:63741] AH00947:connected / testpage to origin.lo:80 [Sun Nov 04 11:58:42.901890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2554):AH00962:HTTP:连接完成到192.168.1.100:80(origin.lo) [Sun Nov 04 11:58:42.903890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(1991):AH00943:http:已发布连接(origin.lo) [Sun Nov 04 11:58:42.903890 2012] [headers:debug] [pid 6492:tid 1400] mod_headers.c(800):AH01502:headers:ap_headers_output_filter() [Sun Nov 04 11:58:42.903890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(1190):[client 192.168.1.100:63741] AH00769:cache:Caching url:/ testpage [Sun Nov 04 11:58:42.903890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(1196):[client 192.168.1.100:63741] AH00770:cache:删除CACHE_REMOVE_URLfilter。 [Sun Nov 04 11:58:42.904890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(1318):[client 192.168.1.100:63741] AH00737:commit_entity:URL的标题和正文http:/ /proxy.lo/testpage? caching。
没有mod_proxy到http://origin.lo/的原始服务器的第一个请求
GET http://origin.lo/testpage HTTP / 1.1 主持人:origin.lo 连接:保持活力 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4 接受:application / json Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3
来自没有mod_proxy的原点的第一个响应
HTTP / 1.1 200 OK caching控制:必须重新validation,代理重新validation,最大年龄= 30 Content-Type:application / json; 字符集= utf-8的 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” 服务器:Microsoft-IIS / 7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET date:Sun,04 Nov 2012 10:11:01 GMT 内容长度:1877
所以,我认为只有在成功回应后的30秒内重新生效。 不是吗?
我们来看看:)
Google Chrome浏览器在30秒内没有执行任何请求来源服务器重新validation请求,并已从本地caching返回响应。
当max-age过期时,Google Chrome会执行重新validation的请求:
GET http://origin.lo/testpage HTTP / 1.1 主持人:origin.lo 连接:保持活力 Cache-Control:max-age = 0 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4 接受:application / xml If-None-Match:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3
和回应:
HTTP / 1.1 304未修改 caching控制:必须重新validation,代理重新validation,最大年龄= 30 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” 服务器:Microsoft-IIS / 7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET date:2012年11月4日星期日10:16:20 GMT
正如你所看到的,所有的工作如预期的那样。 用户代理仅在max-age过期时重新validation请求。
现在让我们尝试通过mod_proxy执行follingstream程(参见上面的configuration)。
第一个要求:
GET http://proxy.lo/testpage HTTP / 1.1 主持人:proxy.lo 连接:保持活力 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4 接受:application / json Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3
答复是:
HTTP / 1.1 200 OK date:2012年11月4日星期日10:23:36 GMT 服务器:Apache caching控制:私有,无caching,无存储,无变换 Content-Type:application / json; 字符集= utf-8的 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” 内容长度:1932年 Vary:Accept,Content-Type,Content-Encoding,Accept-Language X-Cache:来自proxy.lo的MISS X-Cache-Detail:来自proxy.lo的“cache miss:尝试实体保存” 连线:closures
好吧,让我们看看磁盘caching,并尝试查看请求和响应的存储方式。 (我削减二进制数据)
HTTP://proxy.lo/testpage? caching控制:私有,无caching,无存储,无变换 Content-Type:application / json; 字符集= utf-8的 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” date:2012年11月4日星期日10:27:15 GMT 内容长度:1932年 Vary:Accept,Content-Type,Content-Encoding,Accept-Language 主持人:proxy.lo User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4 接受:application / json Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3 X-Forwarded-Proto:http caching控制:max-age = 300,必须重新validation X-Forwarded-For:192.168.1.100 X-Forwarded-Host:proxy.lo X-Forwarded-Server:origin.lo
好的,我们看到了什么? 我们看到第一个请求是用max-age = 300&must-revalidate来执行的
好吧,看起来不错,对我来说,让我们来进行下一个电话:
GET http://proxy.lo/testpage HTTP / 1.1 主持人:proxy.lo 连接:保持活力 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4 接受:application / json Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3
和来自mod_proxy的第二个响应:
HTTP / 1.1 200 OK date:2012年11月4日星期日10:31:58 GMT 服务器:Apache caching控制:私有,无caching,无存储,无变换 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2” 内容长度:1932年 Vary:Accept,Content-Type,Content-Encoding,Accept-Language X-Cache:从proxy.lo中重新validation X-Cache-Detail:来自proxy.lo的“条件caching命中:实体刷新” 连线:closures Content-Type:application / json; 字符集= utf-8的
所以,我的问题是:为什么mod_proxy对每个请求执行重新validation,而不pipemax-age是否被定义?
NB Apache 2.4.3
谢谢,我会感激任何帮助。