我想使用 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
缓存周期
缓存期限指定缓存内容的有效时间。
- CACHE_ALL_STATIC /USE_ORIGIN_HEADERS 模式:
- 客户端 TTL:指定浏览器或客户端应保留缓存的时间。
- 默认 TTL:在源服务器的响应
Cache-Control
时将应用的缓存期限 - 最大 TTL:指定缓存内容的最大保留期限。
- 动态缓存模式:
- 在源服务器响应中包含的
Cache-Control
的max-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/