mod_macro通过宏定义将虚拟主机中可变参数(如$domain、$docroot)与固定结构分离,适用于5个以上结构一致的站点;需先确认模块加载成功(apachectl -t -D DUMP_MODULES | grep macro输出macro_module),再定义带占位符的并用Use调用,避免注释干扰解析。

用 mod_macro 简化虚拟主机配置,核心是把“变的部分”抽出来当参数,“不变的部分”锁死在宏里。它不适用于两三个站点的小规模配置,但一旦你有 5 个以上结构高度一致的站点(比如 api.xxx.com、admin.xxx.com、blog.xxx.com 全都走同一套 PHP-FPM 规则+相同目录权限),宏就能明显减少出错、提升可维护性。
确认 mod_macro 已正确加载
模块没起来,后面全白搭。先检查它是否真被 Apache 认可:
- 运行 apachectl -t -D DUMP_MODULES | grep macro,应输出 macro_module (shared)
- 若无输出,检查配置中是否写了 LoadModule macro_module modules/mod_macro.so,且该行位置在任何
Use指令之前 - 模块文件路径要对:Debian/Ubuntu 通常是
/usr/lib/apache2/modules/mod_macro.so,RHEL/CentOS 是/usr/lib64/httpd/modules/mod_macro.so - 语法校验通过后,用 systemctl reload apache2(不是 restart)生效,避免中断服务
定义一个带参数的 VirtualHost 宏
别写死域名和路径,用 $变量名 占位。下面是一个兼顾实用性和安全性的基础模板:
<macro vhostbase><virtualhost>
ServerName $domain
DocumentRoot $docroot
ErrorLog $docroot/../logs/$domain-error.log
CustomLog $docroot/../logs/$domain-access.log combined
<directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory></virtualhost></macro>
注意:$domain 和 $docroot 是纯字符串替换,不支持默认值或条件判断;宏名 VHostBase 区分大小写;Use 行末不能加注释,否则解析失败。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
批量调用宏并管理配置位置
把宏定义单独放在一个文件里(比如 /etc/apache2/mods-available/macros.conf),再在主配置中 Include 它,比全堆在 httpd.conf 里更清晰:
- 在
macros.conf中写好<macro>...</macro> - 在
apache2.conf或sites-enabled/000-macros.conf中加入 Include /etc/apache2/mods-available/macros.conf - 然后在站点配置区直接调用:
Use VHostBase www.site1.com /var/www/site1.com/public_html
Use VHostBase www.site2.com /var/www/site2.com/public_html
进阶提示:组合多个宏复用权限块
如果不同站点还需差异化权限(比如有的要禁目录浏览,有的要开 .htaccess),可再定义一个权限宏:
<macro dirallowall><directory>
Require all granted
</directory></macro>
然后在主宏里用 Use DirAllowAll $docroot 替代硬编码的 <directory></directory> 块,实现更高粒度的复用。只要逻辑清晰、变量命名准确,宏嵌套两层以内完全可控。










