我想使用 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 中未注册该标头,请在 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