Apache HTTP服务器是一个模块化的软件,管理员可以通过选择服务器中包含的模块进行功能增减。模块可以在编译时被静态包含进httpd二进制文件,也可以编译成独立于httpd二进制文件的动态共享对象(DSO)DSO模块可以与服务器一起编译,也可以用Apache扩展工具(apxs)单独编译。

上在是官方手册上所述,具体可以参看官方手册相关的介绍:https://blog.361way.com/manapache/dso.html

关于模块
有两种使用模块的方法:一是静态连接进核心,二是作为DSO模块动态加载;如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。如果希望核心能够装载DSO,但不实际编译任何DSO模块,则需明确指定“–enable-so=static”

一般语法
一般情况下你可以使用如下语法启用或者禁用某个模块:

<span style="font-family:'Tahoma','sans-serif';font-size:9pt;">--disable-MODULE <br />

禁用MODULE模块(仅用于基本模块)
–enable-MODULE=shared
MODULE编译为DSO(可用于所有模块)
–enable-MODULE=static
MODULE静态连接进核心(仅用于扩展和实验模块)
–enable-mods-shared=MODULE-LIST
MODULE-LIST中的所有模块都编译成DSO(可用于所有模块)
–enable-modules=MODULE-LIST
MODULE-LIST静态连接进核心(可用于所有模块)

上述 MODULE-LIST 可以是:
(1)
用引号界定并且用空格分隔的模块名列表

–enable-mods-shared=’headers rewrite dav’

(2)”most”(大多数模块[遇见错误模块时忽略该模块而不中断配置过程])
(3)”all”(
所有模块[遇见错误模块时中断配置过程并报错])

–enable-mods-shared=most

注意
configure
将忽略MODULEMODULE-LIST中的拼写错误,注意仔细拼写。用于MODULEMODULE-LIST中的名称是“mod_NAME”中去掉“mod_”并将剩余部分中的下划线“_”替换为连字符“-“以后的结果,比如“mod_log_config”模块应当表示为“log-config”

一般情况下会说,Apache编译安装分:静态编译和动态编译,这只是粗略的说法。

1、静态编译

在使用./configure 编译的时候,如果不指定某个模块为动态,即没有使用:enable-mods-shared=module或者enable-module=shared 这个2个中的一个,那么所有的默认模块为静态。 那么何谓静态? 其实就是编译的时候所有的模块自己编译进 httpd 这个文件中(我们启动可以使用这个执行文件,如: ./httpd & ,启动的时候这些模块就已经加载进来了,也就是可以使用了, 通常为: 来配置。所以大家看到的配置都是 ,很显然,module.c这个东西已经存在 httpd这个文件中了。

优点:性能高一些。
缺点:缺少灵活性,增加模块时需要重新编译。如:每次对PHP的重新编译,都需要再次编译Apache

2、动态编译

就是编译的时候,使用enable-module=shared 或者enable-modules-shared=module 来动态编译。 那么什么是动态? 静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用 loadmodule 这个语法来加载,这个模块才有效。

那么区别就出来了:静态的模块通常是 来配置, 动态使用loadmoule来加载,然后再配置。

至于性能方面我没怎么关注, 官方说静态的比动态的在性能方面多5%左右。

动态相对方便一点, 如果你编译完后,发现有些需要的模块你没编译进去(默认编译多少模块呢?你用./configure –help | grep disable查看, 会让你去disable表示默认会编译进去,否者disable有什么用呢?)你可以动态的加载, 只要你有module.so文件。

以下是官方给出的优缺点说明:

优点:
由于服务器包的装配工作可以在运行时使用httpd.conf中的配置命令LoadModule来进行,而不是在编译中使用编译选项来进行,因此显得更灵活。比如,只需要安装一个Apache,就可以运行多个不同的服务器实例(如标准&SSL版本,浓缩&功能加强版本[mod_perlPHP])
服务器可以在安装后使用第三方模块被轻易地扩展。这至少对厂商发行包的维护者有巨大的好处,他可以建立一个Apache核心包,而为诸如PHPmod_perlmod_fastcgi等扩展另建附加的包。
更简单的Apache模块原型。使用DSO配合apxs,可以脱离Apache源代码树,仅需要一个 apxs -i 和一个 apachectl restart 命令,就可以把刚开发的新模块纳入到运行中的Apache服务器。
缺点:服务器的启动会慢20%左右,运行时会慢5%左右,并不能用于所有平台。

3、编译示例:
1
、静态编译:
当只需要静态编译module的时候,语法应写成–enable-ssl–enable-ssl=static
例如:
#./configure –prefix=/usr/local/apache2 –enable-ssl[=static]

查看哪些modules被静态编译进apache:
#/usr/local/apache2/bin/httpd -l
Compiled in modules:
core.c
mod_ssl.c

2、动态编译:

当只需要动态编译module的时候,语法写成–enable-ssl=shared即可。
#./configure –prefix=/usr/local/apache2 –enable-ssl=shared

查看哪些modules被动态编译进apache:
#ls -l /usr/local/apache2/modules/

-rw-r–r– 1 root root 8504 Aug 25 14:49 httpd.exp
-rwxr-xr-x 1 root root 806898 Aug 7 13:57 mod_ssl.so

3、静动混合:

当既需要动态又需要动态的时候,语法写成–enable-ssl=static[动态编译] –enable-rewrite=shared[静态编译]
以下为示例:
#./configure –prefix=/usr/local/apache2 –enable-ssl=static –enable-rewite=shared

<span style="font-size:9pt;"></span>&nbsp;



<span style="font-size:9pt;">查看</span><span style="font-family:'Tahoma','sans-serif';font-size:9pt;">httpd</span><span style="font-size:9pt;">可执行的模块:</span><span style="font-family:'Tahoma','sans-serif';font-size:9pt;"></span>



<span style="font-family:'Tahoma','sans-serif';font-size:9pt;">&nbsp;</span><span>[root@TestServer-RHAS-5 /etc]$ cd /usr/sbin</span>



<span>[root@TestServer-RHAS-5 sbin]$ ldd httpd</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>linux-gate.so.1 =><span>&nbsp; </span>(0x003c3000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libm.so.6 => /lib/libm.so.6 (0x00128000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libpcre.so.0 => /lib/libpcre.so.0 (0x00311000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libselinux.so.1 => /lib/libselinux.so.1 (0x005c2000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libaprutil-1.so.0 => /usr/lib/libaprutil-1.so.0 (0x005a1000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libcrypt.so.1 => /lib/libcrypt.so.1 (0x00c02000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x0048c000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x00cf9000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libdb-4.3.so => /lib/libdb-4.3.so (0x00212000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libexpat.so.0 => /lib/libexpat.so.0 (0x0087f000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libapr-1.so.0 => /usr/lib/libapr-1.so.0 (0x00aff000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libpthread.so.0 => /lib/libpthread.so.0 (0x00fa0000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libdl.so.2 => /lib/libdl.so.2 (0x006d6000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libc.so.6 => /lib/libc.so.6 (0x006da000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/lib/ld-linux.so.2 (0x001f6000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libsepol.so.1 => /lib/libsepol.so.1 (0x00199000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libuuid.so.1 => /lib/libuuid.so.1 (0x008a2000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libpq.so.4 => /usr/lib/libpq.so.4 (0x00a0f000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x0032e000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libresolv.so.2 => /lib/libresolv.so.2 (0x00110000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x00d50000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libssl.so.6 => /lib/libssl.so.6 (0x00e67000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libcrypto.so.6 => /lib/libcrypto.so.6 (0x008a6000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x003c4000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libnsl.so.1 => /lib/libnsl.so.1 (0x0014f000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00166000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libcom_err.so.2 => /lib/libcom_err.so.2 (0x00f51000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00a9b000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libz.so.1 => /usr/lib/libz.so.1 (0x001df000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00fca000)</span>



<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00123000)</span>



<span style="font-family:'Tahoma','sans-serif';font-size:9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#e56600;">&nbsp; 注:ldd命令的使用必须在httpd可执行文件所在的目录执行才会输出可执行模块的结果。</span><br />

4、使用区别:

1、动态编译使用:
会生成相关的so文件,例如:

1)、动态加载module,在配置文件里需要加上如下语句:
LoadModule access_module /usr/local/apache2/modules/mod_ssl.so
2)
、使用:
rewriteEngine on
RewriteRule ^/(.) http://www.hao123.com [L,P]

2、静态编译使用:
例如要使用rewrite模块的时候在配置文件里加下这句就可以了:
RewriteEngine on
RewriteRule ^/(.) http://www.hao123.com [L,P]

<span></span>

1、动态编译使用:
会生成相关的so文件,例如:

1)、动态加载module,在配置文件里需要加上如下语句:
LoadModule access_module /usr/local/apache2/modules/mod_ssl.so
2)、使用:
rewriteEngine on
RewriteRule ^/(.*) http://www.hao123.com [L,P]

2、静态编译使用:
例如要使用rewrite模块的时候在配置文件里加下这句就可以了:
RewriteEngine on
RewriteRule ^/(.*) http://www.hao123.com [L,P]