OpenResty Edge 中,你可以把静态文件直接存放在网关的全局静态文件存储中,再用页面规则从边缘直接返回,无需回源到源站——这样性能更高、也更可靠。你可以按精确 URI 匹配单个文件,按 URI 前缀分发整个目录,还可以用忽略 URI 前缀在匹配前剥掉请求中的前缀。本教程将带你完成文件上传,并逐一配置各种匹配方式。

从 OpenResty Edge 直接分发静态文件,无需回源

将静态文件上传到 OpenResty Edge

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

OpenResty Edge Admin Web 控制台样本部署

首先将静态文件上传到 OpenResty Edge

开始将静态文件上传到 OpenResty Edge

转到全局静态文件页面。

OpenResty Edge 全局静态文件页面

创建一个目录。

在全局静态文件页面创建目录

将其命名为 “test”。

将新建的静态文件目录命名为 test

点击创建。

确认创建 test 目录

可以看到刚刚创建的目录出现在列表里面。

列表中刚刚创建的 test 目录

点击进入该目录。

进入 test 目录

现在来上传文件。

向 test 目录上传文件

选择文件 “bird.jpg”。

选择要上传的文件 bird.jpg

已选中待上传的 bird.jpg

保存该文件。

保存上传的 bird.jpg 文件

创建一个子目录。

创建一个子目录

将它命名为 “images”。

将子目录命名为 images

点击创建。

确认创建 images 子目录

进入子目录。

进入 images 子目录

上传另一个文件。

向 images 子目录上传另一个文件

选择文件 “cat.jpg”。

选择要上传的文件 cat.jpg

已选中待上传的 cat.jpg

保存该文件。

保存上传的 cat.jpg 文件

用页面规则分发静态文件

文件已经上传,接下来让我们来使用它们。

准备使用已上传的静态文件

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

示例应用 test-edge.com

进入该应用。

进入 test-edge.com 应用

转到页面规则页。

打开页面规则页

这里有一个在之前的视频教程中创建的页面规则。

之前教程中创建的页面规则

现在创建一个新的页面规则,该页面规则将直接返回一个文件。

创建一个直接返回文件的新页面规则

我们启用一个规则条件来检查 URI 是否为 “/images/bird.jpg”。

添加规则条件检查 URI /images/bird.jpg

操作符选择 “String=”。

选择字符串等值操作符

为 URI 条件选择字符串等值操作符

输入值 “/images/bird.jpg” 来匹配这个静态文件。

输入 /images/bird.jpg 匹配该静态文件

打开 “Content” 开关。

在页面规则中打开 Content 开关

选择一个我们刚刚上传的文件。

选择一个刚刚上传的文件用于返回

浏览已上传的静态文件

展开该目录。

展开 test 目录

选择图片 “bird.jpg”。

选择要返回的图片 bird.jpg

选择在现有的代理页面规则之前插入这个页面规则。

将该页面规则插入到代理页面规则之前

点击创建该规则。

创建该页面规则

像往常一样,我们需要发布来推送这个新改动。

发起新的发布以推送改动

点击这个按钮。

点击发布按钮

发布!

推送新的发布

新版本现在已经同步到所有的网关服务器上了。

新版本已同步到所有网关服务器

测试静态文件页面规则

然后我们发送一个 URI 为 “images/bird.jpg” 的 HTTP 请求。

发送 images/bird.jpg 的 HTTP 请求

可以看到返回了一个鸟的图片,与预期结果相符。

用前缀分发整个目录

在演示了返回文件之后,接下来,我们对目录进行说明。

转到页面规则页。

返回页面规则页

编辑页面规则。

编辑页面规则

操作符这里选择 “前缀匹配”。

选择“前缀匹配”操作符

选中“前缀匹配”操作符

输入值 “/images”,表示只会匹配这个路径的静态资源。

输入 /images 只匹配该路径的静态资源

/images 前缀条件

选择我们刚刚创建的目录。

选择要分发的已上传目录

“忽略 URI 前缀” 允许请求的 URL 与实际资源的 URI 不同,这个功能我们会在后面演示。

“忽略 URI 前缀”选项

保存该规则。

保存页面规则

像往常一样,我们需要发布来推送这个新改动。

发起新的发布以推送改动

点击这个按钮。

点击发布按钮

发布!

推送新的发布

新版本现在已经同步到所有的网关服务器上了。

新版本已同步到所有网关服务器

发送一个 URI 为 ”images/cat.jpg“ 的请求。

发送 images/cat.jpg 的请求

该请求返回一张存在于子目录 ”images“ 中的猫的图片。

如果我们请求 ”images/bird.jpg“,会发生什么呢?

发送 images/bird.jpg 的请求

可以看到该请求返回错误页。这是因为在 ”images“ 子目录中没有 ”bird.jpg“ 这个文件。

忽略 URI 前缀

接下来,我们演示如何忽略 URI 的前缀。

转到页面规则页面。

返回页面规则页

编辑刚才的页面规则。

再次编辑该页面规则

仍然使用 ”test“ 目录。

继续选用 test 目录

这里选择忽略 ”String“。

选择忽略一个 String 前缀

输入 ”/images/“。

输入要忽略的前缀 /images/

保存该规则。

保存页面规则

像往常一样,我们需要发布来推送这个新改动。

发起新的发布以推送改动

点击这个按钮。

点击发布按钮

发布!

推送新的发布

新版本现在已经同步到所有的网关服务器上了。

新版本已同步到所有网关服务器

发送一个带有 “/images” 前缀的请求。

发送带有 /images 前缀的请求

该请求返回了一张鸟的图片。

然后我们请求子目录 “images” 中的图片。

请求 images 子目录中的图片

请求返回了一张猫的图片。

然后我们发送一个带有 “/no” 前缀的不存在的资源的请求。

发送带有不存在的 /no 前缀的请求

可以看到返回了错误页。

不存在资源返回的错误页

这样就把静态文件直接存放并分发在网关上了。如果你想缓存的是从源站取回的动态响应,请参见 OpenResty Edge 的缓存规则;如果想把资源作为你自己的私有 CDN 全球分发,请参见 用 OpenResty Edge 构建私有 CDN

常见问题

OpenResty Edge 分发静态文件需要回源吗?

不需要。文件上传到全局静态文件存储后,页面规则会从网关直接返回它,所以请求无需回源。这样性能更高、也更可靠。

如何分发单个文件与整个目录?

用页面规则加字符串等值操作符匹配单个精确 URI(例如 “/images/bird.jpg”),或者用 “前缀匹配” 操作符按 URI 前缀(例如 “/images”)分发整个已上传的目录。

“忽略 URI 前缀” 有什么用?

它允许请求的 URL 与实际资源的 URI 不同:在查找文件前,先从请求中剥掉一个前缀(例如 “/images/”)。

如何把新的静态文件或页面规则发布上线?

发起一次新的发布,该版本就会同步到你所有的网关服务器上。

关于 OpenResty Edge

OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。

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

关于作者

章亦春是开源 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

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