什么是 EdgeLang?OpenResty Edge 的网关 DSL,把复杂规则编译成高效安全的 Lua
什么是 EdgeLang?
EdgeLang 是由 OpenResty Inc. 创建的领域特定语言(DSL),用于为 OpenResty Edge 产品编写网关逻辑。您无需手写 Lua,而是把页面规则和 WAF 规则写成简洁、像文档一样的规则;EdgeLang 编译器会把它们编译成经过高度优化、对每个请求只扫描一次的 Lua 代码——在规则数量多、条件复杂的场景下,通常比未经手工精心优化的手写 Lua 更快,同时避免无限循环、内存泄漏和未定义变量。OpenResty Edge 是一个流量管理平台,提供页面规则、Web 应用防火墙(WAF)、负载均衡等功能,几乎整个系统都构建在 EdgeLang 之上。许多高流量的网站,如 Qunar、ADP 和 Ajaib,都使用 EdgeLang 来表达他们复杂的网关和 WAF 规则。本文是概念性介绍;如需动手实操教程,请参阅 EdgeLang 教程。
为什么选择 EdgeLang 而不是手写 Lua?
为什么选择 EdgeLang 而不是手写 Lua?以下是一些好处:
- 性能:EdgeLang 会把多条规则的条件编译并优化成对输入请求数据的单次扫描。这意味着即使有很多规则、包含涉及正则表达式和字符串模式的复杂条件,也不会因逐条重复匹配而牺牲速度。在这类规则密集的场景下,EdgeLang 通常比未经手工精心优化的手写 Lua 代码更快。
- 安全性:EdgeLang 是一种基于规则的语言,可以防止常见的编码错误,如无限循环、内存泄漏或未定义的变量。您不必担心因为错误的代码而导致网关或 WAF 崩溃。
- 灵活性:EdgeLang 允许您用简单和可读的语法做很多事情。您可以操作头部、Cookie、查询字符串、正文数据等。您还可以调用自定义的 Lua 代码或模块,甚至是 C/C++ 代码,如果您需要更多的功能。EdgeLang 与其他 OpenResty 组件(如 ngx_lua 和 resty.core)很好地协同工作。
- 可维护性:EdgeLang 规则易于编写和理解。它们看起来像文档而不是代码。您可以将规则组织成组,并将它们应用到不同的域名或路径。您还可以使用基于 Web 表单的页面规则来创建和管理规则,而无需编写任何代码。
EdgeLang 的设计者曾经在 Cloudflare 工作多年,也看到了维护用 Lua 编写的众多网关逻辑有多困难。EdgeLang 是一个更好的替代方案,提供了更多的功能和性能。
EdgeLang 用在哪里:页面规则与 WAF
在 OpenResty Edge 的 web 控制台 Edge Admin 中,我们使用 EdgeLang 来实现各种功能,比如设置页面规则或 WAF 规则。
想了解完整的 EdgeLang 语法和更多代码示例,请阅读我们文档网站上全面的 EdgeLang 用户手册。
总结
EdgeLang 是一种强大而高效的实现 OpenResty Edge 产品复杂网关逻辑的方式。它提供了许多好处,如性能、安全性、灵活性和可维护性。EdgeLang 规则易于编写和理解,并且与其他 OpenResty Edge 功能协同工作。您可以将 EdgeLang 用于各种目的,例如在 Edge Admin 中设置页面规则或 WAF 规则。如果您想了解更多关于 EdgeLang 的信息,您可以在我们的文档网站上阅读我们全面的用户手册。我们希望您喜欢使用 EdgeLang 和 OpenResty Edge 来创建惊艳的 Web 网关或私有 CDN 网络。
常见问题
什么是 EdgeLang?
EdgeLang 是由 OpenResty Inc. 创建的领域特定语言,用于在 OpenResty Edge 中编写网关逻辑。您用它把页面规则和 WAF 规则写成简洁、像文档一样的规则,EdgeLang 编译器会把它们编译成运行在网关服务器上、经过高度优化且对请求只扫描一次的 Lua 代码。
EdgeLang 比 Lua 更快吗?
EdgeLang 最终也会编译成在网关上运行的 Lua 代码,但它会在编译期做额外优化:把多条规则中的条件(尤其是正则表达式和字符串匹配)合并、优化成对请求数据的单次扫描,避免逐条规则重复匹配。因此在规则数量多、条件复杂(尤其正则密集)的场景下,它通常比同等功能、未经手工精心优化的 Lua 代码更快;规则越多、匹配越复杂,这种优势越明显。
EdgeLang 比手写 Lua 更安全吗?
是的。EdgeLang 是一种基于规则的语言,可以防止无限循环、内存泄漏或未定义变量等常见编码错误,因此一条有 bug 的规则不会像随手写的 Lua 代码那样让您的网关或 WAF 崩溃。
EdgeLang 能调用 Lua 或 C/C++ 代码吗?
可以。EdgeLang 用简洁易读的语法操作头部、Cookie、查询字符串和正文数据,当您需要更多功能时,它还可以调用自定义的 Lua 代码或模块,甚至 C/C++ 代码。它与 ngx_lua、resty.core 等其他 OpenResty 组件也能良好协同。
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!

























