apache模块加载分静态编译和dso动态加载两种:静态模块编译进httpd二进制,启动即生效,用httpd -l查看;动态模块以.so文件存在,需loadmodule指令加载,依赖静态内置的mod_so,用httpd -m查看已加载模块。
apache 的模块加载方式主要分两种:动态共享对象(dso)和静态编译。核心区别在于模块是否被直接打包进 httpd 二进制文件,以及后续能否灵活启用、禁用或升级。
模块加载机制不同
静态模块在编译时就链接进 httpd 主程序,启动即生效,无需额外配置加载动作。运行 httpd -l 可列出所有静态编译的模块,比如 so_module(必须静态)、core_module 等。
动态模块以 .so 文件形式独立存在(如 mod_rewrite.so),需通过 LoadModule 指令显式加载,再配合 <ifmodule></ifmodule> 块启用功能。运行 httpd -M 可查看当前已加载的所有模块(含静态+动态)。
关键前提:只有 mod_so 被静态编译进核心,Apache 才具备加载 DSO 的能力——这是动态模块工作的基础,不可省略。
编译时控制方式不同
静态模块由 --enable-modules=LIST 或默认行为决定,例如:
-
--enable-modules=all:把所有支持模块静态编译进httpd -
--enable-modules=most:只静态编译常用模块(跳过有构建问题的) - 不指定任何
--enable-*模块参数时,Apache 默认将基本模块(B 类)静态编译
动态模块使用 --enable-mods-shared=LIST 或单模块指定:
-
--enable-mods-shared=all:编译全部模块为.so文件 -
--enable-mods-shared='rewrite headers ssl':仅指定几个模块为 DSO -
--enable-rewrite=shared:单独设置某模块为动态
注意:--enable-so=static(Apache 2.x)或 --enable-module=so(1.x)是启用 DSO 支持的必要开关,不是可选项。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
运维灵活性与性能取舍
静态模块性能略高(官方称约 +5%),因为省去运行时加载和符号解析开销,但代价是每次增删模块都必须重新编译整个 Apache,停机维护成本高。
动态模块牺牲少量启动性能,换来显著运维优势:
- 可在不重启服务的情况下
apachectl graceful重载配置并生效新模块 - 第三方模块可用
apxs工具独立编译安装,无需 Apache 源码树 - 禁用模块只需注释
LoadModule行,无需重编译 - 模块升级只需替换对应
.so文件 + reload 配置
常见管理操作示例
确认当前模块状态:
-
httpd -l:看哪些模块是静态内置的 -
httpd -M:看哪些模块当前已启用(含动态加载的) -
httpd -t -D DUMP_MODULES:等效于-M,更明确语义
添加一个动态模块(如 mod_security):
- 用
apxs -i -a -c mod_security2.c编译安装(假设源码就绪) - 检查
httpd.conf是否自动追加了LoadModule security2_module modules/mod_security2.so - 执行
httpd -t验证语法,再apachectl graceful生效
临时禁用某个动态模块:
- 在
httpd.conf中找到对应LoadModule行,在行首加# - 执行
apachectl graceful即可卸载该模块,无需重启主进程










