nginx启用第三方防刷限流模块通常需静态编译,c模块(如ngx_http_guard_module)和lua依赖模块(如lua-nginx-module)均不支持动态加载;原生limit_req等指令可满足基础限流需求。

在 Nginx 中启用第三方防刷与限流模块(如 nginx-module-vts、ngx_http_guard_module、nginx-limit-req-enhance 或更常用的 lua-resty-limit-traffic),通常**不能通过动态加载(load_module)实现**,绝大多数需在编译阶段静态集成。以下是清晰、可操作的步骤说明:
确认模块类型与兼容性
不同模块支持方式不同:
-
纯 C 编写的模块(如
ngx_http_guard_module):必须重新编译 Nginx,不支持运行时加载; -
基于 Lua 的模块(如
lua-resty-limit-traffic):依赖nginx-lua-module(即lua-nginx-module),该模块本身也需编译进 Nginx; -
官方已合并的功能(如
limit_req、limit_conn):无需第三方模块,直接配置即可使用。
务必查阅目标模块的 README 或 GitHub 页面,确认其 Nginx 版本兼容性(例如是否支持 1.20+、是否适配 stream 模块等)。
下载源码并添加模块重新编译
以添加 lua-nginx-module + lua-resty-limit-traffic(实现灵活的令牌桶/漏桶限流)为例:
- 安装依赖:
yum install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel -y(CentOS)或apt-get install build-essential libpcre3-dev libssl-dev zlib1g-dev -y(Ubuntu); - 下载 Nginx 源码(版本需与当前线上一致,如
nginx-1.24.0); - 下载扩展模块:
wget https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.25.tar.gz; - 解压后进入 Nginx 源码目录,执行 configure(关键!要保留原有参数):
./configure --add-dynamic-module=/path/to/lua-nginx-module-0.10.25 \--with-http_ssl_module --with-http_v2_module ... [其他你原来用的选项] - 执行
make && sudo make install; - 验证是否加载成功:
nginx -V 2>&1 | grep -o 'lua-nginx-module'应有输出。
配置防刷与限流逻辑(以 Lua 方式为例)
编译完成后,在 nginx.conf 或 server 块中启用:
- 在 http 块中加载 Lua 库:
lua_package_path "/path/to/lua-resty-limit-traffic/lib/?.lua;;"; - 定义共享内存区(用于跨 worker 计数):
lua_shared_dict limit_traffic_store 10m; - 在 location 中应用限流(如每秒最多 5 个请求):
location /api/ { access_by_lua_block { local limit = require "resty.limit traffic" local lim, err = limit.new("limit_traffic_store", 5, 1) -- 5r/s if not lim then ngx.log(ngx.ERR, "failed to instantiate a limiter: ", err) return end local key = ngx.var.binary_remote_addr local delay, excess, err = lim:incoming(key, true) if err then if err == "rejected" then return ngx.exit(503) end ngx.log(ngx.ERR, "failed to limit req: ", err) return end if delay >= 0.001 then ngx.sleep(delay) end } proxy_pass http://backend; }
替代方案:用原生 limit_req 实现基础防刷
若仅需简单 IP 级限流,无需编译第三方模块:
- 在 http 块中定义限流区域:
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s; - 在 server 或 location 中启用:
limit_req zone=ip_limit burst=20 nodelay; - 配合
limit_conn防连接洪泛:limit_conn_zone $binary_remote_addr zone=conn_limit:10m;+limit_conn conn_limit 10; - 对高频 UA 或恶意路径,可用 map + limit_req 组合屏蔽:
map $http_user_agent $limit_key { default $binary_remote_addr; ~*python-requests|curl $http_user_agent; }
再用limit_req zone=ua_limit key=$limit_key;
核心原则:C 模块必编译,Lua 模块依赖 lua-nginx-module 也得编译,而原生指令足够应对多数基础场景。动手前先明确需求强度——是防爬虫毛刺,还是抗 CC 攻击,再决定投入成本。











