Nginx 编译第三方模块须区分静态与动态:--add-module 用于静态集成,--add-dynamic-module 才生成 .so 文件,且前提为 nginx ≥1.9.11 并含 --with-compat;编译后需 load_module 加载。

Nginx 源码编译时不能用 --add-module 配置第三方动态模块——这个参数只用于静态集成,即把模块代码直接编译进 nginx 二进制文件。若要支持运行时加载 .so 文件,必须用 --add-dynamic-module,且前提是 Nginx 本身已启用动态模块兼容能力。
确认 Nginx 是否具备动态模块基础
运行 nginx -V,检查两处关键信息:
-
nginx version:后版本号 ≥ 1.9.11 -
configure arguments:中包含--with-compat(缺则无法加载外部.so)
若不满足,需先用原参数重编译 Nginx 主体,并显式加上 --with-compat。
使用 --add-dynamic-module 编译模块
进入与当前 Nginx 版本完全一致的源码目录(如 /usr/src/nginx-1.24.0),执行:
- 复用原有 configure 参数(从
nginx -V输出中复制),删掉--add-module=类项 - 追加
--add-dynamic-module=/path/to/your/module(可多次使用,添加多个模块) - 运行
./configure ...确认无报错 - 执行
make modules(不是make install),生成.so文件于objs/目录下
安装并启用动态模块
- 将生成的
.so文件复制到 Nginx 的modules目录(路径由nginx -V | grep modules-path查得) - 在
nginx.conf最开头(main 上下文,events { }之前)添加:load_module modules/ngx_http_geoip2_module.so;
- 运行
nginx -t校验语法,再nginx -s reload生效
不复杂但容易忽略


















