今天我就来演示一下如何在 OpenResty Edge 中启用 HTTP 响应缓存。

嵌入图片

当客户端请求命中 Edge Node 服务器上的缓存时,不需要向后端服务器发送请求。这样可以减少响应延迟,节省网络带宽。

嵌入图片

让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们控制台的样本部署。每个用户都有自己的本地部署。

我们可以继续之前的应用例子,test-edge.com

截图

我们已经定义了一个上游。

截图

这个 my_backend 上游只有 1 个后台服务器。

截图

注意后台服务器的 IP 地址以 191 结尾。我们之后会用到这个 IP 地址。

截图

而且我们也已经定义了一个页面规则。

截图

这个页面规则设置了一个反向代理指向这个上游。

截图

显然,我们还没有为这个页面规则启用代理缓存。

现在让我们编辑这个页面规则,在网关中添加响应缓存。

截图

让我们启用代理缓存。

截图

这里我们可以配置缓存键。

截图

默认情况下,缓存键由两部分组成:URI,和查询字符串(URI 参数)。

你也可以选择使用其他种类的键的组分。

截图

截图

或者我们可以将整个查询字符串从键中删除。

截图

我们还可以添加更多的键组分。

截图

在这个例子中,我们将只保留默认的缓存键定义。

保存此页面规则。

截图

让我们发布新的配置。

截图

把我们刚才的变更推送出去。

截图

发布!

截图

我们的新版配置现在已经同步到我们所有的网关服务器了。

截图

我们的配置更改不需要重新加载服务器、重新启动或二进制升级服务器进程。所以它的效率非常高。

嵌入图片

我们来测试一下网关服务器的缓存。

截图

我们复制一下这个旧金山网关服务器的 IP 地址。

截图

注意这个 IP 地址的最后的数字是 133 。

在终端上,我们通过 curl 命令行工具向这个网关服务器发送 HTTP 请求。

1
curl -I -H 'Host: test-edge.com' http://138.68.231.133/

注意返回的 Cache-Status: MISS 响应头。

截图 1

再试一次。

1
curl -I -H 'Host: test-edge.com' http://138.68.231.133/

我们仍然收到 Cache-Status: MISS 头。这意味着缓存根本没有被使用。这是为什么呢? 原来后端服务器的原始响应头里缺少 ExpiresCache-Control 这样的头。

截图 3

我们可以登录到后台服务器。

1
ssh ec2-user@54.213.103.191

记得后台服务器的 IP 地址是以 191 结尾的。

截图 5

这个后台服务器运行的是开源的 OpenResty 软件。

1
ps aux | grep nginx

截图 7

后台服务器可以运行任何其他的使用 HTTP 协议的软件。

截图 7

我们可以直接向这个后台服务器发送测试请求。

1
curl -I -H 'Host: test-edge.com' http://127.0.0.1/

请注意,我们正在访问本地主机。

截图 9

好吧,它确实没有提供任何 ExpiresCache-Control 的响应头。

截图 11

现在让我们重新配置我们的后台服务器。

1
cd /usr/local/openresty/nginx/

打开 nginx 配置文件。

1
sudo vim conf/nginx.conf

找到我们的根,location /

截图 15

并增加 1 小时的过期时间。

1
expires 1h;

需要注意的是,后台服务器可以针对不同的 location 定义不同的过期时间。或者对某些响应完全禁用缓存。

截图 16

保存并退出文件。

测试 nginx 配置文件是否正确。

1
sudo ./sbin/nginx -t

没有问题。

截图 19

现在重新加载后端服务器进程。

1
sudo kill -HUP `cat logs/nginx.pid`

截图 21

注意,对于开源的 Nginx 服务器,配置方法也是一样的。

现在可以测试后台服务器了。

1
curl -I -H 'Host: test-edge.com' http://127.0.0.1/

好了,现在它响应头里有 ExpiresCache-Control 这两个了。

截图 23

现在将请求发送给网关服务器。

1
curl -I -H 'Host: test-edge.com' http://138.68.231.133/

它仍然显示的是 Cache-Status: MISS 头。

截图 25

这是一次预期中的缓存不命中。因为这是我们发的第一个请求。

截图 26

再次发送请求。

1
curl -I -H 'Host: test-edge.com' http://138.68.231.133/

太好了!我们终于看到了 Cache-Status: HIT 头!

截图 28

终于如愿以偿地命中了缓存。

截图 29

如果我们添加一个查询字符串。

1
curl -I -H 'Host: test-edge.com' 'http://138.68.231.133/?a=3'

注意 a=3 的部分。

截图 31

那么又会再次出现缓存不命中。

这是因为默认的缓存键包括查询字符串。

截图 33

再次运行相同的请求应该就能命中缓存了。

1
curl -I -H 'Host: test-edge.com' 'http://138.68.231.133/?a=3'

确实是被缓存命中了。如果你不关心这个查询字符串,你可以把它从缓存键中删除。

截图 35

有时候我们就是懒得去改变后台服务器的配置。 那么我们也可以在源站响应没有出现任何缓存控制头的情况下,默认就对响应进行强制缓存。

我们可以修改我们原来的页面规则来实现这个功能。

开启默认强制缓存。

截图

还可以设置可缓存响应状态码的默认过期时间。

截图

我们将在另一个视频中演示这个功能。

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Demo 系统从一个极简单的剧本文件自动生成的。

关于作者

章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,相当多 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty EdgeOpenResty XRay 等产品。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!