postfix をマルチインスタンス化する

複数ドメインのメール転送を1つの postfix で運用する場合、インバウンドはともかくアウトバウンドの ip アドレスが1つしか指定できないので、どちらか一方の名前解決が正逆不一致になってしまいます。じゃあ postfix プロセスを複数動かせばいいんじゃね? というおはなし。

postmulti(1)Managing multiple Postfix instances on a single host あたりを参考にやっていきます。

とりあえず既存設定を待避しておきます。

# cd /etc
# tar -cpvf ~/170617.postfix.tar ./postfix

それ専用のコマンドがあります。

# postmulti -e init

実行すると main.cf に2行だけ追記されるようです。

# diff -rup ~/postfix /etc/postfix
diff -rup /root/postfix/main.cf /etc/postfix/main.cf
--- /root/postfix/main.cf       2017-04-13 20:10:27.000000000 +0900
+++ /etc/postfix/main.cf        2017-06-17 15:12:49.124969630 +0900
@@ -702,3 +702,5 @@ smtp_tls_session_cache_timeout = 3600s
 #smtpd_tls_loglevel = 1
 #smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_sesscache
 #smtpd_tls_session_cache_timeout = 3600s
+multi_instance_wrapper = ${command_directory}/postmulti -p --
+multi_instance_enable = yes

これも postmulti コマンドで行います。

# postmulti -I <インスタンス名> -G mta -e create

インスタンス名は 'postfix-' で始まる名前にしないと postmulti: fatal: New instance name must start with 'postfix-' とかって怒られます。-G mta は、作成する postfix インスタンスが所属するグループ名を指定します。インスタンスが3つも4つもある時は、グループに対して一括でオペレーション(起動停止等?)ができるようです。

インスタンスを作成すると、指定したインスタンス名のディレクトリが /etc/postfix-XXXX のような形で作成され、中に main.cf と master.cf が置かれています。細かい設定は環境にあわせて適宜編集……なんですが、1つだけ。

master_service_disabled = inet

デフォルトですべての tcp/ip リスナーが無効化されているので、大抵の場合は inet の部分を削除する必要があると思います。

master_service_disabled =

有効化

# postmulti -i <インスタンス名> -e enable

systemctl enable XXX みたいなもんですね。これで systemctl start postfix 等で起動した時に、同時にこのインスタンスも起動するようになります。ちなみにこのコマンドで、作成したインスタンス側の main.cf に以下の1行が追記されます。

multi_instance_enable = yes

単独起動

# postmulti -i <インスタンス名> -p start

状態確認

# postmulti -i <インスタンス名> -p status

単独停止

# postmulti -i <インスタンス名> -p stop

こんな感じですね。最後に postfix 本体の再起動を実行して、作成したインスタンスが同時起動するかを確認します。

# systemctl restart postfix
# postmulti -i <インスタンス名> -p status
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:manimani.cc:multi_instantiation_postfix