如何验证 Cloud CDN 响应是否为缓存命中(或来自 CDN)

How to verify if a Cloud CDN response was a cache hit (or comes from CDN)

我在启用了 Cloud CDN 的 Google Cloud HTTP(S) 负载平衡器后面有一个后端 GCS 存储桶。

我正在尝试根据 回复 headers:

来回答这些问题

这是回复 headers。根据cache-control,理论上这个应该是缓存的。但是,我没有看到可以验证 CDN 是否正常工作的指示。同样,所有其他 headers 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 提供这些响应 headers:

目前,您无法仅通过查看客户端的 header 来回答上述问题。

header age 指示请求是否由缓存提供服务,Cloud CDN 将附加到响应中。

如果您在 HTTP 负载均衡器级别启用了缓存日志记录,您可以从日志中获取上述所有信息。

更具体地来自文件:

httpRequest.cacheHit 表示请求是否来自缓存。 jsonPayload.cacheId 这是提供缓存响应的位置和缓存实例。

可以在此处找到有关上述内容的更多详细信息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