今天我就来演示一下如何在 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 请求。

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

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

截图 1

再试一次。

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

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

截图 3

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

ssh ec2-user@54.213.103.191

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

截图 5

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

ps aux | grep nginx

截图 7

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

截图 7

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

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

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

截图 9

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

截图 11

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

cd /usr/local/openresty/nginx/

打开 nginx 配置文件。

sudo vim conf/nginx.conf

找到我们的根,location /

截图 15

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

expires 1h;

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

截图 16

保存并退出文件。

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

sudo ./sbin/nginx -t

没有问题。

截图 19

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

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

截图 21

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

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

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

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

截图 23

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

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

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

截图 25

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

截图 26

再次发送请求。

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

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

截图 28

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

截图 29

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

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

注意 a=3 的部分。

截图 31

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

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

截图 33

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

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

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

截图 35

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

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

开启默认强制缓存。

截图

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

截图

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

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

关于本文和关联视频

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

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

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

我们的微信公众号

翻译

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