了解 OpenResty XRay 是如何做到帮助企业定位应用程序存在的问题以及优化其效率的。

了解更多 LIVE DEMO

OpenResty 是一个开源 Web 平台:它把增强版的 Nginx 核心、LuaJIT 和一组 Lua 库打包成一个发行版,让你可以直接用 Lua 为 Nginx 编写请求处理逻辑。 它不是一套独立于 Nginx 的新服务器,而是在 Nginx 基础上扩展出来的平台:OpenResty 跟随官方 Nginx 版本升级,可执行文件仍然是 nginx,原有的 Nginx 配置可以继续使用。OpenResty 由 OpenResty Inc. 维护。

Nginx 本身已经很强大:静态文件、反向代理、负载均衡、缓存、限速,都可以通过配置直接使用。麻烦出现在需要按自己的业务规则处理请求的时候,比如按用户身份鉴权、按业务规则限流或路由。复杂的判断用 Nginx 指令写起来很麻烦,很多指令要反复查阅文档才能确认行为,配置一长就难以维护;用 C 编写模块的开发成本较高,每次升级 Nginx 还可能需要重新编译模块;交给外部服务处理,每个请求又要多一次网络往返。OpenResty 让你直接在 Nginx 里用 Lua 写这些逻辑:代码条理清晰,修改逻辑也不用重新编译 Nginx。打个比方,如果 Nginx 是一台功能齐全的计算器,那么 OpenResty 就是把它升级成了可编程计算机——从配置已有功能,扩展到编写自己的业务逻辑。

本文由 OpenResty 的维护团队撰写,依次讲清它能做什么、怎么工作、由哪些部分组成,以及开源 OpenResty 与相关商业产品之间的关系。

OpenResty 用来做什么

OpenResty 常用于这样的场景:服务位于流量入口,需要对每个请求进行判断和处理:

  • API 网关与开放平台:在请求进入后端之前完成鉴权、签名校验、限流、路由和协议转换;SaaS 和付费 API 还可以按客户限制调用额度、记录用量。
  • Web 应用防火墙(WAF):在 Nginx 的访问阶段检查请求,拦截 SQL 注入、XSS 等攻击,执行 IP 黑白名单等访问规则。
  • 动态路由、灰度发布与负载均衡:根据请求头、Cookie 或 Redis 中的配置,实时决定把请求转发给哪个上游,也可以按用户或比例把一部分流量分给新版本;上游变化时无需 reload Nginx(见 openresty.org 的基于 Redis 的动态路由示例)。
  • 大促与秒杀流量保护:缓存商品页面和接口,限制请求频率,在流量高峰时拦截异常请求,保护后端服务。
  • CDN 与边缘节点:在靠近用户的节点上做缓存控制、请求改写和响应过滤。
  • AI / 大模型网关:统一代理多个模型的请求,按团队或应用分配流量、控制 Token 配额。
  • 对并发性能要求较高的 Web 服务:直接在 Nginx 里实现完整的 Web 应用或 API,用非阻塞方式访问 MySQL、PostgreSQL、Redis 和 Memcached。

这些场景的共同点是:逻辑必须运行在请求路径上。把它放到 Nginx 之外的独立服务里,每个请求都要多一次网络往返,团队也要多部署、多监控一套服务;靠频繁 reload 来更新路由,又会影响响应延迟、重置负载均衡状态。OpenResty 把逻辑放进 Nginx 进程本身:请求无需再转发到额外的业务服务,路由更新无需 reload,团队可以用脚本语言编写业务逻辑,部署和运维仍然沿用 Nginx 的方式。

如果节点数量增加到需要集中管理配置,开源 OpenResty 本身并不提供完整的控制台和配置分发系统。这时可以在保留现有 Lua 脚本和 OpenResty 运行环境的基础上使用 OpenResty Edge,集中管理负载均衡、WAF、缓存和路由策略,并将配置同步到多个节点,同时保留版本和回滚能力。

OpenResty 如何工作

OpenResty 的工作方式可以归结为三点:

  1. Nginx 负责网络与事件循环。 每个 worker 进程只用一个线程,通过事件驱动的方式同时承载成千上万个连接。
  2. Lua 代码挂在请求处理阶段上。 Nginx 把一个请求的处理分成 rewrite、access、content、log 等阶段,响应发出前还会经过 header/body 过滤器。OpenResty 的核心组件 ngx_lua 允许你在这些位置插入 Lua 代码(rewrite_by_lua*、access_by_lua*、content_by_lua* 等);请求需要转发给上游时,还可以用 balancer_by_lua* 按 Lua 逻辑选择上游节点。每个请求在自己的 Lua 协程中执行。
  3. 访问后端时用 cosocket,不阻塞线程。 cosocket 是 OpenResty 提供的一套非阻塞网络访问接口。当 Lua 代码连接 Redis、MySQL 或上游 HTTP 服务时,cosocket API 会在等待数据期间挂起当前协程,让 worker 去处理其他请求;数据到达后再恢复协程。对写代码的人来说,这看起来就是普通的同步调用。cosocket 可以在 rewrite、access、content 等阶段和定时器里使用(各阶段的完整支持情况见 lua-nginx-module 文档),在过滤器和 log 阶段不可用,这两个阶段适合做轻量的改写和记录。

每个 worker 进程各自拥有一个 LuaJIT 虚拟机,热点代码会被即时编译成机器码。worker 之间需要共享的数据,比如计数器和限流状态,放在 lua_shared_dict 共享内存区里。

开源 OpenResty 提供了运行时能力,但问题定位仍然通常要依赖日志、指标和人工分析。如果生产环境出现 CPU 飙高、内存上涨或请求变慢,可以使用 OpenResty XRay 对运行中的 OpenResty、Nginx 和 LuaJIT 程序进行动态追踪,在不修改代码、不重启应用的情况下,用火焰图定位耗时的代码路径。OpenResty XRay 是独立的商业诊断工具,不是运行 OpenResty 的必需组件。

需要会 Lua 吗

上手时不需要。Nginx 的配置方式没有变,你可以只在需要自定义逻辑的那个 location 里加几行 Lua:

location /hello {
    default_type text/plain;
    content_by_lua_block {
        local name = ngx.var.arg_name or "world"
        ngx.say("hello, ", name)
    }
}

请求 /hello?name=openresty 就会返回 hello, openresty。content_by_lua_block 里是 Lua,块外面仍然是标准的 Nginx 指令。OpenResty 使用的 LuaJIT 完全兼容 Lua 5.1;Lua 语法简洁,入门成本相对较低。

想动手的话,可以从安装 OpenResty 开始,然后跟着 OpenResty 教程 的七个步骤,从 Hello World 走到生产环境。

OpenResty 是 Web 服务器吗,和 Nginx 是什么关系

是。OpenResty 本身就是一个完整的 Web 服务器,也可以作为反向代理、负载均衡器和 TCP/UDP 代理使用。OpenResty 启动后运行的是 Nginx 进程;openresty 命令通常只是启动 OpenResty 所带的 nginx 可执行文件。

它和标准 Nginx 的关系,从版本号上就能看出来:OpenResty 版本号的前三段,就是它捆绑的 Nginx 核心版本。 例如 OpenResty 1.31.1.1 捆绑的是 Nginx 1.31.1,第四段是 OpenResty 自己的修订号。如果你在某个网站的响应头或报错页上看到 openresty/1.31.1.1,指的就是这台服务器运行的 OpenResty 版本。

按 openresty.org FAQ 的说明,OpenResty 采用“tick-tock”发布模式:tock 版本把 Nginx 核心升级到官方最新的 mainline 版本,随后的 tick 版本专注于 OpenResty 自身的功能和改进。各版本的变化可以在 openresty.org 的发布公告中查看,例如 OpenResty 1.31.1.1 发布公告。

OpenResty 由哪些组件构成

根据 openresty.org 的介绍,OpenResty 中大部分 Nginx 模块由其维护者开发,因此这些模块能够较好地协同工作。主要组件如下:

组件作用
增强版 Nginx 核心网络、事件循环、HTTP 与 TCP/UDP 代理,带有 OpenResty 的补丁
LuaJIT(OpenResty 维护的 luajit2 分支)即时编译执行 Lua 代码,完全兼容 Lua 5.1
ngx_lua(lua-nginx-module)把 Lua 嵌入 HTTP 请求处理的各个阶段,提供 ngx.* API 和 cosocket
stream-lua-nginx-module在 TCP/UDP 四层流量上运行 Lua
lua-resty-* 库提供 Redis、MySQL、Memcached、DNS、WebSocket 等客户端,以及缓存、限流、锁和上游健康检查等常用库
lua-cjson高性能 JSON 编解码
resty 命令行工具不写 nginx.conf,直接在终端运行 OpenResty 的 Lua 代码

完整清单见 openresty.org 的组件列表。如果开源库的性能或功能不能满足特定业务需求,也可以使用 OpenResty Inc. 提供的私有库,以替换或增强部分 Lua 库和 Nginx 模块;社区贡献的更多 Lua 库则可以在 OPM 上找到。

谁在使用 OpenResty

根据 Netcraft 2026 年 7 月的 Web 服务器调查,约有 1.2 亿个网站使用 OpenResty(占 Netcraft 统计到的全部网站的 8.02%),约有 4270 万个域名使用 OpenResty(占 13.98%);两项都在全球 Web 服务器中排名第四。

除了直接部署,OpenResty 还是许多基础设施软件的基础运行环境,多款主流开源 API 网关都构建在 OpenResty 之上。所以即使一家公司从未直接安装过 OpenResty,它的请求流量也可能经过 OpenResty。

谁在维护 OpenResty

OpenResty 由章亦春(GitHub ID:agentzh)创建,目前由 OpenResty Inc. 维护,并与 OpenResty 软件基金会一起为项目提供支持。

OpenResty 是免费的开源软件,打包进来的组件大多采用 BSD、MIT 等宽松许可证。源代码、预编译包和文档都可以在 openresty.org 获取,软件包仓库覆盖 Ubuntu、Debian、RHEL 系列、Alpine 等主流 Linux 发行版。

OpenResty Inc. 还提供 OpenResty Edge、OpenResty XRay 和 OpenResty 私有库等独立的商业产品,分别补充多节点集中管理、生产问题诊断和特定组件性能优化能力;它们都不是运行开源 OpenResty 的前置条件。

常见问题

OpenResty 和 Nginx 有什么区别?

OpenResty 包含完整的 Nginx 核心,并在此之上加入了 LuaJIT 和 Lua 库。标准的 Nginx 配置可以继续使用,你可以按需逐个 location 加入 Lua 逻辑。对于需要编程实现的自定义行为,标准 Nginx 通常需要通过 C 模块或其他扩展方式实现;OpenResty 则让你用 Lua 完成许多类似的工作。

OpenResty 可以免费使用吗?

可以。OpenResty 是开源软件,在生产环境中使用无需付费许可证。OpenResty Inc. 的 OpenResty Edge、OpenResty XRay 和 OpenResty 私有库是另外提供的商业产品。

哪些软件是基于 OpenResty 构建的?

开源 API 网关 Kong 和 Apache APISIX 都在各自的官方文档中说明了它们运行在 OpenResty(Nginx + LuaJIT)之上。OpenResty Inc. 的 OpenResty Edge 同样构建在 OpenResty 之上。

OpenResty 使用哪个版本的 Lua?

OpenResty 使用 OpenResty 维护的 LuaJIT 2.1 分支,它完全兼容 Lua 5.1,并支持部分 Lua 5.2 和 Lua 5.3 扩展。标准 Lua 5.1 代码无需修改即可运行,FFI 等 LuaJIT 特有功能也可以使用。访问网络时,请使用 ngx.* 和 lua-resty-* 库提供的非阻塞 API,让 worker 在等待数据期间继续处理其他请求。

网页上显示"403 Forbidden openresty"是什么意思?

这说明该网站的服务器运行的是 OpenResty,错误页底部的 openresty 或 openresty/1.31.1.1 是服务器名称和版本号。403、404、502、504 等状态码由这个网站自己的配置或它的后端服务决定,并不表示 OpenResty 软件本身出了故障。如果你是访客,请联系该网站;如果你是网站管理员,先查看 Nginx 的 error.log,找出请求被拒绝或上游出错的原因。

如何排查 OpenResty 应用的问题?

Lua 的运行时错误会写入 Nginx 的 error.log,这是首先要看的地方;resty 命令行工具适合在服务器之外复现问题。生产环境中的 CPU 飙高、内存上涨或请求变慢,往往无法仅靠日志定位,这时可以用 OpenResty XRay 对运行中的进程生成 Lua 级别的 CPU 火焰图,直接查看耗时的代码路径。

下一步

关于作者

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

章亦春(GitHub ID:agentzh)出生于中国江苏,现居美国湾区。他曾供职于 Cloudflare、雅虎和阿里巴巴等科技企业,长期参与开源软件和系统软件开发,是 OpenResty 项目的创始人,也是 OpenResty Inc. 的 CEO 和创始人。他还参与过 Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM 和 Perl 等项目,并编写过多个开源软件库。

关注我们

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

我们的微信公众号