强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 配置中心)

详细对比

维度原生 OpenRestyKongApache APISIX
定位可编程 Web 平台API 网关产品API 网关产品
配置存储Nginx 配置文件PostgreSQL / Cassandraetcd
插件机制Lua 代码自由编写Lua + 插件体系Lua + 插件体系
热更新reload 配置Admin APIAdmin API + etcd watch
学习曲线需懂 Nginx + Lua开箱即用开箱即用
性能极致(无额外开销)中等(ORM 层开销)高(接近原生)
适用场景深度定制、极致性能企业级 API 管理高性能微服务网关
社区GitHub 25k+ starGitHub 39k+ starGitHub 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 边缘计算,数百万请求/秒
KongAPI 网关底层引擎
Apache APISIX微服务网关底层引擎
阿里巴巴淘宝、天猫 API 网关
腾讯腾讯云 API 网关
字节跳动内部网关基础设施
Netflix边缘网关

1.7 本教程的学习目标

完成本教程后,你将能够:

  1. 从零搭建一个生产级 API 网关
  2. 实现路由、限流、认证、缓存等核心网关功能
  3. 理解 Nginx + Lua 的执行模型和性能优化技巧
  4. 部署和运维 OpenResty 网关(Docker、集群)
  5. 具备评估 Kong、APISIX 等产品的能力
  6. 设计和开发自定义 OpenResty 插件

1.8 开发环境准备

在开始下一章之前,请确保你有一台 Linux 环境(虚拟机或云服务器均可):

需求最低要求
操作系统Ubuntu 20.04+ / CentOS 7+
内存1 GB+
磁盘10 GB+
工具curl, vim/nano, git
# 快速检查环境
uname -a
curl --version
git --version

下一章第 02 章 - 安装与环境搭建 →