openresty 使用 lua-resty-mysql 模块轻量查询 mysql,无需外部依赖,通过 tcp 实现协议通信;需正确配置 lua_package_path,复用连接池(set_keepalive),参数校验防注入,设超时,json 结构化响应。

OpenResty 通过 Lua 脚本操作 MySQL 实现轻量级查询,核心是使用 lua-resty-mysql 模块——它不依赖外部驱动或 C 客户端库,而是直接基于 TCP 实现 MySQL 协议通信,启动快、内存占用低、适合高并发短生命周期请求。
确保模块可用并正确加载
OpenResty 默认已集成 lua-resty-mysql(无需额外安装),但需确认 Lua 脚本路径配置无误:
- 在
nginx.conf的http块中添加:lua_package_path "/usr/local/openresty/lualib/?.lua;/path/to/your/lua/?.lua;;"; - 避免路径末尾缺失分号,否则 Lua 无法定位模块
- 无需
opm install,除非你用的是极简版 Nginx + lua-nginx-module
建立连接并设置连接池
轻量级查询的关键不是“连了就关”,而是复用连接。应优先使用 set_keepalive 而非 close:
- 调用
db:connect(props)后,立即执行db:set_keepalive(60000, 100) -
60000表示空闲连接最长保留 60 秒,100是连接池最大容量 - 若连接失败,应记录
ngx.log(ngx.ERR, ...),不返回敏感错误给前端 - 不要在每个请求中新建连接对象(
mysql:new()可复用,但连接实例不可跨请求共享)
执行安全、简洁的查询
轻量级场景通常只需单条 SELECT,重点在于防注入与快速响应:
- 参数必须从 URI 或 body 中提取后做类型校验,例如:
local id = tonumber(ngx.req.get_uri_args().id),非数字则拒绝 - 拼接 SQL 时禁用字符串直插,改用占位符逻辑(
lua-resty-mysql不原生支持预编译,需手动转义):local sql = "SELECT id,name FROM users WHERE id = " .. tostring(id) - 查询超时设为 1–3 秒(
db:set_timeout(2000)),避免拖垮整个 worker - 结果为空时
res是空表{},不是nil,遍历时注意判空
输出结构化响应
轻量查询常用于 API 接口,建议统一 JSON 输出:
- 加载
cjson:local cjson = require "cjson.safe"(推荐 safe 版本防崩溃) - 设置响应头:
ngx.header.content_type = "application/json; charset=utf-8" - 直接
ngx.say(cjson.encode(res)),无需手动遍历拼接 - 如需兼容空结果,可包装为:
ngx.say(cjson.encode({ data = res, code = 0 }))











