apache动态编译与静态编译的区别

发布时间:2019-10-29编辑:脚本学堂
apache动态编译与静态编译的区别

编译apache的mod_rewrite和ssl时遇到了问题,却不知道问题出在哪里。
一个是mod_rewrite模块没有起作用。
一个是以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

仔细查找后,发现了问题所在,下面详细讲解下问题发现与解决办法,一起学习apache动态编译与静态编译的区别。

使用下面的编译参数编译的apache:
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl

问题就出在–enable-so
现在知道了–enable-so的意思是说
让apache 核心装载DSO,但是不实际编译任何动态模块
–enable-ModuleName的意思是说 编译并包含模块ModuleName
而 –enable-ModuleName=shared 的意思是说将这个模块编译成动态的.

根据上面的总结,应该去掉–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的动态与静态编译的理解:
好比有两个人a和m,a代表apache,m代表module,要想让a使用m的东西。
一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了。
就是所谓的静态编译。

还有一个方法,
就是告诉a, m的住址,当a要使用m的东西的时候,a去找m,然后使用。
不过,这种方法要注意的一个问题就是:m必须要有实际的住址,否则a会找不到m而产生错误的,我此文开始提到的 apachectl startssl产生的错误就是这个原因,应该再编译好ssl才可以的。这种方法就是apache的动态(DSO)编译了。