需先确认Nginx是否编译lua-nginx-module,若未集成则推荐安装宝塔内置OpenResty;否则需手动编译模块、正确配置lua_package_path/cpath路径、放置cjson.so等依赖,并启用调试模式验证。

如果您已在宝塔面板中部署 Nginx,但尝试运行 Lua 脚本时提示 module 'cjson' not found 或 unknown directive "lua_package_path",说明 Nginx 未正确加载 Lua 支持模块或路径配置缺失。以下是实现 Lua 脚本在宝塔 Nginx 中稳定运行的多种配置方式:
一、确认 Nginx 是否已编译 Lua 模块
宝塔默认 Nginx(非 OpenResty)不内置 lua-nginx-module,需验证是否启用。该步骤用于排除“模块未编译”导致的指令不可用问题。
1、执行命令查看 Nginx 编译参数:
nginx -V 2>&1 | grep -o with-http_lua_module
2、若输出为空,则表示当前 Nginx 未集成 Lua 模块,必须切换方案;若输出为 with-http_lua_module,则继续后续配置。
3、检查 Nginx 配置中是否存在重复的 lua_package_path 指令:执行 grep -r "lua_package_path" /www/server/nginx/conf/,如发现多处定义,需保留唯一一处,否则将导致 Nginx 无法重启。
二、使用宝塔内置 OpenResty 替代标准 Nginx
OpenResty 是集成了 LuaJIT 和 lua-nginx-module 的增强版 Nginx,无需手动编译模块,兼容性与稳定性更高,适合生产环境快速启用 Lua 能力。
1、登录宝塔面板,在【软件商店】中搜索 OpenResty,安装对应版本(推荐 1.21.4.x 或以上)。
2、安装完成后,进入【网站】→【设置】→【配置文件】,确认 server 块外层已自动包含如下全局配置:
lua_package_path "/www/server/nginx/lib/lua/?.lua;/www/server/nginx/waf/?.lua;;";
lua_package_cpath "/www/server/nginx/lib/lua/?.so;;";
3、在站点配置中添加 Lua 执行指令,例如:
location /api {
content_by_lua_block { ngx.say("Lua is working") }
}
4、保存并重载 Nginx 配置,访问 /api 验证响应。
三、手动为标准 Nginx 添加 Lua 支持(编译方式)
适用于必须使用宝塔原生 Nginx(非 OpenResty)且具备服务器编译权限的场景。此方式需下载源码并重新编译,确保 lua-nginx-module 与 NDK(ngx_devel_kit)同时加载。
1、安装依赖:
yum install gcc-c++ pcre-devel openssl-devel zlib-devel -y(CentOS)或 apt-get install build-essential libpcre3-dev libssl-dev zlib1g-dev -y(Ubuntu/Debian)
2、下载并解压 Nginx 源码(版本需与宝塔当前 Nginx 一致,可通过 nginx -v 查看):
3、下载 NDK 与 lua-nginx-module:
cd /usr/local/src
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.1.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.22.tar.gz
tar zxvf v0.3.1.tar.gz
tar zxvf v0.10.22.tar.gz
4、进入 Nginx 源码目录,执行编译命令(注意替换原有 configure 参数):
./configure --add-module=/usr/local/src/ngx_devel_kit-0.3.1 --add-module=/usr/local/src/lua-nginx-module-0.10.22 [原有参数...]
make && make install
5、备份原 nginx 二进制文件,复制新编译的 nginx 到 /www/server/nginx/sbin/nginx,并执行 nginx -t 验证配置。
四、配置 Lua 全局路径与模块加载
即使模块已编译,若 Lua 脚本 require 失败,大概率因 lua_package_path 或 lua_package_cpath 未正确定义,导致无法定位 .lua 或 .so 文件。
1、创建 Lua 模块存放目录:
mkdir -p /www/server/nginx/lib/lua
2、将已编译好的 cjson.so(参考知识库中 lua-cjson 编译流程)拷贝至该目录:
cp /usr/local/src/lua-cjson/cjson.so /www/server/nginx/lib/lua/
3、在 /www/server/nginx/conf/nginx.conf 的 http 块顶部添加两行(确保仅出现一次):
lua_package_path "/www/server/nginx/lib/lua/?.lua;;";
lua_package_cpath "/www/server/nginx/lib/lua/?.so;;";
4、测试 Lua 加载能力:新建 /www/server/nginx/lib/lua/test.lua,内容为 return { ok = true };在 location 中执行:
content_by_lua_block { local t = require("test") ngx.say(t.ok) }
五、启用 Lua 代码缓存与调试模式
Nginx 默认开启 Lua 代码缓存以提升性能,但在开发阶段会导致修改后不生效,需临时禁用以便快速验证逻辑;同时启用错误日志可捕获 require 或语法异常。
1、在站点配置的 server 块内添加:
lua_code_cache off;
2、在 http 块中确保错误日志级别足够高:
error_log /www/wwwlogs/nginx_error.log warn;
3、编写测试脚本 /www/wwwroot/your-site/lua/hello.lua,内容为:
ngx.header.content_type = "text/plain"
ngx.say("Hello from Lua at ", os.date())
4、在 location 中调用:
location /hello { content_by_lua_file /www/wwwroot/your-site/lua/hello.lua; }










