我想使用 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根据
缓存持续时间
缓存有效期指定缓存内容保持有效的时长。
- 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
