假如我们需要使用第三方模块,内置模块时
就会用到nginx的动态加载功能

模块方面又分为三种
1.外部动态加载模块 (第三方模块 –add-dynamic-module)
2.内部静态模块 (内部模块 –with-stream_geoip_module=dynamic)
3.外部静态模块 (第三方模块 –add-module)
具体可以查看 auto/module脚本分析-part15

上面只是说模块的几种分类了解下即可
重要的是我们该怎么动态添加我们的模块

第一种 添加nginx默认支持的动态模块
场景为编译时候忘记添加,恰好此模块支持动态加载
拿stream_geoip_module模块演示

1
2
3
4
5
6
7
8
9
10
11
12
13
yum install GeoIP GeoIP-devel GeoIP-data
cd /opt/apply/nginx-1.15.11
make clean
(删除残留)
./configure --help | grep dynamic
(列出支持动态加载的模块)
./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-openssl=/opt/apply/openssl-1.1.1b --with-stream_geoip_module=dynamic
(编译参数不能只加一个./configure --with-stream_geoip_module=dynamic 这样编译会出错,很不清楚其他文章的作者怎么编译成功的,要加上原nginx编译参数 不清楚的可以 nginx -V 获取)
make
cp objs/ngx_stream_geoip_module.so /usr/local/nginx/modules
(没有modules目录自己创建)
主配置添加 load_module "modules/ngx_stream_geoip_module.so";
(需要放到最上层,不要放在http或者server层中)

当未添加原nginx编译参数报错问题解决方案出处 github

第二种 添加第三方模块
拿echo模块演示,编译还是需要和以前编译参数一样只是增加
–add-dynamic-module=源码目录

1
2
3
4
./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-openssl=/opt/apply/openssl-1.1.1b --with-stream_geoip_module=dynamic --add-dynamic-module=/opt/apply/echo-nginx-module-0.61
make
cp objs/ngx_http_echo_module.so /usr/local/nginx/modules
添加主配置 load_module "modules/ngx_http_echo_module.so";

官方也有介绍动态模块 地址