apache的动态编绎和静态编绎

2012年3月16日 发表评论 阅读评论

 Apache HTTP服务器是一个模块化的软件,管理员可以通过选择服务器中包含的模块进行功能增减。模块可以在编译时被静态包含进httpd二进制文件,也可以编译成独立于httpd二进制文件的动态共享对象(DSO)DSO模块可以与服务器一起编译,也可以用Apache扩展工具(apxs)单独编译。

上在是官方手册上所述,具体可以参看官方手册相关的介绍:http://www.361way.com/manapache/dso.html

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

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

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

一般情况下会说,Apache编译安装分:静态编译和动态编译,这只是粗略的说法。

1、静态编译

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

优点:性能高一些。
缺点:缺少灵活性,增加模块时需要重新编译。如:每次对PHP的重新编译,都需要再次编译Apache

2、动态编译

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

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

至于性能方面我没怎么关注, 官方说静态的比动态的在性能方面多5%左右。

动态相对方便一点, 如果你编译完后,发现有些需要的模块你没编译进去(默认编译多少模块呢?你用./configure --help | grep disable查看, 会让你去disable表示默认会编译进去,否者disable有什么用呢?)你可以动态的加载, 只要你有module.so文件。

 

以下是官方给出的优缺点说明:

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

 3、编译示例:
1
、静态编译:
当只需要静态编译module的时候,语法应写成--enable-ssl--enable-ssl=static
例如:
#./configure --prefix=/usr/local/apache2 --enable-ssl[=static]

查看哪些modules被静态编译进apache:
#/usr/local/apache2/bin/httpd -l
Compiled in modules:
  core.c
  mod_ssl.c

2、动态编译:

当只需要动态编译module的时候,语法写成--enable-ssl=shared即可。
#./configure --prefix=/usr/local/apache2 --enable-ssl=shared

查看哪些modules被动态编译进apache:
#ls -l /usr/local/apache2/modules/

-rw-r--r-- 1 root root   8504 Aug 25 14:49 httpd.exp
-rwxr-xr-x 1 root root 806898 Aug  7 13:57 mod_ssl.so

3、静动混合:

当既需要动态又需要动态的时候,语法写成--enable-ssl=static[动态编译] --enable-rewrite=shared[静态编译]
以下为示例:
#./configure --prefix=/usr/local/apache2 --enable-ssl=static --enable-rewite=shared

 

查看httpd可执行的模块:

 [root@TestServer-RHAS-5 /etc]$ cd /usr/sbin

[root@TestServer-RHAS-5 sbin]$ ldd httpd

        linux-gate.so.1 =>  (0x003c3000)

        libm.so.6 => /lib/libm.so.6 (0x00128000)

        libpcre.so.0 => /lib/libpcre.so.0 (0x00311000)

        libselinux.so.1 => /lib/libselinux.so.1 (0x005c2000)

        libaprutil-1.so.0 => /usr/lib/libaprutil-1.so.0 (0x005a1000)

        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00c02000)

        libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x0048c000)

        liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x00cf9000)

        libdb-4.3.so => /lib/libdb-4.3.so (0x00212000)

        libexpat.so.0 => /lib/libexpat.so.0 (0x0087f000)

        libapr-1.so.0 => /usr/lib/libapr-1.so.0 (0x00aff000)

        libpthread.so.0 => /lib/libpthread.so.0 (0x00fa0000)

        libdl.so.2 => /lib/libdl.so.2 (0x006d6000)

        libc.so.6 => /lib/libc.so.6 (0x006da000)

        /lib/ld-linux.so.2 (0x001f6000)

        libsepol.so.1 => /lib/libsepol.so.1 (0x00199000)

        libuuid.so.1 => /lib/libuuid.so.1 (0x008a2000)

        libpq.so.4 => /usr/lib/libpq.so.4 (0x00a0f000)

        libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x0032e000)

        libresolv.so.2 => /lib/libresolv.so.2 (0x00110000)

        libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x00d50000)

        libssl.so.6 => /lib/libssl.so.6 (0x00e67000)

        libcrypto.so.6 => /lib/libcrypto.so.6 (0x008a6000)

        libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x003c4000)

        libnsl.so.1 => /lib/libnsl.so.1 (0x0014f000)

        libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00166000)

        libcom_err.so.2 => /lib/libcom_err.so.2 (0x00f51000)

        libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00a9b000)

        libz.so.1 => /usr/lib/libz.so.1 (0x001df000)

        libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00fca000)

        libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00123000)

        注:ldd命令的使用必须在httpd可执行文件所在的目录执行才会输出可执行模块的结果。
4
、使用区别:

1、动态编译使用:
会生成相关的so文件,例如:

1)、动态加载module,在配置文件里需要加上如下语句:
LoadModule access_module /usr/local/apache2/modules/mod_ssl.so
2)
、使用:
rewriteEngine on
RewriteRule ^/(.*)    http://www.hao123.com  [L,P]

2、静态编译使用:
例如要使用rewrite模块的时候在配置文件里加下这句就可以了:
RewriteEngine on
RewriteRule ^/(.*)    http://www.hao123.com  [L,P]

1、动态编译使用:
会生成相关的so文件,例如:

1)、动态加载module,在配置文件里需要加上如下语句:
LoadModule access_module /usr/local/apache2/modules/mod_ssl.so
2)、使用:
rewriteEngine on
RewriteRule ^/(.*)    http://www.hao123.com  [L,P]

2、静态编译使用:
例如要使用rewrite模块的时候在配置文件里加下这句就可以了:
RewriteEngine on
RewriteRule ^/(.*)    http://www.hao123.com  [L,P]




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: http/html/web 标签:
  1. 本文目前尚无任何评论.