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)