OpenResty 高性能网关开发教程 / 第 01 章 - OpenResty 概述
第 01 章 - OpenResty 概述
1.1 什么是 OpenResty?
OpenResty 是一个基于 Nginx 与 LuaJIT 的高性能 Web 平台,由章亦春(agentzh)于 2007 年发起。它将 Nginx 从一个单纯的 HTTP 服务器转变为一个可编程的 Web 应用服务器。
核心组成
| 组件 | 说明 |
|---|---|
| Nginx | 事件驱动的高性能 HTTP 服务器和反向代理 |
| LuaJIT | 高性能的 Lua 即时编译器,执行效率接近 C |
| ngx_lua 模块 | 将 Lua 嵌入 Nginx 请求处理生命周期 |
| lua-resty 库 | 非阻塞 I/O 的 Lua 库集合(Redis、MySQL、HTTP 等) |
| lua-resty-core | 使用 FFI 重写的核心 API,性能更高 |
架构总览
┌─────────────────────────────────────────────────┐
│ 客户端请求 │
└──────────────────────┬──────────────────────────┘
▼
┌─────────────────────────────────────────────────┐
│ Nginx Master Process │
│ ┌───────────┬───────────┬───────────┐ │
│ │ Worker 1 │ Worker 2 │ Worker N │ (多进程) │
│ │ ┌───────┐ │ ┌───────┐ │ ┌───────┐ │ │
│ │ │LuaJIT│ │ │LuaJIT│ │ │LuaJIT│ │ (每进程) │
│ │ └───┬───┘ │ └───┬───┘ │ └───┬───┘ │ │
│ │ │ │ │ │ │ │ │
│ │ ngx_lua │ ngx_lua │ ngx_lua │ │
│ └───────────┴───────────┴───────────┘ │
│ 共享内存 (shared dict) 跨 Worker 通信 │
└─────────────────────────────────────────────────┘
1.2 Nginx + Lua 为什么强?
Nginx 的事件驱动模型
传统 Web 服务器(如 Apache prefork)采用「一个连接一个线程」的模型,当并发达到数千时,线程切换开销急剧增长。Nginx 采用 事件驱动 + 异步非阻塞 I/O 模型:
传统模型(线程/进程):
连接1 ─→ [线程1] ─→ 等待I/O ─→ 处理 ─→ 响应
连接2 ─→ [线程2] ─→ 等待I/O ─→ 处理 ─→ 响应
...
连接N ─→ [线程N] ─→ (系统资源耗尽)
Nginx 模型(事件驱动):
连接1 ──┐
连接2 ──┤
... ──┤──→ [Worker] ──→ epoll/kqueue ──→ 回调处理
连接N ──┘ (单线程处理数千连接)
Lua 的嵌入点
Lua 代码可以在 Nginx 请求生命周期的多个阶段执行,每个阶段有不同的用途:
请求进入
│
├── set 阶段 ──→ 变量设置
├── rewrite 阶段 ──→ URL 重写
├── access 阶段 ──→ 认证、限流、鉴权
├── content 阶段 ──→ 生成响应内容
├── header_filter ──→ 修改响应头
├── body_filter ──→ 修改响应体
└── log 阶段 ──→ 日志记录
为什么不用 Python/Go 内嵌? LuaJIT 极其轻量(< 1MB),启动速度纳秒级,GC 停顿微秒级,完全契合 Nginx 的高性能要求。Python/Go 的运行时重量和 GC 停顿不适合嵌入到每个 Nginx Worker 中。
1.3 OpenResty vs Kong vs APISIX
三者关系
OpenResty ──→ 底层运行时平台(Nginx + Lua)
│
├── Kong ──→ 基于 OpenResty 的 API 网关(PostgreSQL/Cassandra)
│
└── APISIX ──→ 基于 OpenResty 的 API 网关(etcd 配置中心)
详细对比
| 维度 | 原生 OpenResty | Kong | Apache APISIX |
|---|---|---|---|
| 定位 | 可编程 Web 平台 | API 网关产品 | API 网关产品 |
| 配置存储 | Nginx 配置文件 | PostgreSQL / Cassandra | etcd |
| 插件机制 | Lua 代码自由编写 | Lua + 插件体系 | Lua + 插件体系 |
| 热更新 | reload 配置 | Admin API | Admin API + etcd watch |
| 学习曲线 | 需懂 Nginx + Lua | 开箱即用 | 开箱即用 |
| 性能 | 极致(无额外开销) | 中等(ORM 层开销) | 高(接近原生) |
| 适用场景 | 深度定制、极致性能 | 企业级 API 管理 | 高性能微服务网关 |
| 社区 | GitHub 25k+ star | GitHub 39k+ star | GitHub 14k+ star |
| 维护者 | OpenResty 基金会 | Kong Inc. | Apache 基金会 |
选择建议
需要极致性能 + 完全控制 → 原生 OpenResty
需要企业级 API 管理 + 可视化 → Kong
需要高性能微服务网关 + 云原生 → APISIX
需要深度学习网关原理 → 原生 OpenResty(本教程)
本教程定位:通过原生 OpenResty 开发网关,让你从原理层面理解 API 网关的每一个细节。掌握原生 OpenResty 后,再使用 Kong 或 APISIX 会更加得心应手。
1.4 API 网关核心能力
一个完整的 API 网关需要具备以下能力,这也是本教程的覆盖范围:
| 能力 | 说明 | 对应章节 |
|---|---|---|
| 路由 | 将请求转发到正确的后端服务 | 第 05 章 |
| 限流 | 防止服务过载,保护后端 | 第 06 章 |
| 认证 | 验证请求者身份 | 第 07 章 |
| 负载均衡 | 在多个后端间分配请求 | 第 08 章 |
| 缓存 | 减少后端压力,加速响应 | 第 09 章 |
| 协议转换 | 不同协议间的转换 | 第 10 章 |
| 日志监控 | 记录和分析请求数据 | 第 11 章 |
| 安全防护 | 防止恶意请求和攻击 | 第 12 章 |
| 服务发现 | 动态感知后端服务变化 | 第 13 章 |
网关在微服务架构中的位置
┌──────────┐
客户端 ────────→ │ CDN/WAF │
└────┬─────┘
▼
┌──────────┐
│ API 网关 │ ← 本教程的核心
└────┬─────┘
┌──────┬───┼───┬──────┐
▼ ▼ ▼ ▼ ▼
┌─────┐┌─────┐┌─────┐┌─────┐
│用户 ││订单 ││商品 ││支付 │
│服务 ││服务 ││服务 ││服务 │
└─────┘└─────┘└─────┘└─────┘
1.5 适用场景
✅ 非常适合的场景
| 场景 | 原因 |
|---|---|
| API 网关 | 路由、限流、认证等核心网关功能 |
| 反向代理 | Nginx 原生能力 + Lua 扩展 |
| 内容缓存 | 共享内存 + 响应缓存,减轻后端压力 |
| 流量染色 | 灰度发布、A/B 测试、金丝雀发布 |
| Web 防火墙 | 自定义 WAF 规则,防 SQL 注入、CC 攻击 |
| 实时日志处理 | 非阻塞日志写入,ELK 集成 |
| 协议网关 | HTTP ↔ gRPC、HTTP ↔ WebSocket |
⚠️ 不太适合的场景
| 场景 | 建议替代方案 |
|---|---|
| 复杂业务逻辑 | Go/Java 微服务 |
| 长时间运行任务 | 消息队列(Kafka、RabbitMQ) |
| 强类型系统 | Go、Java、TypeScript |
| 实时双向通信 | Go + WebSocket / Erlang |
1.6 谁在使用 OpenResty?
| 公司/产品 | 使用方式 |
|---|---|
| Cloudflare | 全球 CDN 边缘计算,数百万请求/秒 |
| Kong | API 网关底层引擎 |
| Apache APISIX | 微服务网关底层引擎 |
| 阿里巴巴 | 淘宝、天猫 API 网关 |
| 腾讯 | 腾讯云 API 网关 |
| 字节跳动 | 内部网关基础设施 |
| Netflix | 边缘网关 |
1.7 本教程的学习目标
完成本教程后,你将能够:
- 从零搭建一个生产级 API 网关
- 实现路由、限流、认证、缓存等核心网关功能
- 理解 Nginx + Lua 的执行模型和性能优化技巧
- 部署和运维 OpenResty 网关(Docker、集群)
- 具备评估 Kong、APISIX 等产品的能力
- 设计和开发自定义 OpenResty 插件
1.8 开发环境准备
在开始下一章之前,请确保你有一台 Linux 环境(虚拟机或云服务器均可):
| 需求 | 最低要求 |
|---|---|
| 操作系统 | Ubuntu 20.04+ / CentOS 7+ |
| 内存 | 1 GB+ |
| 磁盘 | 10 GB+ |
| 工具 | curl, vim/nano, git |
# 快速检查环境
uname -a
curl --version
git --version