总结百度 google了好多文档!

关于静态的缺点是:编译进APACHE内核,如果要新加模块,要重新编译;

动态:DSO模式动态加载;如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。
下面是官方的解释:


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




现在在网上好多装APACHE的时候都会用 --enbale-so ,其实我认为这个有时候不是很必要的!



让apache 核心装载DSO,但是不实际编译任何动态模块




要Module所有模块: 
   
 --enable-mods-shared=all 
   

 要Module大部分模块: 
   
 --enable-mods-shared=most



编译以后DSO会自动装载 LoadModule,编译的模块



静态编译:



--enable-modules=most 
   
 --enable-modules=all


我的建议是,动态加载所有模块,然后在httpd.conf中配置!



官方文档:


Quotation




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

 --disable-MODULE 
     
 禁用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将忽略MODULE和MODULE-LIST中的拼写错误,注意仔细拼写。用于MODULE和MODULE-LIST中的名称是"mod_NAME"中去掉"mod_"并将剩余部分中的下划线"_"替换为连字符"-"以后的结果,比如"mod_log_config"模块应当表示为"log-config"。


官方说明: http://www.phpchina.com/manual/apache/programs/configure.html




百度文档,的方法!



Quotation




以前编译apache的时候
都是google搜索到的直接拿来用

这次自己编译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的

./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)编译了




我的configure文件:


Quotation



其实

./configure --prefix=/opt/dfs/apache --enable-mods-shared=most --enable-ssl=shared --enable-rewrite=shared --enable-alias=shared --enable-include=shared --enable-headers=shared --enable-info=shared --with-threads=yes


./configure --prefix=/opt/dfs/apache --enable-mods-shared=most --with-threads=yes


就可以了!


 



 


转载于:https://blog.51cto.com/scanty/485267