Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145366
  • 博文数量: 58
  • 博客积分: 130
  • 博客等级: 入伍新兵
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 21:38
文章分类
文章存档

2012年(22)

2011年(36)

分类:

2011-11-30 23:30:06

原文地址:apache 动态编译与静态编译 作者:doita

    其实这个问题我一直在纠结,因为我真不知道哪个模块默认就有的,动态编译和静态编译的据别和联系,之前写的apache+mysql+tomcat完全丢掉了,开源的软件,魅力在于其开源,编译安装的高度定制化,当然这也需要使用者本身的自身水平,很显然,我暂时只能参考网上大家的说法.自己从头开始学习一些细节.很多资料描述都是从网上摘录的,不过,我一定会写明的.首先是默认的静态编译安装这些模块是默认的:
  1. [root@doita bin]#./apachectl -l
  2. Compiled in modules:
  3.   core.c
  4.   mod_authn_file.c
  5.   mod_authn_default.c
  6.   mod_authz_host.c
  7.   mod_authz_groupfile.c
  8.   mod_authz_user.c
  9.   mod_authz_default.c
  10.   mod_auth_basic.c
  11.   mod_include.c
  12.   mod_filter.c
  13.   mod_log_config.c
  14.   mod_env.c
  15.   mod_setenvif.c
  16.   mod_version.c
  17.   prefork.c
  18.   http_core.c
  19.   mod_mime.c
  20.   mod_status.c
  21.   mod_autoindex.c
  22.   mod_asis.c
  23.   mod_cgi.c
  24.   mod_negotiation.c
  25.   mod_dir.c
  26.   mod_actions.c
  27.   mod_userdir.c
  28.   mod_alias.c
  29.   mod_so.c
  关于动态安装的优缺点 官方文档给出了如下说明:

上述基于DSO的功能有如下优点:

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

DSO有如下缺点:

  • 由于并不是所有操作系统都支持动态加载代码到一个程序的地址空间,因此DSO机制并不能用于所有平台。
  • 由于Unix加载器必须进行符号解析,服务器的启动会慢20%左右。
  • 在某些平台上,位置独立代码(positon independent code[PIC])需要复杂的汇编语言技巧来实现相对寻址,而绝对寻址则不需要,因此服务器在运行时会慢5%左右。
  • 由于DSO模块不能在所有平台上被其他基于DSO的库所连接(ld -lfoo),比如,基于a.out的平台通常不提供此功能,而基于ELF的平台则提供,因此DSO机制并不能被用于所有类型的模块。或者可以这样说,编译为DSO文件的模块只能使用由Apache核心、C库(libc)和Apache核心所用的所有其他动态或静态的库、含有独立位置代码的静态库(libfoo.a)所提供的符号。而要使用其他代码,就只能确保Apache核心本身包含对此代码的引用,或者自己用dlopen()来加载此代码。
    动态编译其实就是把哪些模块独立起来,脱离了apache本身的二进制主体部分.默认加载.so文件的模块是在apache主体中的.动态编译有几个选项,将上面的模块部分进行动态编译的.
   --enable-mods-shared=max  所有标准的动态模块都编译为dso
   --enable-mods-shared=most 常用的,把那些不常用的放在一边.
   --enable-mods-shared=all  意思是动态加载所有模块,如果去掉-shared话,是静态加载所有模块
  以上为2.0以后的版本,对于1.3之前的版本,语法有所不同.
     (参考如下)
  客户环境的静态编译modules为
  1. bash-3.00# apachectl -l
  2.   Compiled in modules:
  3.   core.c
  4.   prefork.c
  5.   http_core.c
  6.   mod_so.c
以上是2.0的,后来证实是版本问题.2.2之后多了很多静态模块. 

使用静态与动态模块的语法不同:静态的可以直接使用,而动态的需要加载 如下
  1. LoadModule access_module modules/mod_access.so
  2. LoadModule auth_module modules/mod_auth.so
  3. LoadModule auth_anon_module modules/mod_auth_anon.so
采用centos的yum工具安装的apache效果很不错,除了最基本的核心模块之外,其他的都是动态加载的.

在动态编译时,可能需要zlib-devel 来支持服务器端压缩传输功能.





 


   
 
   

阅读(1022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~