Nginx 本身不内置 WAF,但可通过静态或动态模块方式集成第三方 WAF,如 ModSecurity、lua-nginx-module 和 ngx_waf,分别在 post-read、access 等处理阶段嵌入防护逻辑,实现低延迟、高灵活性的安全控制。

Nginx 本身不内置 WAF 功能,但依靠其模块化设计,可将安全能力以第三方模块方式嵌入运行时,实现轻量、高效、贴近业务流量的 Web 应用防火墙。核心在于:模块不是外挂代理,而是直接参与请求处理生命周期的“内嵌组件”。
Nginx 模块加载机制决定 WAF 的集成深度
Nginx 支持两种模块集成方式,直接影响 WAF 的部署灵活性与维护成本:
静态模块(Static Module)
编译时将模块源码直接链接进 nginx 二进制文件。
适合 ModSecurity 这类需深度介入 HTTP 解析流程的引擎——它要解析请求头、URI、参数、Body,甚至支持规则级响应重写。
需要重新编译 nginx,但运行时无额外加载开销,防护延迟低(实测 <10ms),适合生产环境长期稳定运行。动态模块(Dynamic Module)
编译为.so文件,通过load_module指令在配置中按需加载。
适合 lua-nginx-module 或 ngx_waf 这类基于脚本或轻量逻辑的 WAF 实现。
优势是升级/启停模块无需重启 nginx,便于灰度验证规则或快速回滚;但对 Lua 脚本性能和 GC 行为更敏感。
判断建议:若 nginx 是源码编译安装且版本 ≥1.9.11,优先用动态模块;若使用官方预编译包或追求极致稳定性,选静态模块。
主流 WAF 模块如何利用 Nginx 处理阶段嵌入防护逻辑
Nginx 请求处理分为多个阶段(phase),WAF 模块会注册到关键阶段执行检查:
-
post-read阶段:获取原始请求行和头部前,可用于 IP 黑白名单初筛(如 ngx_waf 的ip_blacklist) -
server-rewrite/location-rewrite阶段:重写 URI 前,检测路径遍历、恶意编码(如..%2f) -
access阶段:最常用——ModSecurity 和 lua-nginx-module 的access_by_lua*都在此拦截。可读取全部变量($args,$cookie_x,$http_user_agent),匹配规则并ngx.exit(403) -
content阶段前:部分模块(如 ngx_waf)还支持响应体扫描,防敏感信息泄露
这意味着:WAF 不是旁路镜像流量,而是和正常业务逻辑共享同一请求上下文,能精准控制放行、阻断、记录、重定向等动作。
实际部署中模块与规则的协同关系
模块提供“执行引擎”,规则定义“判断依据”,二者解耦:
- ModSecurity 模块加载
modsecurity.conf后,依赖外部规则集(如 OWASP CRS)进行语义分析 - lua-nginx-module 加载
.lua脚本,规则即代码——可写 if/else、调用 redis 做频控、查本地缓存做 UA 白名单 - ngx_waf 模块则自带 YAML 规则语法,支持
url,arg,cookie,cc等字段级匹配,配置即生效
例如一条 CC 防护规则,在不同模块中体现为:
# ngx_waf 方式(配置驱动) waf_cc on; waf_cc_rule "uri=/login;seconds=60;limit=10;action=deny;";
# lua-nginx-module 方式(代码驱动)
access_by_lua_block {
local limit = require "resty.limit.count"
local lim, err = limit.new("cc_login", 10, 60)
local key = ngx.var.uri
local delay, err = lim:incoming(key, true)
if err then
ngx.exit(403)
end
}模块机制让 WAF 可按需组合:用 ModSecurity 做深度协议合规检测,用 Lua 做业务定制策略,用 ngx_waf 做高性能基础过滤——它们可以共存于同一 nginx 实例,分阶段协作。
不复杂但容易忽略


















