OpenResty Edge Lua 扩展是一段自定义 Lua 代码,当内置网关事件触发时(例如网关服务器异常离线),Edge 会自动运行它。你完全在 Edge 的 Web 控制台里创建、编辑并绑定这些扩展——路径为 Global Config → Global Lua Extensions,并选择一个事件类型作为触发条件。这让 Edge 成为一个事件驱动的自动化平台:无需轮询或编写外部胶水代码,直接把 Lua 逻辑挂到网关生命周期事件上。

本文将演示如何构建一个事件驱动的 Lua 扩展,响应 **Gateway Server Abnormal Offline(网关服务器异常离线)**事件,在网关服务器一掉线的瞬间就从 GoDaddy DNS 摘除失效节点——让 DNS 不再把流量解析到离线节点,无需人工介入。若你想从 page rule 里调用可复用的 Lua 而非绑定事件,请参见配套功能 Global Lua Modules;若想了解基于 webhook 的同类事件驱动方案,请参见 用 OpenResty Edge Webhook 构建事件驱动运维

如何创建绑定网关事件的 OpenResty Edge Lua 扩展

OpenResty Edge 提供了强大的 Lua 扩展功能,能够自动响应网关服务器的离线事件。

OpenResty Edge Web 控制台中的 Lua 扩展概览

让我们切换到 OpenResty Edge 的 Web 控制台。这是我们的控制台的样例部署。每个用户都有自己的本地部署。

登录 OpenResty Edge Web 控制台样例部署

进入 “Global Config” 页面。

进入 OpenResty Edge 的 Global Config 页面

点击 “Global Lua Extensions”。

在 Global Config 下打开 Global Lua Extensions

让我们创建一个新的 Lua 扩展。

点击创建一个新的 OpenResty Edge Lua 扩展

创建一个扩展,防止 GoDaddy 将域名解析到已经离线的节点。

新建 Lua 扩展表单:离线时从 GoDaddy DNS 摘除节点

这里我们输入名称为 “remove_node_from_godaddy_if_node_is_offline”。

将 Lua 扩展命名为 remove_node_from_godaddy_if_node_is_offline

OpenResty Edge 中 Lua 扩展的配置字段

选择 “By event”。

选择 By event 作为 Lua 扩展的触发方式

OpenResty Edge 支持几种内置事件。

OpenResty Edge Lua 扩展可用的内置网关事件类型

这里,我们选择 “Gateway Server Abnormal Offline” 类型。这意味着如果服务器离线,Lua 扩展就会被触发。

选择 Gateway Server Abnormal Offline 事件作为触发条件

如果你习惯使用 Vim,可以启用 Vim 模式来编辑代码。

在 OpenResty Edge Lua 代码编辑器中启用 Vim 模式

当事件发生时,它会将 trigger_event 传递给 Lua 扩展。

事件触发时 Lua 扩展接收 trigger_event 数据

向管理服务器发送请求,当节点离线时,可以从 GoDaddy 中移除该节点。

Lua 代码向管理服务器发请求以摘除离线节点

当响应内容满足条件时,使用 Lua 的 cjson 模块解码它,并将结果赋值给 body 变量。

用 Lua cjson 解码响应并赋值给 body 变量

如果 body 存在且 body.status 等于 0,则输出成功消息。

检查 body.status 等于 0 并在 Lua 中输出成功消息

点击创建!

点击创建保存该 OpenResty Edge Lua 扩展

如何通过让网关服务器离线来触发并验证 Lua 扩展

创建后,这个新的 Lua 扩展将自动运行。让我们用一个离线的网关服务器来测试它。

进入网关集群页面。

打开 OpenResty Edge 的网关集群页面

这是我们要使用的网关集群。

用于 Lua 扩展离线测试的网关集群

它现在是在线的。

测试前网关服务器显示为在线状态

在终端上,使用 systemctl 命令停止服务。

在终端用 systemctl 停止网关服务

刷新列表。

刷新 OpenResty Edge 的网关服务器列表

服务器现在离线了。

网关服务器现在显示为离线状态

返回 “Global Config” 页面。

返回 OpenResty Edge 的 Global Config 页面

进入 “Global Lua Extensions”。

重新打开 Global Lua Extensions 查看执行历史

检查执行历史。

查看 Lua 扩展的执行历史

如图所示,扩展已被触发并执行。

执行历史确认 Lua 扩展已被触发并执行

节点已成功从 GoDaddy 中移除。

GoDaddy DNS 确认离线节点已成功移除

常见问题

什么是 OpenResty Edge 中的 Lua 扩展?

Lua 扩展是一段自定义 Lua 代码,OpenResty Edge 会在内置网关事件触发时自动运行它。你在 Web 控制台的 Global Config → Global Lua Extensions 下编写和管理它,因此无需改动底层网关配置文件就能加入事件驱动的自动化逻辑。

哪些事件可以触发 Lua 扩展?

创建扩展时,你选择 “By event” 作为触发方式。OpenResty Edge 支持多种内置事件;本文使用的是 “Gateway Server Abnormal Offline”(网关服务器异常离线),只要有网关服务器离线就会触发该扩展。

创建 Lua 扩展后需要重载或重启网关吗?

不需要。Lua 扩展运行在 Edge Admin(管理端),而不是各网关节点(Edge Node),因此没有需要重载或重启的网关。点击创建后,新的 Lua 扩展就会自动生效,没有额外的激活步骤;下一次绑定的事件触发时,Edge Admin 就会运行你的 Lua 代码。

事件触发时扩展会收到什么数据?

事件发生时,OpenResty Edge 会把一个 trigger_event 值传给 Lua 扩展,你的代码由此知道是哪台服务器或哪个上下文触发的,从而据以行动——例如确定要摘除哪个离线节点。

Lua 扩展能否调用 DNS 服务商等外部服务?

可以。本例中,扩展向管理服务器发送请求以从 GoDaddy 摘除离线节点,然后用 Lua 的 cjson 模块解码响应,并在记录成功前检查 body.status 是否等于 0。同样的模式适用于任何 HTTP API。

如何确认 Lua 扩展确实运行了?

回到 Global Config → Global Lua Extensions 查看执行历史。它会显示扩展是否已被触发并执行——在本文中,确认了离线节点已从 GoDaddy DNS 中移除。

关于 OpenResty Edge

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

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

我们的微信公众号

翻译

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