我想使用 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 中注册服务器 IP 地址,请在 Hosts 文件中注册,并使用 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。
通过监控命中率和带宽,您可以大致判断缓存的影响范围,并根据实际情况调整缓存范围。

概括

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

Beyond 提供 CDN 的建设、运营和维护服务,
如有任何关于 CDN 的疑问,欢迎随时联系我们!
https://beyondjapan.com/service/cdn/

如果您觉得这篇文章对您有帮助,请点个“赞”!
5
加载中...
5票,平均分:1.00/15
1,149
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

我是一名基础设施工程师,2022年毕业。
我已从教育团队调到运营团队。

资质认证:
GCP 数字阅读器、
AWS Certified Cloud Practitioner
AZ-900、
Oracle Cloud Infrastructure 2023 Foundations Associate