OpenResty实战:用Lua脚本接管Nginx,返回动态JSON数据

张开发
2026/4/10 14:08:56 15 分钟阅读

分享文章

OpenResty实战:用Lua脚本接管Nginx,返回动态JSON数据
在上一篇文章中我们成功安装了OpenResty并看到了默认的欢迎页面。但那个页面是静态的而在真实的多级缓存架构中我们需要Nginx能够处理动态请求甚至直接返回业务数据。今天我们将通过一个“商品详情查询”的实战案例手把手教你修改Nginx配置编写Lua脚本让Nginx变身为一台能够返回JSON数据的“API服务器”。场景背景告别502错误假设我们有一个商品详情页前端Vue应用正在向/api/item发送请求获取数据。现状由于后端服务尚未启动或者Nginx配置尚未完成浏览器控制台显示502 Bad Gateway错误。目标我们希望在OpenResty层直接拦截这个请求并模拟返回一组商品JSON数据让前端页面能够正常渲染。第一步修改nginx.conf开启Lua支持要让Nginx执行Lua代码我们需要在配置文件中做两件事加载模块路径和定义处理逻辑。打开/usr/local/openresty/nginx/conf/nginx.conf在http块中进行如下配置http { # 1. 配置Lua模块路径 # 告诉OpenResty去哪里找我们的Lua代码 lua_package_path /usr/local/openresty/lualib/?.lua;/path/to/your/lua/?.lua;;; lua_package_cpath /usr/local/openresty/lualib/?.so;;; # 2. 定义请求处理逻辑 server { listen 80; server_name localhost; # 拦截 /api/item 请求 location /api/item { # 设置响应头类型告诉浏览器返回的是JSON default_type application/json; # 核心指令指定处理该请求的Lua脚本文件 content_by_lua_file /usr/local/openresty/nginx/lua/item.lua; } } }关键点解析lua_package_path这就像Java的CLASSPATH配置好后我们在Lua代码中引用模块会更方便。content_by_lua_file这是OpenResty的核心指令之一。它的意思是“当请求匹配到这个location时请执行指定文件中的Lua代码来生成响应内容”。第二步编写item.lua返回动态数据配置写好了但脚本文件还不存在。我们需要创建它。在Nginx目录下例如/usr/local/openresty/nginx/创建一个lua文件夹并在其中新建item.lua文件。编写代码如下-- item.lua -- 使用ngx.say输出内容类似于Java的response.getWriter().print() -- 注意Lua中字符串可以使用单引号这样可以避免JSON双引号的转义麻烦 local json_data [[ { id: 10001, title: OpenResty实战课程, price: 99.00, stock: 500, images: [ http://example.com/img1.jpg, http://example.com/img2.jpg ] } ]] -- 输出JSON数据 ngx.say(json_data)代码亮点ngx.say()这是OpenResty提供的API用于向客户端发送响应体。[[ ... ]]这是Lua的长括号语法用于定义多行字符串。这在处理JSON数据时非常有用因为你不需要对内部的双引号进行转义。第三步重载与验证代码写好了现在需要让Nginx生效。1. 重载配置不需要重启服务执行以下命令平滑重载nginx -s reload2. 浏览器验证回到浏览器刷新商品详情页。观察Network面板原本红色的502错误变成了绿色的200 OK。观察页面内容页面成功渲染出了“OpenResty实战课程”及其价格信息。动态验证尝试修改item.lua中的价格保存后再次刷新浏览器你会发现数据实时发生了变化总结与展望通过今天这个案例我们完成了从“静态代理”到“动态业务处理”的跨越。我们利用content_by_lua_file指令成功将请求的处理权交给了Lua脚本。虽然目前我们只是返回了写死的假数据但这正是多级缓存架构中“Nginx本地缓存”的雏形——未来我们将在这里编写代码去查询Redis从而实现真正的高性能动态响应。知识点核心总结知识点核心内容考试重点/易混淆点难度系数OpenResty基础安装OpenResty并配置nginx服务监听商品详情页请求OpenResty与nginx的关系及反向代理配置⭐⭐Lua脚本编写业务逻辑通过content_by_lua_file指定Lua脚本处理请求返回JSON数据ngx.say与content_by_lua_file的区别⭐⭐⭐商品详情页数据查询模拟模拟返回商品数据如尺寸、颜色、价格验证OpenResty响应逻辑JSON数据格式与动态修改字段的注意事项⭐⭐OpenResty模块加载加载Lua模块.lua和C模块.so以支持Redis/Tomcat查询模块路径配置与依赖关系⭐⭐⭐请求拦截与路由通过location /api/item拦截请求并交由Lua脚本处理路径匹配规则与优先级⭐⭐开发调试技巧修改假数据后实时刷新nginxnginx -s reload观察页面变化日志排查与网络请求监控如Chrome DevTools⭐⭐

更多文章