今天,我将演示如何在 OpenResty Edge 中为带有 SNI 扩展的 TLS 连接设置一个反向代理。Edge 服务器将监听 4003 端口,根据请求的 SNI 名,将请求代理到 google.com 或 ebay.com。

Embeded image

创建一个 SNI Proxy 类型的应用

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

Screenshot

我们将创建一个 Stream 类型的应用。

选择 Stream 应用列表页。

Screenshot

创建一个新的应用。

Screenshot

可以看到有两种类型的 Stream 应用: SNI Proxy 和 TCP。

Screenshot

默认选择的是 SNI Proxy 类型,也就是今天的主题。

Screenshot

TCP 应用在另一个教程中有介绍。

Screenshot

输入 “www.google.com” 作为域名。

Screenshot

在这个视频中,我们要处理具有不同 SNI 名的请求。因此需要多个域名。

点击这个按钮,添加第二个域名:www.ebay.com。

Screenshot

Screenshot

创建这个应用。

Screenshot

为这个应用创建上游和页面规则

转到上游页面。

Screenshot

创建一个新的上游。

Screenshot

给这个上游取一个名字,比如,“google”。

Screenshot

这里我们输入 google 的主机名。

Screenshot

输入端口号 443。

Screenshot

点击保存这个上游。

Screenshot

现在来创建第二个上游。

Screenshot

将这个上游命名为 “eBay”。

Screenshot

这里输入 eBay 的主机名。

Screenshot

输入端口号 443。

Screenshot

点击保存此上游。

Screenshot

可以看到这两个上游,“google” 和 “eBay” 已经出现在上游列表页。

Screenshot

现在创建页面规则来使用这些上游。

Screenshot

创建第一个页面规则。

Screenshot

对于这个页面规则,我们需要指定一个条件。

Screenshot

可以在这里选择条件的变量名。

Screenshot

我们将根据请求的 SNI 名选择代理的上游,所以变量名应该是 SNI 服务器名。

搜索 SNI。

Screenshot

选择 SNI 服务器名。

Screenshot

操作符这里保持默认选择 String= 不要变。

Screenshot

值的类型应该是 String。

Screenshot

输入 “www.google.com” 作为值。

Screenshot

添加一个代理目标。

Screenshot

选择我们刚刚创建的第一个上游。

Screenshot

Screenshot

这里有几个均衡策略可供选择。

Screenshot

由于我们的上游只有一个服务器。所以选择什么均衡策略并不重要。

Screenshot

保持默认的轮询策略就好。

Screenshot

因为要通过公共网络访问这个上游。所以我们在这里将所有的超时时间设置为 60 秒。

Screenshot

创建这个页面规则。

Screenshot

现在来创建另一个页面规则。

Screenshot

为这个规则也指定一个条件。

Screenshot

条件的变量名仍然是 SNI 服务器名。

Screenshot

Screenshot

Screenshot

输入 “www.ebay.com” 作为值。

Screenshot

添加一个代理目标。

Screenshot

选择我们刚刚创建的第二个上游。

Screenshot

Screenshot

将所有超时时间改为 60 秒。

Screenshot

创建这个页面规则。

Screenshot

可以看到代理页面规则已经出现在页面规则列表页。

Screenshot

最后一步是做一个新配置的发布。把我们刚才的改动推送到所有的网关服务器上。

Screenshot

点击这个按钮做一个新的发布。

Screenshot

发布。

Screenshot

改动现在已经同步到所有的网关服务器上了。可以看到,这个样本部署在网关网络中有 14 台服务器。

Screenshot

我们在整个网络中进行增量的配置同步。

Embeded video

Embeded video

Embeded video

我们在请求粒度上实时更新配置。应用级别的配置更改都不需要服务器重载、重启或二进制升级。所以,即使你有很多不同的用户进行频繁的发布,它的可扩展性也很强。

Embeded image

如图所示,我们将使用 4003 作为监听端口。先把这个端口添加到该应用的分区中。

Embeded image

跳转到网关分区页面。

Screenshot

打开网关分区页面。我们现在是在分区列表页。可以看到已经有很多分区存在。

Screenshot

我们将在分区 “default” 中添加一个 SNI Proxy 类型的端口。

Screenshot

点击这个按钮。

Screenshot

来添加端口。

Screenshot

可以看到列表顶部出现了新的一行。

Screenshot

输入 4003 作为端口号。

Screenshot

类型选择 SNI Proxy。

Screenshot

点击保存。

Screenshot

可以看到,新的端口已经成功地被添加到默认分区中。

Screenshot

关闭这个面板。

Screenshot

测试 SNI Proxy 类型的应用

现在让我们转到网关集群页面,选择一个 Edge 服务器来做测试。

Screenshot

选择一个位于美国的节点,注意其 IP 地址是以 .84 结尾的。

Screenshot

我们将使用这个服务器测试刚才添加的页面规则。

用 SNI 名 www.google.com,发送一个 curl 请求。

curl -I --resolve www.google.com:4003:3.131.85.84 https://www.google.com:4003

Screenshot

可以看到,服务器确实是 google。这意味着我们刚刚添加的页面规则生效了。SNI 名为 “www.google.com” 的请求被代理到了正确的上游。

Screenshot

现在来发送另一个 SNI 名为 “www.ebay.com” 的 curl 请求。

curl -I --resolve www.ebay.com:4003:3.131.85.84 https://www.ebay.com:4003

Screenshot

可以看到服务器是 ebay。第二个页面规则也生效了。

Screenshot

现在用浏览器来做测试。首先来看一下机器上的 Host 绑定。

cat /etc/hosts

Screenshot

可以看到 Host 绑定是正确的。

Screenshot

然后用浏览器访问 google。

Screenshot

访问 eBay。

Screenshot

所有结果都符合预期。这就是我今天要演示的内容。

如果你喜欢这个教程,请订阅这个博客网站和我们的 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

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