最近研究Kong和apisix他们2个居然都用OpenResty于是我决定研究下什么是 OpenResty openResty是一个基于Nginx与LuaJIT的高性能WEB平台。它在Nginx基础上集成了LuaJIT虚拟机及一系列高质量第三方Nginx模块让开发者能用 Lua 脚本直接在Nginx 内部编写业务逻辑把Nginx从单纯的静态反向代理升级为可编译的web应用服务或动态网关。保留了Nginx强大的性能同时又增强了适配业务的灵活性。OpenResty 是一个整合的平台下面是OpenResty 和NginxLua 之间的关系┌─────────────────────────────────────────────┐ │ OpenResty │ │ ┌─────────────────────────────────────┐ │ │ │ Nginx │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ ngx_lua 模块 │ │ │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ │ │ LuaJIT │ │ │ │ │ │ │ │ ┌─────────────┐ │ │ │ │ │ │ │ │ │ Lua代码 │ │ │ │ │ │ │ │ │ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────┘ │ │ │ │ │ └─────────────────────────────┘ │ │ │ └─────────────────────────────────────┘ │ └─────────────────────────────────────────────┘什么是Lua ?Lua 是一门轻量级可嵌入的脚本语言设计的目的就是-好嵌入到别的程序里当胶水语言。它语法简单运行快体积小在很多软件里都充当内置脚本引擎的角色。1.极轻量整个解释器编译完才1-200KB源码也好集成进C/C项目所以很多游戏引擎嵌入式设备都用它2.语法简洁但够用入门门槛低很容易上手3.结构简单但灵活Lua只有一种复合数据结构-table但它既能当数组用又能当字典/对象用非常灵活4.与C/C完美融合Lua 的作者说过一句话“Lua 不是一个独立的语言而是一个库。”Lua的ffi可以直接调用C5.速度快虽然是解释语言但是LuaJIT让热点代码直接编译成本地机器码性能接近C为什么偏偏是Lua从lua的介绍就能看出来1.Lua体积小2.速度快3.学习成本低4.与C完美兼容特性LuaPythonJS/V8GoPHP极小嵌入体积✅❌❌❌❌原生协程✅⚠️ async/await 非真协程❌ generator 不等同协程✅ goroutine 但调度独立❌C 嵌入友好✅❌ C API 复杂且GIL受限❌ V8 API 重型且迭代快⚠️ CGO 有调用开销❌高性能 JIT✅ LuaJIT⚠️ PyPy 难嵌入生产✅ V8 强但内存占用大✅ 编译为机器码(AOT)❌FFI 直接调 C✅ LuaJIT FFI 零开销⚠️ ctypes 慢❌ 无原生FFI⚠️ CGO 跨边界有损耗❌热加载✅package.loaded清除即生效✅ 重载模块可行✅ 模块缓存可清❌ 需重新编译✅ opcache 重置核心架构OpenResty 的架构可以分为三层1.宿主host增强版的Nginx内核提供基于 epoll/kqueue的事件驱动非阻塞I/O 模型以及 Master-worker 进程管理。2.引擎Engine: LuaJIT 即时编译器执行效率极高提供Lua协程支持可通过FFI直接调用C函数。3.桥梁Bridgengx_lua_module,将Lua解释器嵌入Nginx 的worker进程中允许在不同请求处理阶段注入Lua代码。