OpenResty:把 Nginx 变成可编程的 Web 平台

Nginx 是目前使用最广泛的 Web 服务器和反向代理工具之一。但原生 Nginx 只处理请求转发和静态文件服务,需要业务逻辑时还得额外搭建应用服务器。

OpenResty 捆绑了 Nginx 核心、大量第三方 Nginx 模块及其依赖,形成一个完整的 Web 应用开发平台。核心思路是在 Nginx 的事件驱动架构上引入 Lua 编程能力,让开发者用 Lua 脚本实现认证、限流、动态路由等逻辑,性能接近原生 Nginx。

项目获得了 13,891 个 Star,由章亦春(agentzh)维护,采用 BSD 2-Clause 许可证。

正文顶部截图

工作原理

Nginx 的请求处理分为多个阶段:读取请求头、URI 重写、内容生成、日志记录等。OpenResty 在每个阶段都暴露了 Lua 编程接口,开发者可以介入任意阶段的处理流程。

一个典型的例子:请求到达时,先在 rewrite 阶段用 Lua 查询 Redis 做 Token 校验,通过后再在 content 阶段转发到后端服务。整个流程在 Nginx 工作进程内完成,不需要创建额外进程或发起新的网络连接。

OpenResty 内置了 LuaJIT 虚拟机。LuaJIT 的即时编译能力让 Lua 代码的执行效率接近 C,这是 OpenResty 能在保持灵活性的同时不牺牲性能的基础。

模块生态

OpenResty 团队维护了一套 lua-resty-* 系列库,覆盖后端开发的常见需求:

  • lua-resty-mysql:MySQL 客户端
  • lua-resty-redis:Redis 客户端
  • lua-resty-http:HTTP 客户端,支持同步和异步
  • lua-resty-lrucache:进程内 LRU 缓存
  • lua-resty-logger-socket:异步日志发送,避免阻塞请求处理
  • lua-resty-openssl:TLS 和加密操作

这些库由同一团队开发和测试,和 Nginx 核心版本的兼容性有保证。比起自行拼凑社区模块,统一维护降低了配置冲突和运行时异常的风险。

README区域截图

resolv.conf 解析

OpenResty 对标准 Nginx 的 resolver 指令做了扩展,支持从系统 DNS 配置文件中自动读取解析器地址。在 http、stream、server、location 各上下文中均可使用。设置 local=on 即读取默认路径 /etc/resolv.conf,也可以指定自定义文件路径。容器化部署时 DNS 地址经常变化,这个功能省去了手动更新配置的步骤。

适用场景

OpenResty 在国内互联网公司中应用较多,典型场景包括:

  • API 网关:统一入口,集中处理鉴权、限流、日志采集
  • 灰度发布:根据用户 ID、地域、设备类型等条件做流量分配
  • 动态配置:不重启服务的情况下变更路由规则和限流阈值
  • WAF:在 Nginx 层做请求过滤和基础防护

这些场景的共同点是对响应延迟敏感。OpenResty 方案的额外处理开销通常在毫秒级别,相比引入独立的微服务中间件,架构更简单,运维成本更低。

安装与使用

从 openresty.org 的下载页面获取最新发行包,按照官方安装文档操作即可。源码编译需要 perl、dos2unix 等依赖,Fedora 系列通过 dnf install 一条命令装好。Windows 平台暂不支持部分功能。

项目主页和文档都在 openresty.org,邮件列表可在 Google Groups 上找到中英文版本。

目主页和文档都在 openresty.org,邮件列表可在 Google Groups 上找到中英文版本。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐