OpenResty
- 游戏开发
- 2025-08-29 00:09:02

文章目录 OpenResty执行原理getting-started 核心模块: lua-nginx-module (ngx_lua)常用指令配置指令的执行顺序 API OpenResty
官方文档: http://openresty.org/ 官方文档完全不明所以, 除了getting-started完全不知道下一步该干啥 (都不知道ngx是什么它就开始用了), 找不到架构图,找不到原理,找不到可用哪些API,核心组件 Lua Nginx Module 藏的要多深有多深
OpenResty 的目标是让 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型, 不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如MySQL,PostgreSQL,Memcaches 以及 Redis 等都进行一致的高性能响应。
执行原理将 LuaVM嵌入到 Nginx 服务器中, 每个Worker进程使用一个Lua VM(Lua虚拟机),当请求被分配到Worker时,将在这个Lua VM中创建一个协程,协程之间数据隔离,每个协程都具有独立的全局变量。
getting-started 安装 方法一:安装OpenResty (内置了Nginx) 方法二:Nginx添加lua-nginx-module模块 (lua-nginx-module模块是 OpenResty 的核心组件。如果您使用此模块,那么您实际上就是在使用 OpenResty)准备配置文件 conf/nginx.conf worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { server { listen 8080; location / { default_type text/html; content_by_lua_block { # lua code ngx.say("<p>hello, world</p>") } } } } 启动 nginx -p `pwd`/ -c conf/nginx.conf 核心模块: lua-nginx-module (ngx_lua)git仓库: github /openresty/lua-nginx-module 清晰的文档,比官网清晰: openresty-reference.readthedocs.io/en/latest/
ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本, ngx_lua在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。
这样就可以使用Lua编写应用脚本,部署到Nginx中运行 对于开发web应用来说 其开发和Servlet类似,无外乎就是知道接收请求、参数解析、功能处理、返回响应这几步
指令 ngx_lua定义了一系列Nginx配置指令,用于配置何时运行用户Lua脚本以及如何返回Lua脚本的执行结果。 常用指令github /openresty/lua-nginx-module?tab=readme-ov-file#directives
指令说明lua_shared_dict创建全局共享的table(多个worker进程共享)lua_code_cache*_by_lua_file文件是否cachelua_package_path用Lua写的lua外部库路径(.lua文件)init_by_lua*master进程启动时挂载的lua代码init_worker_by_lua*worker进程启动时挂载的lua代码set_by_lua*变量赋值content_by_lua*handler模块log_by_lua 指令的不同运行方式 init_by_lua * : init_by_luainit_by_lua_blockinit_by_lua_file init_by_lua ' print("I need no extra escaping here, for example: \r\nblah") ' init_by_lua_block { # lua代码块 } # 加载lua文件 init_by_lua_file path/name.lua 配置指令的执行顺序 APIgithub /openresty/lua-nginx-module?tab=readme-ov-file#nginx-api-for-lua
这里的 Nginx Lua API 只能在配置指令的上下文中 运行的 Lua 代码中 调用。 各种 *_by_lua 、 *_by_lua_block 和 *_by_lua_file 配置指令作为 nginx.conf 文件内 Lua API 的入口。
API 以两个标准包 ngx 和 ndk 的形式暴露给 Lua
local ngx = require "ngx" local ndk = require "ndk" 基础apingx.var.*读写ng变量; Nginx 变量不能即时创建,只能使用已定义的ng变量ngx.shared.DICT获取由 lua_shared_dict 指令定义的名为 DICT 的共享内存区域的 shm-based Lua 字典对象ngx.re.*正则 线程apingx.get_phase获取当前的指令运行阶段名称ngx.worker.pid当前 Nginx 工作进程的进程 pidngx.worker.exiting当前 Nginx 工作进程是否已经正在退出ngx.thread.spawn创建一个 “light threads” Lua 协程ngx.thread.wait等待一或多个"light threads",返回第一个终止的"light threads"结果ngx.sleep睡眠指定秒数,非阻塞(使用定时器实现) 核心常量ngx.nullngx.OK(0)ngx.ERROR(-1)ngx.AGAIN(-2)ngx.DONE(-4)ngx.DECLINED(-5) 打印, 日志apingx.DEBUGngx.INFOngx.WARNngx.ERRngx.log输出到error.log 编码解码apingx.md5ngx.encode_argsngx.decode_argsngx.encode_base64ngx.decode_base64ngx.escape_uringx.hmac_sha1ngx.md5_bin 时间apingx.timengx.utctimengx.nowngx.now:revertngx.update_timengx.timer.atngx.timer.everyngx.time.returns()ngx.time:revert()ngx.utctime http请求/响应 apingx.ctx.*请求的lua上下文ngx.req.*ngx.resp.*ngx.status响应码ngx.header响应头ngx.print输出响应ngx.sayngx.print + 换行符ngx.flush刷新响应输出到客户端ngx.exit结束请求 HTTP 状态常量ngx.HTTP_OK200ngx.HTTP_CREATED(201)ngx.HTTP_ACCEPTED(202)ngx.HTTP_NO_CONTENT(204)ngx.HTTP_BAD_REQUEST400ngx.HTTP_UNAUTHORIZED(401)ngx.HTTP_PAYMENT_REQUIRED(402)ngx.HTTP_FORBIDDEN(403)ngx.HTTP_NOT_FOUND(404)ngx.HTTP_CONFLICT(409)ngx.HTTP_TOO_MANY_REQUESTS(429)ngx.HTTP_INTERNAL_SERVER_ERROR500ngx.HTTP_BAD_GATEWAY(502)ngx.HTTP_SERVICE_UNAVAILABLE(502)ngx.HTTP_GATEWAY_TIMEOUT(504)