必须执行nginx -v | grep with-http_lua_module验证模块是否编译,为空则需换openresty或重编译;启用waf须取消luawaf.conf注释并重启nginx(非重载),再通过?id=../etc/passwd测试及查看nginx_error.log日志确认真实生效。

确认 Nginx 是否真支持 Lua 模块
宝塔默认安装的 Nginx(非 OpenResty)不一定带 lua-nginx-module,光看面板里有 waf 目录不等于能跑 Lua 规则。必须验证模块是否编译进去了,否则后续所有配置都会静默失败。
执行命令:nginx -V 2>&1 | grep -o with-http_lua_module
如果输出为空,说明没集成——此时不能硬改 luawaf.conf,得换方案:
- 推荐直接安装宝塔软件商店里的
OpenResty(1.21.4.x+),它自带 LuaJIT 和完整模块,省去编译风险 - 若坚持用原生 Nginx,需重编译并确保同时加载
lua-nginx-module和ngx_devel_kit,操作门槛高且易出错 - 检查
/www/server/nginx/conf/下是否有多处lua_package_path定义,重复会导致 Nginx 启动失败
启用 ngx_lua_waf 的关键三步
宝塔 6.x+ 的 ngx_lua_waf 是“有引擎没点火”状态:文件存在、模块就绪,但默认被注释。不走完这三步,WAF 就是摆设。
- 进入「软件商店」→ 找到已安装的 Nginx → 「设置」→ 「配置修改」
- 在
http {区块内搜索#include luawaf.conf;,删掉行首#,改成include luawaf.conf; - 点击「重启」Nginx(不是「重载」!重载不会重新解析
http块外的新include)
漏掉任一环,比如只改配置不重启,或误点重载,WAF 都不会加载——而面板也不会报错,这是最危险的失效状态。
验证 WAF 是否真实拦截而非假生效
返回 403 不代表 WAF 在工作,返回 200 也不代表它没起作用。必须结合日志和请求行为交叉验证。
- 用测试 URL 触发规则:
http://你的域名/?id=../etc/passwd,预期响应是 403 或空白(取决于config.lua中的returnhtml设置) - 立刻查错误日志:
/www/wwwlogs/nginx_error.log,出现类似lua entry thread aborted: runtime error: /www/server/nginx/waf/init.lua:xxx:才表示 Lua 已加载并执行 - 如果返回 500,大概率是
luajit缺失或init.lua语法错误(比如少个逗号);如果返回 200 且无日志,说明include没生效或路径写错
别信“配置保存了就没问题”,WAF 失效时从不报错,只安静放行攻击流量。
调整 init.lua 和 config.lua 防误杀
开箱即用的规则很激进,直接上生产容易封掉搜索页、登录接口甚至你自己运维 IP。微调必须动手改文件,且每次改完都要重启 Nginx。
-
attacklog = "on":开启后写入/www/wwwlogs/waf_log/,但高频写盘会拖慢 I/O,生产建议关掉或用 logrotate 轮转 -
cc_attack = "on"+cc_rate = "10/60":对登录页极易误封,可先调成"30/60",或在config.lua中按 URI 单独限流 -
ip_white_list必须加你自己的运维网段,例如{"127.0.0.1", "203.123.45.0/24"},否则调试时可能把自己锁死 -
init.lua没语法校验,一个标点错误就能让整个 Nginx 启动失败,改之前建议先cp备份
规则越严,拦截率越高,业务中断风险也同步上升;建议先在测试站跑满 24 小时,观察日志和用户反馈,再切生产。











