POSTFIX-WRAPPER(5) POSTFIX-WRAPPER(5)
名称
postfix-wrapper - Postfix 多实例管理接口
描述
Postfix 从 2.6 版本开始支持多实例管理功能。多个实例可以共享相同的可执行程序和文档文件,
但每个实例都拥有独立的配置目录、队列目录和数据文件目录。
本文档介绍如何通过熟悉的 "postfix start" 等命令管理多个 Postfix 实例,
并详细说明 postfix(1) 命令与多实例管理程序之间的协作接口。
在多实例环境中,默认的 Postfix 实例必须存在。该实例由 config_directory
参数的默认值标识。
基本操作
多实例功能保持向后兼容:当仅运行单个 Postfix 实例时,"postfix start"
等命令的行为与之前版本完全一致。
即使配置了多个实例,您仍可在启动脚本、升级流程等场景中使用相同的 postfix
命令。虽然这些命令需要执行更多操作,但无需改变原有的使用方式。
例如,要启动所有 Postfix 实例,只需执行:
# postfix start
其他 postfix(1) 命令同样适用。如需查看多实例配置中的所有 Postfix 实例状态,
可执行:
# postfix status
该命令会列出多实例配置中所有 Postfix 实例的运行状态。
管理单个实例
要管理特定的 Postfix 实例,需要在 postfix(1) 命令行中指定其配置目录路径:
# postfix -c /path/to/config_directory command
或者通过 MAIL_CONFIG 环境变量指定实例配置目录(-c 命令行选项优先级更高)。
若不指定实例,postfix(1) 命令将对所有 Postfix 实例生效。
启用多实例模式
默认情况下,postfix(1) 命令以单实例模式运行。此模式下命令直接调用
daemon_directory 中的 postfix-script 脚本文件,该脚本包含启动/停止单个实例、
配置升级等操作指令。
在多实例模式下,postfix(1) 命令需要为每个实例执行启动、停止等操作。
这些操作由专门的多实例管理程序协调处理。
启用多实例模式需要修改默认实例的 main.cf 文件:
1) 通过 multi_instance_wrapper 参数指定管理程序路径
2) 在 multi_instance_directories 参数中列出其他实例的配置目录。例如:
/etc/postfix/main.cf:
multi_instance_wrapper = $daemon_directory/postfix-wrapper
multi_instance_directories = /etc/postfix-test
$daemon_directory/postfix-wrapper 是一个基础管理程序实现,包含手动创建实例的说明。
更完善的 postmulti(1) 命令还提供生命周期管理等高级功能。
启用多实例模式后,postfix(1) 命令将调用 $multi_instance_wrapper
而非直接执行 postfix-script。
以下是简单多实例管理程序的实现示例:
#!/bin/sh
: ${command_directory?"请勿直接调用此命令"}
POSTCONF=$command_directory/postconf
POSTFIX=$command_directory/postfix
instance_dirs=`$POSTCONF -h multi_instance_directories |
sed 'y/,/ /'` || exit 1
err=0
for dir in $config_directory $instance_dirs
do
case "$1" in
stop|abort|flush|reload|drain)
test "`$POSTCONF -c $dir -h multi_instance_enable`" \
= yes || continue;;
start)
test "`$POSTCONF -c $dir -h multi_instance_enable`" \
= yes || {
$POSTFIX -c $dir check || err=$?
continue
};;
esac
$POSTFIX -c $dir "$@" || err=$?
done
exit $err
实例级控制
每个 Postfix 实例的 main.cf 文件都包含控制多实例管理程序行为的参数。
"multi_instance_enable = yes" 设置允许管理程序对该实例执行启动/停止等操作。
出于安全考虑,此参数默认值为 "no"。
默认值 "multi_instance_enable = no" 适用于手动测试场景(如 "postfix -c /path/name start")。
管理程序将跳过需要实例运行的命令(如 stop/flush),但仍会执行 check、
set-permissions 等操作。对于禁用的实例,"start" 命令会被替换为 "check",
确保即使实例禁用也能发现问题。
文件维护
Postfix 实例间共享可执行程序、手册等文件,而配置、队列和数据文件则各自独立。
详见下文「非共享文件」列表。
在多实例功能实现前,这些共享文件始终由默认 Postfix 实例维护。
多实例环境下延续此做法:当实例的 config_directory 被列在默认 main.cf 的
multi_instance_directories 参数中时,该实例不会检查或更新共享文件。
因此,必须优先检查和更新默认 Postfix 实例。
接口摘要
• 仅多实例管理程序处理 multi_instance_enable 参数
• 指定 -c 选项或 MAIL_CONFIG 环境变量时,postfix(1) 仅操作单个实例
• multi_instance_directories 非空时,postfix(1) 调用 multi_instance_wrapper
• 对禁用实例跳过需要运行状态的操作(如 stop/reload)
• 禁用实例的 "start" 命令转为 "check" 操作
• 列在 multi_instance_directories 中的实例不维护共享文件
• postdrop(1) 等 set-gid 命令将 multi_instance_directories 追加到
alternate_config_directories 进行合法性校验
• 运行不同版本或独立管理的实例仍需 alternate_config_directories
环境变量
MAIL_CONFIG
存在时强制 postfix(1) 仅操作指定实例。该变量由 -c 选项自动设置,
确保子进程中的 postfix(1) 命令正确执行。
配置参数
以下为参数概要,详见 postconf(5):
multi_instance_directories (空)
非默认 Postfix 实例的配置目录列表。这些实例与默认实例共享程序文件,
并与默认实例同步启动/停止。
multi_instance_wrapper (空)
当 multi_instance_directories 非空时,postfix(1) 调用的管理程序路径。
multi_instance_name (空)
实例的可选名称标识。
multi_instance_group (空)
实例的可选组标识。
multi_instance_enable (no)
是否允许通过多实例管理程序操作本实例。
非共享文件
config_directory (参见 'postconf -d' 输出)
main.cf 和 master.cf 的默认存储位置。
data_directory (参见 'postconf -d' 输出)
缓存、随机数等可写数据文件的存储目录。
queue_directory (参见 'postconf -d' 输出)
Postfix 队列的顶级目录。
参见
postfix(1) Postfix 控制程序
postmulti(1) 完整的多实例管理器
$daemon_directory/postfix-wrapper 基础管理程序
许可
本软件需遵循 Secure Mailer 许可协议分发。
作者
Wietse Venema
IBM T.J. Watson 研究院
美国纽约州约克镇高地 704 号信箱
Wietse Venema
Google 公司
美国纽约州纽约市第八大道 111 号
POSTFIX-WRAPPER(5)