模块名的书写是有规则的,一般模块的全称类似于"mod_BASENAME.so"格式,例如"mod_charset_lite.so",但在编译选项中指定模块时,只需指定BASENAME,且如果basename中包含下划线时,需要转换为短横线。例如"--enable-echo"表示编译的模块是"mod_echo.so"。
此外,还支持3种列表方式的动静态编译选项:列表项之间使用空格分隔,但要使用单引号包围。
--enable-modules='Module_Name1 Moduel_Name2' --enable-mods-shared='Module_Name1 Module_Name2' --enable-mods-statics='Module_Name1 Module_Name2'列表部分还可以使用关键字"all/few/most/reallyall"。分别表示编译所有、少量、大多数、真正的所有模块。
"--enable-modules"基本等价于"--enable-mods-shared",都是动态编译给定列表中的模块,但"--enable-modules"可以额外使用一个关键字"none",表示不编译所有模块。
1.4 动静态编译的优先级规则httpd动静态模块编译有一套规则,各种动静态便宜选项之间有优先级的存在。例如,某个非核心模块既指定了动态编译,同时又指定了静态编译,那到底是静态还是动态编译?
以下是我总结的一些优先级规则。
不指定任何模块编译选项时,默认的选项为"--enable-mods-shared",而该选项的默认值又是most,所以等价于"--enable-mods-shared=most"。
显式指定要动态或静态编译的优先级最高。有以下几种方式显式指定: --enable-Module_Name=shared --enable-Module_Name=static --enable-mods-shared='Module_Name1 Module_Name2' --enable-mods-statics='Module_Name1 Module_Name2' --enable-modules='Module_Name1 Moduel_Name2' 如果某个模块既显式指定了动态,又显式指定了静态编译,则静态编译优先级更高。例如: --enable-echo=shared --enable-echo=static 那么,mod_echo模块将被静态编译。
指定了关键字(all/most/few/reallyall)的"--enable-mods-static"选项,优先级高于指定或未指定关键字的"--enable-mods-shared"和"--enable-modules"选项,即静态关键字规则强于动态关键字规则。
例如,下面两个编译配置中,都是"--enable-mods-static=few"生效。第二个编译配置语句中将忽略"--enable-mods-shared=all"。
./configure --prefix=/tmp/apache --enable-mods-static=few
./configure --prefix=/tmp/apache --enable-mods-static=few --enable-mods-shared=all
对于下面的例子,authn-file和echo这两个模块既指定了动态编译又指定了静态编译,静态优先级高于动态,所以这两个模块静态被静态编译。由于没有使用关键字,所以会使用默认的"--enable-mods-shared=most"配置。即动态编译大部分,但指定的这两个模块被静态编译。
./configure --prefix=/tmp/apache \
--enable-mods-static='authn-file echo' --enable-mods-shared='authn-file echo'
而下面这个例子由于额外指定了使用"--enable-mods-static=few"选项,其优先级高于默认的"--enable-mods-shared=most",所以结果是静态编译few,且显式指定的两个模块也被静态编译。
./configure --prefix=/tmp/apache \
--enable-mods-static='authn-file echo' \
--enable-mods-shared='authn-file echo' \
--enable-mods-static=few
使用了关键字的"--enable-mods-static"、"--enable-mods-shared "和"--enable-modules"的选项,隐含了"没有指定何种编译方式的模块"的默认编译方式。
例如下面的编译配置,"--enable-mods-static"指定了关键字few,它将优先于默认的配置规则"--enable-mods-shared=most",所以没有指定编译方式的模块"data"将以静态的方式编译。
./configure --prefix=/tmp/apache --enable-mods-static=few --enable-data
下面的配置如何编译的?由于默认的是"--enable-mods-shared=most"编译方式,所以模块"data"将以动态的方式编译。
./configure --prefix=/tmp/apache --enable-data
再看下面的例子,配置中出现了"--enable-mods-static=few"和"--enable-mods-shared"(未给定值时也是默认为most),static的优先级高于shared,所以没有指定编译方式的模块"data"使用静态编译方式编译,而显式指定了编译方式的模块"echo"其优先级最强,所以动态编译"echo"。
./configure --prefix=/tmp/apache \
--enable-mods-static=few --enable-mods-shared --enable-data --enable-echo=shared
编译mpm模块(prefork/worker/event)和其他模块差不多,唯一的区别是必须至少编译一个mpm模块,且必须有且仅有一个加载被httpd加载。