mod_macro需手动启用,通过分层定义可复用宏(如VHostBase、SSLRedirect)实现虚拟主机配置复用,支持参数化组合,但仅限静态参数且须重启生效。`mod_macro` 不是 Apache 默认启用的模块,但它能有效减少大型网站中多个虚拟主机配置的重复代码,尤其适合管理几十个结构相似但路径、后端或头信息略有差异的站点。它不依赖外部脚本,纯静态复用,稳定且兼容所有 Apache 2.4.x 环境。
确认并启用 mod_macro 模块
该模块通常不随 apache 默认安装,需手动加载:
- Linux(Debian/Ubuntu):运行 a2enmod macro,然后重启服务
- CentOS/RHEL:检查 /etc/httpd/conf.modules.d/ 或主配置中是否有 LoadModule macro_module modules/mod_macro.so;若无,添加后执行 httpd -t 验证语法再重启
- 验证是否生效:httpd -M | grep macro 应输出 macro_module (shared)
定义通用虚拟主机宏
把共性逻辑抽成可参数化宏,例如统一监听、日志格式、SSL重定向、Header 设置等:
- 在 /etc/apache2/mods-enabled/macros.conf(或自定义 include 文件)中写:
- ServerName $domain
- DocumentRoot "$docroot"
- ErrorLog ${APACHE_LOG_DIR}/$domain-error.log
- CustomLog ${APACHE_LOG_DIR}/$domain-access.log combined
- Header always set X-Frame-Options "DENY"
- Header always set X-Content-Type-Options "nosniff"
按需组合差异化配置
避免“一个宏打天下”,推荐分层调用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先定义原子宏,如
... 或... - 再组合成业务宏,例如:
VHostBase $domain $path PHPHandler - 实际使用时只需一行:
,或
注意事项与常见避坑点
不是所有重复都适合用宏,重点看是否满足三个条件:结构一致、参数有限、人工维护成本高:
- 不要用宏替代 Include 处理完全不同的站点逻辑
- 宏内不能使用 %{ENV:...} 等运行时变量,只支持静态参数传入
- 宏定义必须放在所有调用之前,建议统一放在独立文件并通过 Include 加载
- 修改宏后必须重启 Apache,不支持热重载










