jinhailang / blog

技术博客:知其然,知其所以然
https://github.com/jinhailang/blog/issues
60 stars 6 forks source link

Nginx 动态加载模块 #24

Open jinhailang opened 6 years ago

jinhailang commented 6 years ago

nginx-1.9.11 开始,支持动态加载源码模块或第三方模块,需要先在编译 Nginx (./configure)时指定:

模块对应的 .so 文件会被存放在 /path/nginx/modules/ 下面,当需要使用模块时,在 nginx.conf 最顶端(main)配置 load_module,指定模块路径。

但是,这时,添加模块仍然需要在编译阶段声明即需要重新编译 Nginx 程序,很多时候,在生产环境是不能随便去更新替换二进制程序的。

因此,在 nginx-1.11.5 编译命令增加了 --with-compat可以单独编译需要新增的模块直接动态加载到原有的 nginx 二进制程序而不用重新编译 nginx官方阐述

Dynamic modules – NGINX 1.11.5 was a milestone moment in the development of NGINX. It introduced
 the new --with-compat option which allows any module to be compiled and dynamically loaded into a 
running NGINX instance of the same version (and an NGINX Plus release based on that version). 
There are over 120 modules for NGINX contributed by the open source community, and now you can load 
them into our NGINX builds, or those of an OS vendor, without having to compile NGINX from source. 
For more information on compiling dynamic modules, see Compiling Dynamic Modules for NGINX Plus.

下面,以动态加载模块 lua-nginx-module 为例,展示具体用法。

wget http://nginx.org/download/nginx-1.11.5.tar.gz
tar -xzvf nginx-1.11.5.tar.gz

./configure --with-compat --with-cc-opt='-O0 -I /usr/local/include/luajit-2.0' \ --with-ld-opt='-Wl,-rpath,/usr/local/lib -lluajit-5.1' \ --add-dynamic-module=../lua-nginx-module-0.10.13 --add-dynamic-module=../ngx_devel_kit-0.3.0

make modules

cp objs/ndk_http_module.so objs/ngx_http_lua_module.so ../nginx-dy/nginx/modules/

  - 配置使用,在 `nginx.conf` 最顶端,添加:

load_module modules/ndk_http_module.so; load_module modules/ngx_http_lua_module.so;


- 完成

### 遇到的坑

- 编译 Nginx,要带上 `with-compat ` ,否则运行 Nginx 时,会报 ngx_lua 模块不兼容的错误。
- 编译 Nginx,要使用 `--with-ld-opt` 指定 PCRE 等依赖组件 lib 安装路径,否则会报动态库链接符号错误。

### 小结

Nginx 动态加载模块,使增加功能模块变的更加方便与灵活,由于,Nginx 奇数版本为开发版,偶数为稳定版,目前,虽然稳定版已经到了 `nginx-1.14.0`,但是,大部分生产环境应该还是 `nginx-1.10.xx`,所以,**要使用这个功能呢个,生产环境需要升级到 nginx-1.11.5 或以上版本才行。** :)