第三十九讲:使用动态模块来提升运营效率
接下来,我们来查看Nginx的动态模块,动态模块可以帮助我们在使用Nginx的时候,在升级Nginx的时候帮助我们减少编译环节;下面我们来看下动态模块在编译及使用的流程;
我们再用一个例子,给大家演示下;

我们在使用动态模块之前,先来看下在不适用动态模块的方法里,我们是怎么样使用Nginx;
首先我们在下载完nginx的源代码,提供了一个叫config的脚本,以及在源代码中介绍的auto目录;这里都在帮助nginx在建立编译系统;那么nginx源代码中提供了很多官方模块,但我们也可能添加许多的第三方模块,不管是官方模块还是第三方模块,这些模块的源码都会和Nginx的框架源码放到一起,进行编译,最后编译出一个nginx可执行文件;那么这是不使用动态模块的一种方式;
那么使用了动态模块尼?
我们在编译的时候,指定了某些模块,使用动态模块的方式去编译;那么最后尼,除了生成nginx的二进制可执行文件,还会生成一个动态库,也就是我们指定了模块的那个动态库;
那么这里我简单介绍下,动态库和静态库主要有 什么区别?
静态库会直接把所有的源代码编译进最终的二进制可执行文件中;
而动态库尼,在nginx二进制可执行文件里,只保留了它的位置或者说地址;那么在我们需要这个动态库里的功能时尼,由nginx的可执行文件去掉用这个动态库,再去完成这样的功能,所以这里的好处就表现为仅仅需要修改某一个模块或者升级这个模块功能时,特别是当我们的nginx编译了大量的第三方模块,那么这个时候我可以仅仅重新编译这个动态库,而不用去替换我的二进制可执行文件,因为这里很有可能会漏了或者多编译一些nginx模块或者参数使用了错误,而我编译出新的动态库以后,我只要去替换掉这个动态库,然后用ngixn -s reload 一遍;那么我就可以使用新的模块功能了;
具体使用的时候,主要为6个步骤;
(1):首先,要在nginx的源代码中加入configure 加入动态模块的时候必须指明这个模块是使用动态模块的的方式编译进nginx中;这里有一个潜台词,不是所有的nginx模块都可以以动态模块的方式加入到nginx中;只有一些模块才可以以动态模块的方式加入;
(2):开始执行make,编译出binary;
(3):到第三步的时候,也就是说我们开始启动nginx了;启动nginx的时候尼我们去读ngx_module里的数组;
(4):读到模块数组中尼,我们发现了使用了一个动态模块,接下来我们会看到一个nginx的conf中加入的一个配置项,这个配置项叫load_module配置;指明了这个 动态模块所在的路径,
(5):那么接下来我们就可以在nginx的进程中打开这个动态库加入模块数组,
(6):最后再进行一个初始化的过程(基于模块数组进程初始化);
这是动态模块的一个工作流程;
接下来我们做一个简单的演示:

在nginx的源代码目录中:
我们先看下哪些模块是支持动态模块的;
命令:./configure --help|more


我们可以看到支持动态模块的这些模块会有一个新增的选项;当我们加--with的时候 可以在最后面加上一个=dynamic;
下面以--with-http_image_filter_module=dynamic这个动态模块为例进行演示;

执行make以后将 ngx_http_image_filter_module.so复制到 编译好的nginx目录中新建的modules 目录中;

配置文件中:
首先添加:load_module 模块和对应的路径;
load_module modules/ngx_http_image_filter_module.so;

然后对我们访问图片的目录 我们加上 image_filter resize 15 10; 即15*10这个像素;

添加图片文件:

访问这个文件图片:

--with-http_image_filter_module=dynamic 这个模块指实时的把这个图片压缩成更小的一些图片;
那么下面我们以动态模块的方式看看是否能将其变成更小的图片
重新启动nginx,进行访问

图片变小了,说明image_filte模块已经生效了;
使用了动态模块,不需要删除nginx 二进制文件,进行热升级了,可以减少我们出错的效率,但是并非所有的模块都支持动态模块的加载;

浙公网安备 33010602011771号