我想使用 Cloud CDN (Google Cloud) 上的 Cache-Control 来控制缓存

介绍

我叫Sumi,在系统解决方案部门工作,主要负责一些基础设施方面的工作。

今天,我们将向您展示如何使用应用负载均衡器配置云 CDN,使其仅缓存服务器上的指定文件。
云 CDN 本身会在边缘服务器上缓存内容,这有助于降低服务器负载并优化响应时间。

本文介绍了一种使用 HTTP 标头配置缓存控制以阻止特定静态内容被缓存的示例。
同时参考Google Cloud 推荐设置“缓存静态内容”或官方文档“使缓存内容失效

*我们强烈建议您在进行任何调整之前先进行核实。

云 CDN 缓存控制参数

缓存模式

云 CDN 提供三种缓存模式,用于控制内容的缓存方式。更多详细信息,请参阅官方文档。

  • CACHE_ALL_STATIC:缓存所有静态内容(HTML、CSS、JavaScript、图像等)。
  • USE_ORIGIN_HEADERS:Content-Type中指定的扩展名的静态内容
  • FORCE_CACHE_ALL:根据Cache-Control

云 CDN 官方文档

缓存持续时间

缓存有效期指定缓存内容保持有效的时长。

  • CACHE_ALL_STATIC /USE_ORIGIN_HEADERS 模式:
    • 客户端 TTL:指定浏览器或客户端应保留缓存的时间长度。
    • 默认 TTL:当源服务器Cache-Control时适用的缓存持续时间
    • 最大 TTL:指定缓存内容可以保留的最长时间。
  • 动态缓存模式:
    • 由源服务器响应中包含的Cache-Control标头max-age指定
例如:Cache-Control: max-age=3600(1 小时)

缓存键

云 CDN 使用整个 URL 作为缓存键,
通过协议(HTTP/HTTPS)、主机名、查询字符串、HTTP 标头和 cookie 来识别请求。


协议

识别请求是 HTTP 还是 HTTPS。
默认值:启用

环境 行为 用例
使能够 对 HTTP 和 HTTPS 请求进行单独缓存 通过 HTTP 和 HTTPS 提供不同内容时
禁用 不区分 HTTP 请求和 HTTPS 请求 通过 HTTP 和 HTTPS 提供相同的内容

使用云 CDN 时,通常会使用同一个主机名来分发 HTTP 和 HTTPS 内容,但
在某些情况下,由于某些浏览器需要 TLS 加密,因此允许使用不同的分发方式。更多信息,请参阅
“HTTP/HTTPS 使用同一主机名”


主持人

用于通过多个主机名分发不同内容。
默认值:启用


查询字符串

标识 URL 中“?”之后的参数。
默认值:启用、包含除选定项外的所有项、无值

环境 行为 用例
仅包含选定项目 在缓存键中包含指定的参数 当内容根据特定参数(例如搜索结果或产品详情页)发生变化时
包含除选定部分以外的所有内容 从缓存键中排除某些参数,并包含其他参数。 当存在多个参数,而您只想使用其中的一些参数作为缓存键时
无效的 不要使用参数来识别 无论查询内容如何,​​都提供相同的内容。

自定义查询字符串设置(如果启用)允许您以白名单或排除列表的形式指定参数。


HTTP 标头

指定要包含在请求中的附加信息。
默认值:禁用

环境 用例
包括 使用 User-Agent 等 HTTP 标头优化内容
排除 无论请求头如何,都提供相同的内容。

命名 Cookie

使用 Cookie 来识别特定用户。
默认设置:禁用

环境 用例
有效的 当内容根据登录状态或用户而改变时
无效的 无论是否使用 Cookie,都要提供相同的内容。

每个参数的使用案例

用例 协议 主持人 查询字符串 HTTP 标头 命名 Cookie
通过 HTTP/HTTPS 传输相同内容时 排除 包括 排除 排除 排除
使用多个主机名提供相同的内容 包括 排除 排除 排除 排除
当内容不随查询字符串而改变时 包括 包括 排除 排除 排除
针对不同用户代理优化内容 包括 包括 包括 用户代理 排除
内容会根据登录状态而变化 包括 包括 包括 排除 session_id

如何使用动态缓存模式

要使用动态缓存模式,您可以在服务器端设置 Cache-Control 标头。Cache
-Control 标头是一个 HTTP 响应标头,用于指示浏览器和缓存服务器如何缓存内容。
可以在此标头中指定以下指令:

max-age:缓存过期时间(秒)。s
-maxage:共享缓存(例如 CDN)的过期时间(秒)。public
:允许对象存储在公共缓存中。private
:仅允许对象存储在私有缓存中。no
-cache:禁止将对象存储在缓存中。no
-store:禁止将对象存储在缓存或浏览器中。

如何设置

环境(Rocky Linux 9 + Nginx)
:本次我们将使用 Rocky Linux 9 + Nginx 作为简单的测试环境。*服务器搭建部分已省略。由于本次测试仅针对缓存命中情况,因此不会使用 WordPress 等内容管理系统。

服务器端准备工作

对每个目录执行缓存控制。

创建一个目录来存放你的测试文件

mkdir -p /(文档根路径)/cache mkdir -p /(文档根路径)/nocache

在每个目录中放置一个测试文件。

touch /(文档根路径)/cache/test.html touch /(文档根路径)/nocache.html touch /(文档根路径)/nocache/nocache.html

将以下设置添加到 Nginx 配置中。

server { listen 80; # 监听 HTTP 端口 (80) server_name example.com www.example.com; # 要使用的域名 () root /var/www/example.com/public_html/; # 文档根目录(网站文件所在位置) index index.html index.htm; # 默认显示的文件 location / { try_files $uri $uri/ =404; # 如果文件不存在,则返回 404 错误 } location / { add_header Cache-Control "private"; # 其他请求为私有请求 } location /cache/ { add_header Cache-Control "public, max-age=3600"; # 缓存 1 小时 #add_header X-Cache-Status $upstream_cache_status; 删除 # 后,将显示一个标头以指示缓存是否被命中。 # CDN 端也可以返回相同的标头,因此这次我们将在 CDN 端设置它。 } location /nocache/ { add_header Cache-Control "no-cache"; # 禁用缓存 #add_header X-Cache-Status $upstream_cache_status; 移除 # 后,该标头将指示缓存是否被命中。 # CDN 端也会返回相同的标头,因此这次我们将在 CDN 端设置它。 } }

配置完成后,运行语法检查并重启 Nginx。

nginx -t

如果您看到类似以下内容,则说明没有语法错误。

nginx:配置文件 /etc/nginx/nginx.conf 语法正确。nginx:配置文件 /etc/nginx/nginx.conf 测试成功。

如果没有问题,请重启 Nginx。

 systemctl restart nginx 

标头检查

设置更新后,检查测试站点并确认每个目录都已添加 Cache-Control 标头。
如果 DNS 中未注册该标头,请在 Hosts 文件中注册服务器 IP 地址,并使用 Chrome 浏览器等调试工具(F12)检查标头。
每个路径的 Cache-Control 标头应如下所示:

/cache/test.html

⇒Cache-Control public, max-age=3600 缓存并保留 1 小时

/nocache/nocache.html

⇒Cache-Control no-cache 不缓存,始终从源服务器检索。

/nocache.html

⇒Cache-Control private 被视为私有,仅允许浏览器缓存。

云 CDN 设置

缓存模式

⇒根据 Cache-Control 标头使用发件人的设置

缓存键

⇒如果
您想更改默认路径或进行更详细的设置,可以通过将缓存键更改为自定义来编辑它。

自定义响应标头

⇒ 标头名称:cdn_cache_status
⇒ 标头值 1:{cdn_cache_status}
缓存命中和未命中将添加到标头中,允许您使用调试工具等检查缓存状态。

就这些了,
点击“完成”按钮,文件将立即保存。

检查缓存状态

请在浏览器中打开隐身窗口,并再次检查每个路径。
*由于浏览器缓存等原因,响应头可能不可见。在某些情况下,请尝试使用其他浏览器访问。

/cache/test.html

⇒Cache-Control public, max-age=3600 #缓存并保留1小时 ⇒cdn_cache_status : hit #如果是首次访问,则没有缓存,因此会显示未命中。如果在单独的窗口中再次打开同一网站,则会显示命中。

/nocache/nocache.html

⇒Cache-Control no-cache #不缓存,始终从源服务器检索。 ⇒cdn_cache_status : miss #未缓存,因此会失败。

/nocache.html

⇒Cache-Control private #视为私有,仅允许浏览器缓存。 ⇒cdn_cache_status : miss #由于 CDN 端未缓存,因此状态为 miss。

多次检查缓存命中率后,您可以在 GCP 控制台中通过以下步骤查看命中率:依次点击 CLB > CDN > 点击源服务器名称 > 监控 > Cloud CDN。
通过结合命中率和带宽,更详细地配置缓存,您可以大致判断缓存的影响范围,并根据实际情况调整缓存范围。

概括

使用 Cache-Control 标头和云 CDN,您可以对静态内容进行精细控制
,从而加快内容分发速度并降低源服务器的负载。
我们希望这篇博文能帮助您充分利用云 CDN 的缓存功能。

Beyond 提供从 CDN 构建到运营和维护的全方位服务,
如有任何 CDN 相关问题,欢迎随时联系我们!
https://beyondjapan.com/service/cdn/

如果您觉得这篇文章有帮助,请点赞!
5
加载中...
5 票,平均:1.00 / 15
971
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

须弥

基础设施工程师,2022 年毕业。
目前,我已经从教育组调到运营组了。

资格
GCP 数字读者
AWS 认证云从业者
AZ-900
Oracle 云基础设施 2023 基础助理