nginx在这两天发布了1.9.11版本,开始支持了动态加载模块,只需要将第三方模块编译生成.so文件,在配置文件中添加即可了,大大增加了nginx的实用性,同时也解决了增加模块需要重新编译的问题。
这是由编译之后直接生成可执行的二进制文件,对于module,必须在预编译时设定好,如果想要修改则必须重新编译;
增加了动态模块之后,我们可以看到,二进制文件和动态模块文件(.so)是分开的,这种做法更像是apache httpd,可以通过修改配置文件来进行增加或者删除模块。
在第一个发布的版本(nginx 1.9.11)当中,仅下列几个模块是可以被编译成动态模块的:
ngx_http_geoip_module
)ngx_http_image_filter_module
)ngx_mail_{core, auth, imap, pop3, proxy, smtp}_module
)ngx_stream_{core, access, limit_conn, proxy, ssl,upstream}_module
)ngx_http_xslt_module
)编译的时候只需要添加在–with参数之后添加一个=dynamic即可:
./configure --with-http_geoip_module=dynamic \ --with-http_image_filter_module=dynamic \ --with-mail=dynamic \ --with-stream=dynamic \ --with-http_xslt_module=dynamic
编译好源码之后,会创建一个二级目录modules,默认的位置当然是/usr/local/nginx/modules
想要加载模块只需要在配置文件当中的main区域当中加入load_module参数。修改后重新加载配置文件或者重启nginx即可加载指定的模块,模块路径可以使用绝对路径也可以使用相对路径:
load_module "modules/ngx_http_geoip_module.so"; load_module "modules/ngx_stream_module.so";
注释掉相应的load_module语句并重新加载配置文件就可以取消动态模块的加载,用起来还是很方便的。
将第三方模块转换成动态模块,工程量可能会比较大,一些模块只需要修改config文件,而另外一些模块可能改动就比较大,具体的可以查看对应的文档对自己开发的模块进行修改。而编译的时候其实就简单了许多,只需要使用–add-dynamic-module=即可,使用方法和–add-module其实差不多:
./configure --add-dynamic-module=/path/to/module/source
编译之后也会在modules目录生成.so文件的,这样就可以方便的加载或者取消了