[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

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

介绍

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

今天我们将介绍如何使用应用程序负载均衡器配置Cloud CDN以仅缓存服务器上的指定文件。
Cloud CDN 本身可通过在边缘服务器上缓存内容来减少服务器负载、调整响应时间等。

在本文中,我们将介绍一个使用 HTTP 标头控制缓存的配置示例,以便不缓存某些静态内容。
如果您的网站不介意被缓存,另请参阅禁用缓存内容

*我们强烈建议您在进行任何调整之前进行验证。

Cloud CDN缓存控制参数说明

缓存模式

Cloud 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-Controlmax-age中指定缓存期限
示例:缓存控制:max-age=3600(1 小时)

缓存键

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


协议

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

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

使用 Cloud CDN 时,通常会在同一主机名下传送 HTTP 和 HTTPS 内容,但
在某些用例中,某些浏览器需要 TLS,因此允许不同的传送。详情请参阅此处。
对 HTTP/HTTPS 使用相同的主机名


主持人

使用多个主机名分发不同内容时使用。
默认值:启用


查询字符串

标识 URL 中“?”后面的参数。
默认值:启用/包括除所选项目之外的所有项目/无值

环境 行为 用例
仅包含选定的项目 在缓存键中包含指定参数 当内容根据特定参数(例如搜索结果或产品详细信息页面)发生变化时
包括除所选项目之外的所有内容 排除某些参数并在缓存键中包含其他参数 如果有多个参数但您只想使用其中一些作为缓存键
无效的 不使用参数进行识别 在不依赖于查询的情况下提供相同的内容时

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


HTTP 标头

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

环境 用例
包括 使用 HTTP 标头(例如 User-Agent)优化内容时
排除 如果您想提供相同的内容而不管标题如何

命名cookie

我们使用 cookie 来识别特定用户。
默认值:禁用

环境 用例
有效的 当内容根据登录状态或用户而变化时
无效的 无论 cookie 如何提供相同内容时

每个参数的用例

用例 协议 主持人 查询字符串 HTTP 标头 命名cookie
使用 HTTP/HTTPS 传送相同内容时 排除 包括 排除 排除 排除
使用多个主机名分发相同内容时 包括 排除 排除 排除 排除
如果内容不根据查询字符串而改变 包括 包括 排除 排除 排除
通过用户代理优化内容时 包括 包括 包括 用户代理 排除
如果内容根据您的登录状态而变化 包括 包括 包括 排除 会话 ID

如何使用DYNAMIC_CACHE模式

要使用DYNAMIC_CACHE模式,有一种方法可以在服务器端设置Cache-Control。
Cache-Control 标头是一个 HTTP 响应标头,用于指示浏览器和缓存服务器如何缓存内容。
该标头可以包含以下指令:

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

实际设置方法

环境(Rocky Linux9 + Nginx)
这次我们将使用Rocky Linux9 + Nginx作为简单的测试环境。 *省略服务器构建部分。由于这只是针对缓存命中条件的测试,因此未使用 Wordpress 等 CMS。

服务器端的准备工作

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

创建一个目录来放置测试文件

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

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

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

将以下设置添加到 Nginx conf.

server { Listen 80; # 监听 HTTP 端口 (80) server_name example.com www.example.com; # 操作的域名 () root /var/www/example.com/public_html/; html index.htm; # 默认显示的文件 location / { try_files $uri $uri/ =404; # 如果文件不存在则返回 404 错误 } location / { add_header Cache-Control "private"; private } location /cache/ { add_header Cache-Control "public, max-age=3600"; # 1 小时缓存 #add_header X-Cache-Status $upstream_cache_status; 通过删除它,标头将显示缓存是否命中。 #由于在CDN端有可能返回相同的header,所以这次我们将在CDN端设置它。 } location /nocache/ { add_header Cache-Control "no-cache"; # 缓存已禁用 #add_header X-Cache-Status $upstream_cache_status; 通过删除 #,将在标头中显示缓存是否命中。 #由于在CDN端有可能返回相同的header,所以这次我们将在CDN端设置它。 } }

设置完成后,检查语法并重启Nginx。

nginx-t

如果您看到类似以下内容,则不存在语法错误。

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

如果没有问题,重启Nginx

 systemctl 重新启动 nginx 

检查标题

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

/缓存/测试.html

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

/nocache/nocache.html

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

/nocache.html

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

Cloud CDN 侧设置

缓存模式

⇒使用基于 Cache-Control 标头的源设置

缓存键


如果您想配置默认路径或更详细的设置,您可以通过自定义来编辑缓存键。

自定义响应标头

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

设置现已完成。
单击“完成”立即保存。

检查缓存状态

打开浏览器的隐身窗口并再次检查每个路径。
*由于浏览器缓存等原因,响应标头可能不可见。如有需要,请尝试更换浏览器访问。

/缓存/测试.html

⇒Cache-Control public, max-age=3600 #缓存并保留1小时 ⇒cdn_cache_status: hit #如果是第一次访问,就没有缓存,所以会miss。如果您在单独的窗口中再次打开同一网站,将会很受欢迎。

/nocache/nocache.html

⇒Cache-Control no-cache #不缓存,总是从源服务器检索。 ⇒cdn_cache_status: miss #缓存没有执行,所以是miss。

/nocache.html

⇒Cache-Control private 视为#private,仅允许浏览器缓存。 ⇒cdn_cache_status: miss #CDN端没有进行缓存,所以是miss。

多次检查缓存命中后,您可以在控制台上查看命中率:CLB > CDN > 点击GCP中的源名称 > 在监控中查看Cloud CDN。
通过查看命中率和带宽以及更详细地配置缓存,可以大致确定缓存影响的范围,因此根据情况调整缓存范围。

概括

缓存控制标头和 Cloud CDN 可让您对静态内容进行细粒度控制。
它还可以加快内容交付并减少源服务器上的负载。
我们希望这篇博文可以帮助您利用 Cloud CDN 的缓存。

Beyond还提供CDN建设和运维服务,
如有任何CDN相关疑问,请随时与我们联系!
https://beyondjapan.com/service/cdn/

如果您觉得这篇文章有帮助,请点赞!
5
加载中...
5 票,平均:1.00 / 15
179
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

须弥

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

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