必须显式设置 default_type 'text/html' 和 charset utf-8,确保浏览器正确解析html;正确配置 lua-resty-template 路径与模板根目录;避免混用 ngx.say() 与 template.render(),注意模板语法及数据源连接池管理。

在 Nginx 的 content_by_lua_block 阶段用 Lua 动态渲染 HTML 页面,核心是:Lua 负责数据准备与模板执行,Nginx 负责正确响应头与内容输出。关键不在“能不能做”,而在于“怎么让浏览器把它当 HTML 打开,而不是下载”。
确保响应 Content-Type 正确
这是最常见也最容易忽略的问题——页面被当成文件下载,往往只因少了这一行配置:
- 在对应
location块中显式设置:default_type 'text/html'; - 如果用了
charset,建议一并加上:charset utf-8; - 不依赖
types指令或 MIME 自动推断,因为 Lua 渲染是纯内容输出,没有后缀可参考
加载并调用 lua-resty-template
模板引擎需在 Lua 环境中可用,且路径配置清晰:
- 确认已通过 OPM 安装:
opm get bungle/lua-resty-template - 在
nginx.conf的http块中声明 Lua 模块路径(如未默认包含):lua_package_path "/usr/local/openresty/site/lualib/?.lua;;"; - 在
content_by_lua_block中按需加载与渲染:local template = require "resty.template"<br>template.render("index.html", { title = "欢迎页", items = { "A", "B" } })
模板文件位置与查找逻辑
lua-resty-template 默认从 ngx.var.document_root 查找模板,但推荐显式控制:
- 在
server或location块中设置变量:set $template_root "/var/www/myapp/templates"; - 若同时设了
$template_location(如/templates),会优先尝试ngx.location.capture请求该 URI;成功返回 200 时用其响应体作模板,否则回落到$template_root - 模板文件(如
index.html)应放在对应目录下,且 Nginx 进程有读取权限
避免常见陷阱
几个高频出错点,直接影响渲染是否生效:
- 不要在
content_by_lua_block中混用ngx.say()和template.render()—— 后者内部已调用ngx.print,重复输出可能破坏 HTML 结构 - 模板内 Lua 代码块(如
)必须语法正确,错误会导致整个响应空白或 500 - 若需从 Redis / MySQL 取数据,确保连接池已预建、超时设合理,避免阻塞 worker
- 禁止在 Lua 中使用全局变量存状态(如
my_data = {}),改用ngx.ctx或shared_dict
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











