Linux云计算架构-Apache的静态编译和动态编译
1. Apache为什么要分为静态编译和动态编译呢?
Apache拥有4层结构,从核心到外层的module,外层的module可以通过静态和动态的方式与Apache共同工作,所以Apache的安装也分为静态编译和动态编译。
静态编译:编译的时候,所有的模块自己编译进httpd这个文件中,启动Apache时自动加载进去,可直接使用,在httpd.conf中的中来配置即可。
动态编译:编译的时候,使用enable-MODULE=shared或enable_mods_shared=MODULE来进行动态编译,启动apache的时候不会加载这些模块,编译完会给一个module.so文件,可以在httpd.conf中通过loadmodule语句进行加载,此时才算有效。
优缺点比较:
①静态的模块通常在http.conf中用 来配置,动态的要先loadmodule来加载,然后再配置。【静态性能比动态性能好大概5%】
②静态的模块效率高,但配置不灵活,只能重新编译apache。而动态的模块配置较为灵活。
2. 如何进行编译选择?
# apache默认安装的模块
[root@client httpd-2.4.37]# ./configure -help | grep disable
# apache需要enable开启的模块
[root@client httpd-2.4.37]# ./configure -help | grep enable
# 经过博主多次卸载重装apache,终于找到了编译apache的正确方式。
# ./configure --prefix=/usr/local/apache 仅编译安装默认模块
# 此时只有以下四个模块是静态编译的,其他模块在module下都有so文件,可以动态编译进去。
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_worker_module (static)
# 如果用到的模块想要静态编译进去,可以指定值static
# ./configure -help | grep enable 查找可以enable的模块
./configure --prefix=/usr/local/apache --enable-deflate # 这个和不加--enable-deflate一样,都是动态编译的。
./configure --prefix=/usr/local/apache --enable-deflate=static # 静态编译
./configure --prefix=/usr/local/apache --enable-mods-static=deflate # 静态编译
# --enable-mods-shared=deflate 等价于 --enable-deflate # 指定模块动态编译,默认也是动态编译
# --enable-mods-static=deflate # 指定模块静态编译
# --enable-mods-shared=all # 动态编译所有模块
# --enable-mods-static=all # 静态编译所有模块
# --enable-mpms-shared=all # mpm模块动态编译
# --enable-mpms-static= all # mpm模块静态编译
# --enable-deflat=shared # 指定模块动态编译
# --enable-deflate=static # 指定模块静态编译
# 默认动态加载,可以指定值static静态加载
--enable-so # 支持使用DSO动态加载模块,默认静态编译
--enable-ssl # 支持ssl安全认证,默认动态编译
--enable-rewrite # 支持url地址重写,默认动态编译
--enable-deflate # 支持文件压缩传输,默认动态编译
# --disable-alias # 不安装alias
通过以上分析,要动态编译或者静态编译某个模块都可以做到了。
3. 如果某个模块不存在so文件,又不能重新编译apache,该怎么办?
# 如果不存在/usr/local/apache/modules/mod_deflate.so模块文件,可以用以下方式动态编译进去
# 以DSO方式安装-shared
# DSO:Dynamic shared object 动态共享对象 。DSO模块可以在编译服务器之后编译,也可以用Apache扩展工具(apxs)编译并增加
# /usr/local/apache/bin/apxs -c -i -a
# -c:明需要执行编译操作。
# -i:需要执行安装操作,以安装一个或多个动态共享对象到服务器的 modules 目录。
# -a:自动增加一个 LoadModule行到httpd.conf文件中,以激活此模块,如果此行已经存在,启用。
# 模块所在目录:/usr/local/src/httpd-2.4.37/modules/filters/
[root@master ~]# /usr/local/apache/bin/apxs -c -i -a /usr/local/src/httpd-2.4.37/modules/filters/mod_deflate.c
[root@master ~]# ll /usr/local/apache/modules/mod_deflate.so
-rwxr-xr-x. 1 root root 53168 7月 11 18:32 /usr/local/apache/modules/mod_deflate.so
# 有一个报错
[root@master ~]# /usr/local/apache/bin/apachectl -M | grep deflate
httpd: Syntax error on line 107 of /usr/local/apache/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflate
# 修改apache配置文件的关于模块的内容
[root@master ~]# vim /usr/local/apache/conf/httpd.conf
# 107 LoadFile /usr/lib64/libz.so
108 LoadModule deflate_module modules/mod_deflate.so
[root@master ~]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (shared)
# 可以看到,已经将deflate_module模块添加进apache了。
综上,其实对于不是特别大型的网站,动态编译和静态编译区别不大,要什么模块再动态编译进去就行。
学习路上的一些总结,如果有错的,可以评论指出,一起探讨!!!
参考博文:https://blog.csdn.net/weixin_36522099/article/details/107300088