apache 静态编译和动态编译参考

apache-2.2.22 编译安装笔记

一、静态编译

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

第一次安装不带任何参数,只是指定一个安装目录

./configure --prefix=/app/apache2

我们来看看默认静态编译安装有哪些模块

二、动态编译

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

那么区别就出来了:静态的模块通常是在httpd.conf文件中使用<ifmodule></ifmodule> 来配置, 动态使用loadmoule来加载,然后再配置。

第二次安装使用动态编译安装,参数也只是多了一个

./configure --prefix=/app/apache2 --enable-mods-shared=all

1) 可以看到默认被编译进httpd主文件只有几个核心的模块,也就是说这4个被静态编译进httpd主文件,随着主进程的开启就直接启动模块了。

2) 再查看httpd.conf配置文件中包含了以下LoadModule 模块的行,共有51个,这些模块的路径都在modules/目录下,这些就是被动态加载的模块,如果你不需要某个模块,只要在行首加#就可以。但这51个模块并不是apache的所有模块,这一点需要搞清楚,在这51个模块之外的其他所有模块都需要在编译参数中明确指定,后面会讲到这一点。


LoadModule authn_file_module modules/mod_authn_file.so

LoadModule authn_dbm_module modules/mod_authn_dbm.so

LoadModule authn_anon_module modules/mod_authn_anon.so

LoadModule authn_dbd_module modules/mod_authn_dbd.so

LoadModule authn_default_module modules/mod_authn_default.so

LoadModule authz_host_module modules/mod_authz_host.so

LoadModule authz_groupfile_module modules/mod_authz_groupfile.so

LoadModule authz_user_module modules/mod_authz_user.so

LoadModule authz_dbm_module modules/mod_authz_dbm.so

LoadModule authz_owner_module modules/mod_authz_owner.so

LoadModule authz_default_module modules/mod_authz_default.so

LoadModule auth_basic_module modules/mod_auth_basic.so

LoadModule auth_digest_module modules/mod_auth_digest.so

LoadModule dbd_module modules/mod_dbd.so

LoadModule dumpio_module modules/mod_dumpio.so

LoadModule reqtimeout_module modules/mod_reqtimeout.so

LoadModule ext_filter_module modules/mod_ext_filter.so

LoadModule include_module modules/mod_include.so

LoadModule filter_module modules/mod_filter.so

LoadModule substitute_module modules/mod_substitute.so

LoadModule deflate_module modules/mod_deflate.so

LoadModule log_config_module modules/mod_log_config.so

LoadModule log_forensic_module modules/mod_log_forensic.so

LoadModule logio_module modules/mod_logio.so

LoadModule env_module modules/mod_env.so

LoadModule mime_magic_module modules/mod_mime_magic.so

LoadModule cern_meta_module modules/mod_cern_meta.so

LoadModule expires_module modules/mod_expires.so

LoadModule headers_module modules/mod_headers.so

LoadModule ident_module modules/mod_ident.so

LoadModule usertrack_module modules/mod_usertrack.so

LoadModule unique_id_module modules/mod_unique_id.so

LoadModule setenvif_module modules/mod_setenvif.so

LoadModule version_module modules/mod_version.so

LoadModule mime_module modules/mod_mime.so

LoadModule dav_module modules/mod_dav.so

LoadModule status_module modules/mod_status.so

LoadModule autoindex_module modules/mod_autoindex.so

LoadModule asis_module modules/mod_asis.so

LoadModule info_module modules/mod_info.so

LoadModule cgi_module modules/mod_cgi.so

LoadModule dav_fs_module modules/mod_dav_fs.so

LoadModule vhost_alias_module modules/mod_vhost_alias.so

LoadModule negotiation_module modules/mod_negotiation.so

LoadModule dir_module modules/mod_dir.so

LoadModule imagemap_module modules/mod_imagemap.so

LoadModule actions_module modules/mod_actions.so

LoadModule speling_module modules/mod_speling.so

LoadModule userdir_module modules/mod_userdir.so

LoadModule alias_module modules/mod_alias.so

LoadModule rewrite_module modules/mod_rewrite.so

./configure --prefix=/app/apache2 --enable-so --enable-mods-shared=all

结果:同上(只要--enable-mods-share=all,可以不用加--enable-so)

说明:

--enable-mods-shared=all 意思是动态加载所有模块(并不是说apache所有的模块都已经通过这条命令被加载进来了),--enable-mods=all表示静态加载所有模块(后面会有举例)。由于编译参数中使用了动态加载所有模块,所以其它需要被编译进来的模块都会以动态加载模块方式进行编译。

三、通过举例验证

例举1  我们来看以下这个编译参数

./configure --prefix=/app/apache2
--enable-mods-shared=all
--enable-cache
--enable-mem-cache
--enable-file-cache
--enable-disk-cache

--enable-mods-shared=all 动态加载所有模块,httpd.conf中默认会动态加载51个模块(以LoadModule 开始的方式)。

--enable-cache --enable-mem-cache --enable-file-cache --enable-disk-cache 而这四个相关cache模块会以动态模块方式被加载,也就是httpd.conf中以LoadModule的模块会多这4个,那就是共有55个动态模块了。

从以上编译参数可以看出只要编译中有--enable-mods-shared=all 这个参数,那么之后所有你想要增加的模块都会以动态模式来安装,也就是最终在 httpd.conf 中以LoadModule形式来加载模块。

有的朋友说还有一条 --enable-mods-shared=most 意思是动态加载大多数模块,这个大多数其实就是在上面51个模块中少了的那几个模块(用红色表示出来了)。我个人觉得这个--enable-mods-shared=most 就是少了几个模块,并无实际什么特别,如果编译参数中有这条,那么其他所有指定的模块也都会以动态模块来安装。

例举2  刚刚上面提到了--enable-mods=all我们来看看这个编译参数

./configure --prefix=/app/apache2
--enable-mods=all
--enable-cache
--enable-mem-cache
--enable-file-cache
--enable-rewrite

--enable-mods=all 静态编译所有模块,很明显这个编译参数是把所有的模块将会以静态方式来编译,编译好后,我们来看看结果

我们可以看到除了默认模块,指定的几个模块(mod_file_cache.c  mod_cache.c  mod_mem_cache.c mod_rewrite.c)都被静态编译进来了。

例举3 这个参数跟例举2的参数很相似,只是我指定几个为动态加载模块

./configure --prefix=/app/apache2
--enable-mods=all
--enable-cache=shared
--enable-mem-cache=shared
--enable-file-cache
--enable-rewrite=shared

其结果就是--enable-file-cache 是静态编译,其他3个有shared的都是动态编译,在httpd.conf中以LoadModule 开头的行。

例举4

./configure --prefix=/app/apache2
--enable-modules=all

结果如下,有55个静态模块


core.c
mod_authn_file.c
mod_authn_dbm.c
mod_authn_anon.c
mod_authn_dbd.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_dbm.c
mod_authz_owner.c
mod_authz_default.c
mod_auth_basic.c
mod_auth_digest.c


mod_dbd.c
mod_dumpio.c
mod_reqtimeout.c
mod_ext_filter.c
mod_include.c
mod_filter.c
mod_substitute.c
mod_deflate.c
mod_log_config.c
mod_log_forensic.c
mod_logio.c
mod_env.c
mod_mime_magic.c
mod_cern_meta.c


mod_expires.c
mod_headers.c
mod_ident.c
mod_usertrack.c
mod_unique_id.c
mod_setenvif.c
mod_version.c
prefork.c
http_core.c
mod_mime.c
mod_dav.c
mod_status.c
mod_autoindex.c
mod_asis.c


mod_info.c
mod_cgi.c
mod_dav_fs.c
mod_vhost_alias.c
mod_negotiation.c
mod_dir.c
mod_imagemap.c
mod_actions.c
mod_speling.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c

例举5

./configure --prefix=/app/apache2
--enable-modules=all
--enable-mods-shared=all
--enable-cache=static
--enable-disk-cache=static
--enable-mem-cache=static
--enable-file-cache
--enable-ssl

结果是指定--enable-[module]=static的模块为静态编译,其他都是动态编译

总结三点:

1) 如果编译参数中有--enable-mods-shared=all 或者--enable-mods-shared=most,那么所有--enable-[module]都将会以动态模式来编译,除非特别指定--enable-[module]=static 为静态编译 。

2)如果编译参数中有--enable-mods=all 指定所有静态方式的话,还可以用--enable-[module]=shared来动态加载模块。

3)特别注意如果编译参数中既有--enable-mods=all静态编译又有--enable-mods-shared=all动态编译,那么最终会使用动态编译。

官方说是静态编译比动态编译性能要好5%左右,具体没有验证过。

推荐编译安装参数,以下是静态编译所有模块,但保留动态加载选项--enable-so,之后还是可以在配置文件中动态加载自己编译的模块。

./configure --prefix=/app/apache2
--enable-modules=all
--enable-cache=static
--enable-mem-cache=static
--enable-file-cache=static
--enable-disk-cache=static
--enable-ssl=satic
--enable-so

apache编译配置参数:

http://blog.snsgou.com/post-240.html

http://blog.chinaunix.net/uid-20784749-id-1844507.html

关于动态编译和静态编译的比方说明:

好比有两个人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)编译了.

参考:http://httpd.apache.org/docs/2.4/

时间: 2024-10-13 14:47:32

apache 静态编译和动态编译参考的相关文章

Apache静态编译与动态编译详解

Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的“动态”和“静态”两种编译安装方式: 静态编译: 编译的时候,所有的模块自己编译进 httpd 这个文件中 ,启动Apache的时候这些模块就已经加载进来了,可以直接来使用,而不用再 httpd.conf 中在 LoadModule 来加载,只要在 <ifmodule></ifmodule> 中来配置就可以了. 动态编译: 编译的时候,使用e

VC , Linux 静态编译与动态编译 (MD, MT)

首先从Linux下开始讲起,因为Linux编程对程序的理解要清楚一些,相比之下VC就比较容易糊涂. 当动态编译时,你发布的程序体积较小,在运行的时候需要同时提供你用到的dll / so文件. 当静态编译时,你发布的程序体积较大,包含所有符号,运行时不需要其他的 dll / so的支持,可以独立运行. 静态编译的目的是使发布的程序可以独立运行,不依赖于其他*.so,在技术上是把所有依赖的符号打包链接进了目标程序.这时候你会发现编译出来的程序的体积要大一些(Link的速度也会慢一些). 编译过程分为

busybox静态编译及动态编译实践

1. 简介 BusyBox 是一个集成了一百多个最常用linux命令和工具的软件.BusyBox 包含了一些简单的工具,例如ls.cat和echo等等,还包含了一些更大.更复杂的工具,例grep.find.mount以及telnet.有些人将 BusyBox 称为 Linux 工具里的瑞士军刀. 简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令.除此之外,提供了良好的编程框架,用户能够将自己的命令集成到busybox当中.在实际的使用过程中,busybox常常被用

浅谈VB.Net 程序的编译和动态编译

---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译vb.net程序的真正原理. 这篇随笔包含如下几个部分: 1.VS是怎么编译的 2.通过vbc.exe来编译应用程序 3.在代码中通过VBCodeProvider动态编译应用程序 ok,首先来说说vs编译应用程序的方法.其实,vs是通过调用vbc.exe来编译vbnet应用程序的.vs把用户编写的代

.Net Core Razor 预编译,动态编译,混合编译

预编译 预编译是ASP .Net Core的默认方式.在发布时,默认会将系统中的所有Razor视图进行预编译.编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xxx.Views.dll 动态编译 将项目整个配置成动态编译很简单,添加一个配置项目MvcRazorCompileOnPublish,值为false即可 <PropertyGroup> <MvcRazorCompileOnPublish>false</MvcRazorCompile

Apache静态编译与动态编译区别

静态编译: 在编译时,已经把相关模块编译进httpd二进制文件中不用再 httpd.conf 中在 LoadModule 来加载,只要在  <ifmodule></ifmodule> 中来配置就可以了. 动态编译: 编译的时候,使用 enable-module=shared  或者 enable-modules-shared=module 来动态编译. 动态显然就不编译到httpd里面去了,启动的时候根本不会加载这个模块, 而是给你一个 module.so  文件.你想用,就在ht

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

Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的"动态"和"静态"两种编译安装方式. 静态编译: 编译的时候,所有的模块自己编译进  httpd  这个文件中,启动Apache的时候这些模块就已经加载进来了,只要在  <ifmodule></ifmodule>中来配置就可以了. 动态编译: 编译的时候,使用--enable-mods-shared=M

静态编译、动态编译、静态链接库和动态链接库理解

1.静态编译:编译器在编译可执行文件时,把需要用到的对应动态链接库(.so或.ilb)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库. 2.动态编译: 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令.所以其优点一 方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源.缺点一是哪怕是很简单的程序,只用到了链接 库中的一两条命令,也需要附带一个相对庞大的链接库:二是如果其他计算机上没有安装对应的运行库,

静态编译和动态编译的区别【转】

本文转载自:https://segmentfault.com/a/1190000000580216 静态函数库一般扩展名为(.a),这类的函数库通常扩展名为libxxx.a .这类函数库在编译的时候会直接整合到程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数哭的内容:但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译. 动态函数库动态函数库的扩展名一般为(.so),这类函数库通常名为libxxx.s