问一个老问题,apache的动态编译.

问一个老问题,apache的动态编译.

在apache编译模块这方面,有动态编译和静态编译,静态编译暂先不研究,动态编译中1.*版本的和2.* 版本的编译参数还不一样.
这让我很迷糊决定花时间把他弄明白.还请各位大哥帮我解惑.

在网上看到千篇一律的文档中的一篇文档这样写

[Copy to clipboard] [ - ]
CODE:
举例说明,mod_rewrite模块为例:
错误方式:
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl

会导致,ssl启动apache的时候报告:
apachectl startssl
Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_free

解释:

问题出在–enable-so,–enable-so表示让apache核心装载DSO,但是不实际编译任何动态模块;
–enable-ModuleName表示,编译并包含模块ModuleName;
–enable-ModuleName=shared表示,将这个模块编译成动态的。

正确方式:

搞清除上面所述的内容,就ok了:
应该去掉–enable-so这行;
如何希望动态编译模块:比如:–enable-rewrite应该替换为: –enable-rewrite=shared

最后,我将要编译的应该为:
./configure
--prefix=/usr/local/apache2
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
解释:
–enable-mods-shared=most表示,动态的编译进来大多数的模块。那么,–enable-mods-shared=all是指动态的编译所有的模块。如果把-shared去掉,就是静态的编译了。

总结一下,动态、静态apache编译安装的方式的区别。静态编译,就是将 module直接在安装的过程中防盗apache中,当apache使用module的时候,就可以直接使用了。而,动态编译安装,只是将module引入到apache之中,在使用的时候才会真正的去寻找。但是在动态中必须有正确额地址,否则就会出现上文提到的错误。

我对这篇文档不明白的问题是
1. –enable-so表示让apache核心装载DSO,但是不实际编译任何动态模块;
这句话的意思是说 只要有这条语句 apache  就把DSO装载进核心. 也就是把mod_so模块静态编译进apache 中,又
因为单个模块的动态加载,是基于mod_so的模块来实现的.那这么说–enable-so 就是动态加载模块的前题了?

2. –enable-ModuleName=shared表示,将这个模块编译成动态的。
我在http://hedong.3322.org/archives/000366.html这篇文档中看到.

[Copy to clipboard] [ - ]
CODE:
创建和安装一个 Apache发布的(distributed) 模块,比方说将mod_foo.c编译成mod_foo.so:

$ ./configure --prefix=/path/to/install --enable-foo=shared
$ make install

这样直接就能编译成apache  能加载的模块了?为什么没有–enable-so  参数呢?

3. –enable-ModuleName表示,编译并包含模块ModuleName;
编译并包含模块 难道这个参数是用到静态编译当中吗?他到底在什么时候需要用呢?

4. –enable-mods-shared=most表示,动态的编译进来大多数的模块。

他说的这个大多数的模块,到底都是哪些模块.有没有一篇文档规定apache 使用–enable-mods-shared=most 参数的时候 都把哪些模块动态编译进去了?为什么不直接让他等于个all 把所有模块动态编译进去 那多省事啊?


还请大家抽出时间帮我解答一下.谢谢!
为什么大家点了。都不留点什么呢 我问题描述的不清楚吗??
我的理解:
1、--enable-modules用来指定系统允许使用的功能扩展的类型,这里指定为so类型,--enable-so用来指定允许DSO(动态共享对象)
这么做可以让apache可以动态加载MOD而不需要重新编译。 也正如你所说是动态MOD的前提。

2、--enable-ModuleName=shared  只是说你加载这个MOD后可以在httpd.conf文件中用mod_so的LoadModule命令,告诉服务器在启动或重新启动时将此模块加载
   --enable-so 是说可以加载新的MOD 或这里是启动或重新启动时将此模块加载

3、我的理解为静态。你用loadmodule 的时候就用

4、不知道

如有错误,一起讨论


[Copy to clipboard] [ - ]
CODE:
正确方式:

搞清除上面所述的内容,就ok了:
[color=Red]应该去掉–enable-so这行;
如何希望动态编译模块:比如:–enable-rewrite应该替换为: –enable-rewrite=shared[/color]

最后,我将要编译的应该为:
./configure
--prefix=/usr/local/apache2
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
解释:
–enable-mods-shared=most表示,动态的编译进来大多数的模块。那么,–enable-mods-shared=all是指动态的编译所有的模块。如果把-shared去掉,就是静态的编译了。

我理解您解释的第一个问题了,谢谢。那在他那篇文章看来。
他把-enable-so 去掉后这就说明,他把 rewrite speling forward ssl 等 模块静态编译进apache 中了?

如果想进行动态编译,则要把 --enable-rewrite 等替换为 -enable-rewrite=shared 并且在 httpd.conf 中加上 LoadModule 语句。

[Copy to clipboard] [ - ]
CODE:
错误方式:
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl

会导致,ssl启动apache的时候报告:
apachectl startssl
Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_fre

上面apache启动的时候报错。是因为他没在 httpd.conf 中没加 LoadModule 语句吧?



我的第二个问题,我的理解是。他虽然用了--enable-foo=shared 参数是动态编译,要在httpd.conf 中添加LoadModule 语句,但没有-enable-so 参数所以以后他在需要什么模块就只能重新编译apache了对吗?


兰色字体是我 的一些看法。哪错了。请大家多多指正。

我一楼的第四个问题还请大家帮帮忙,谢谢啦!