我在使用 Cloud CDN 时遇到了一些问题。我已将 CDN 添加到实例上连接的存储桶中。
我需要从 CDN 获取一个元素,但这个元素每 1 秒从我的服务器更新一次。发生的情况是,当我从浏览器第一次获取文件时,我可以获取正确的文件,然后文件再也不会更新(文件是 m3u8,我得到的总是相同的文件)
m3u8 文件在存储桶上更新,但在云 CDN 上未更新。如何防止在我的云 CDN 中缓存某些类型的文件(或所有文件)?
更新:
老实说,通过直接从存储桶检查我的响应标头,我得到了“cache-control:public,max-age = 3600”我开始认为问题出在存储桶上,我怎样才能将整个存储桶的 max-age 设置为 0/1?
附言:我的文件都是公开的,我正在阅读这个(https://cloud.google.com/storage/docs/gsutil/commands/setmeta):
注意:默认情况下,公开可读对象会带有 Cache-Control 标头,允许此类对象缓存 3600 秒。有关此默认行为的更多详细信息,请参阅 gsutil 帮助元数据的 CACHE-CONTROL 部分。如果您需要确保更新立即可见,则应在这些对象上设置“Cache-Control:private, max-age=0, no-transform”的 Cache-Control 标头。
我只是想避免每秒从 cron 运行这样的命令
gsutil setmeta -h "Content-Type:text/html" \
-h "Cache-Control:public, max-age=0, no-transform" gs://bucket/*.html
没有通用设置来直接管理整个存储桶?(不是针对每个加载的内容)
更新:这是一个用于直播(rtmp)的nginx服务器。
我得到了一个 m3u8,其中包含每个质量的其他 m3u8 的索引。
如果我在我的 GCE 实例上安装一个存储桶(使用 gcsfuse),那么我从浏览器的存储桶中获取的第一个 m3u8 将会在存储桶内缓存 1 小时(max-age=3600)...因为缓存。
GCE 中的文件不会使用 gsutil 进行更新:而是直接使用 gcsfuse 写入已安装的存储桶中。
为了使这些文件公开,我已将存储桶设置为公共->这对于谷歌存储桶策略来说,使它们可缓存。
理论上我需要每 1 秒更新一次所有 m3u8 文件。
回答:
请提供更多关于您将什么类型的数据以及以何种方式写入存储桶的详细信息 -> m3u8
您希望通过使用存储桶 -> 可扩展基础设施的共享资源实现什么目标
为什么需要每 5 秒更新一次元素 -> 需要每 1 秒更新一次 m3u8 (以更新索引)
那就是问题所在。
答案1
请查看文档云存储FUSE部分与 POSIX 文件系统的主要区别:
元数据:上传到云存储时,Cloud Storage FUSE 不会将元数据与文件一起传输。这意味着,如果您希望使用 Cloud Storage FUSE 作为上传工具,您将无法像使用其他上传方法一样设置元数据(例如内容类型和 ACL)。如果元数据属性至关重要,请考虑使用 gsutil、JSON API 或 Google Cloud Console。
与此同时,正如你在文档,要更改默认策略,您应该使用元数据:
看gsutil 帮助元数据详细了解如何在上传对象时设置元数据,可以设置哪些元数据字段以及这些字段的含义、自定义元数据的使用以及如何查看当前设置的元数据。
由于使用 Cloud Storage FUSE上传对象时无法设置元数据因此,您的 m3u8 文件会受到默认缓存策略的影响:
默认情况下,可公开读取的对象会带有 Cache-Control 标头,允许此类对象缓存 3600 秒。
作为临时解决方法,您可以尝试使用setmeta
命令来设置已上传对象的元数据:
gsutil setmeta -h "Content-Type:text/html" -h "Cache-Control:public, max-age=0, no-transform" gs://bucket/*.html
但它会导致很多操作,结果,增加使用成本。
解决此问题,你应该改变你的服务架构。例如,尝试使用云文件存储存储您的 m3u8 文件。
答案2
将 GCS 对象元数据中的 Cache-Control 标头设置为(例如)public, max-age=5
这将告诉 Cloud CDN 将其缓存 5 秒,然后在该时间之后从原点(您的存储桶)重新获取。
当您推送新对象时,您可以在上传/通过 API 执行此操作:https://cloud.google.com/storage/docs/gsutil/addlhelp/WorkingWithObjectMetadata