如何验证 Cloud CDN 响应是不是是缓存命中(或来自 CDN)
Posted
技术标签:
【中文标题】如何验证 Cloud CDN 响应是不是是缓存命中(或来自 CDN)【英文标题】:How to verify if a Cloud CDN response was a cache hit (or comes from CDN)如何验证 Cloud CDN 响应是否是缓存命中(或来自 CDN) 【发布时间】:2020-11-26 04:45:49 【问题描述】:我在启用了 Cloud CDN 的 Google Cloud HTTP(S) 负载平衡器后面有一个后端 GCS 存储桶。
我正在尝试根据响应标题回答这些问题:
此响应是从 CDN 提供的吗 如果有,是哪个位置/地区 这是缓存命中/未命中这是响应标头。基于cache-control
,理论上应该缓存这个。但是,我没有看到可以验证 CDN 正常工作的迹象。同样,所有其他标头 x-goog-*
和 Server: UploadServer
似乎来自 GCS 服务器,而不是 CDN。
accept-ranges: bytes
age: 551
alt-svc: clear
cache-control: public, max-age=3600
content-length: 298303
content-type: image/jpeg
date: Wed, 05 Aug 2020 23:07:33 GMT
etag: "f0b6c60f635c784dd7f34ab9c1527867"
expires: Thu, 06 Aug 2020 00:07:33 GMT
last-modified: Wed, 05 Aug 2020 23:07:16 GMT
server: UploadServer
status: 200
X-DNS-Prefetch-Control: off
x-goog-generation: 1596668836233926
x-goog-hash: crc32c=rD4sZw==
x-goog-hash: md5=8LbGD2NceE3X80q5wVJ4Zw==
x-goog-metageneration: 1
x-goog-storage-class: STANDARD
x-goog-stored-content-encoding: identity
x-goog-stored-content-length: 298303
x-guploader-uploadid: AAANsUktJ98kPCHjiR2oBi6N-[...]
例如,Cloudflare 提供以下响应标头:
请求在哪里服务:cf-ray: 5be4505beb76bca2-SEA
缓存状态如何:cf-cache-status: REVALIDATED
我的请求是直接打到 CDN 还是我的后端server: cloudflare
【问题讨论】:
【参考方案1】:现在您可以在响应中设置一个新的cdn_cache_status
变量:https://cloud.google.com/load-balancing/docs/custom-headers#variables
使用 gcloud SDK v309.0.0 或更高版本:
➜ gcloud beta compute backend-services update my-backend --global \
--enable-cdn \
--custom-response-header='Cache-Status: cdn_cache_status' \
--custom-response-header='Cache-ID: cdn_cache_id'
示例输出:
< HTTP/2 200
< content-type: text/plain; charset=utf-8
< date: Mon, 14 Sep 2020 21:40:05 GMT
< server: Google Frontend
< content-length: 1098
< via: 1.1 google
< cache-control: public, max-age=10
< age: 2
< x-frame-options: DENY
< cache-status: hit
【讨论】:
【参考方案2】:目前,您无法仅通过查看客户端的标题来回答上述问题。
请求是否由缓存服务的一个指示是标头 age
,Cloud CDN 将在响应中附加该标头。
如果您在 HTTP 负载均衡器级别启用了缓存日志记录,则可以从日志中获取上述所有信息。
更具体地来自文件:
httpRequest.cacheHit
表示请求是否来自缓存。
jsonPayload.cacheId
是提供缓存响应的位置和缓存实例。
关于上述内容的更多详细信息可以在这里找到1。
【讨论】:
那么,如果age
标头不存在,是否可以说是错过了?我一直在测试,我注意到一旦我请求了一个资源,age
标头仍然存在,尽管它一直在增长。然后,如果我稍作停留并重新加载,age
标头有时不存在。我假设这意味着 GCP CDN 从源刷新了资源?
没错。通常,不经常访问的内容往往会从缓存中被逐出,而不管内容的到期时间如何。所以这将是一个缓存未命中,它需要从源中获取。 cloud.google.com/cdn/docs/overview#eviction
事实证明现在有一个自定义标头可配置在响应中以指示缓存状态。查看批准的答案。以上是关于如何验证 Cloud CDN 响应是不是是缓存命中(或来自 CDN)的主要内容,如果未能解决你的问题,请参考以下文章