Postfix の概要 - グローバルアーキテクチャ


上のレベルへ | イントロダクション | 目的と特徴 | グローバルアーキテクチャ | キューマネージメント | セキュリティ

イントロダクション

メールシステムには Sendmail のようになんでもこなす一つの大きな モノリシックプログラムとして実装されているものがあります。 確かに一つの大きなプログラムではデータをシステムの異なる部分で 共有するのが簡単になります。 不幸なことに、一つの大きなプログラムは致命的な失敗も起こしやすく なります。qmail のように固定された順番で他のプログラムを動かし、 使い終ったら捨ててしまうという、プログラムの厳密な階層構造を使う メーラもあります。このアプローチはプロセス生成のオーバーヘッドと プロセス内通信を犠牲にして、よりよい絶縁状態をもたらします。 この余分なコストは仕事を賢い方法で分割することで、許容範囲内に おさめることができます。

Postfix のアーキテクチャ

Postfix は半永続的な、相互に協力するプロセスに基礎を置いています。 これらは特定の親子関係を持たずにお互いに対して特定の仕事をこなします。 この場合も、別々のプロセスがする仕事は一つの大きなプログラムを 使うよりもよい絶縁状態をもたらします。さらに Postfix のアプローチでは、 アドレス書き換えのようなサービスを全ての Postfix コンポーネント プログラムから、一つのアドレス書き換えだけのためにプロセス生成の 負担を招かずに使えるという利点があります。 ところで: Postfix がこのアプローチを使う唯一の(メール)プログラムだと いうつもりはありません。この比較的若い分野であっても、 それ以前に他の誰もしたことがない新しい何かを仕上げることは困難です。

Postfix デーモンプロセスを要求によって動かす常駐マスターサーバとして、 Postfix は実装されています: ネットワークメールメッセージの 送受信をするデーモンプロセス、ローカルにメールを配送するデーモン プロセスなど。これらのプロセスは設定された数まで生成され、 設定された回数だけ再利用され、設定されたアイドル時間を経過すると 消滅します。このアプローチは別々のプロセスのよい絶縁状態を 提供しながらも、徹底的にプロセス生成のオーバーヘッドを減らします。

Postfix は Sendmail を置き換えることを意図しています。このため、 現在存在するインフラストラクチャと互換であることを目指します。 しかし、ローカル配送プログラムのように Postfix システムの多くの部分は inetd ライクな設定ファイルを編集することで容易に 置き換えられます。例えば、シェルにログインすることのなく、 UNIX アカウントさえ持たないかもしれない POP/IMAP ユーザに 低い権限に固定されて走る代わりのローカル配送プログラムを 提供する予定です。

このアーキテクチャの結果として、Postfix はぎりぎり最低限まで 機能を削ることが容易です。停止されたサブシステムは exploit される ことはありません。ファイアウォールはローカル配送を必要としません。 クライアントワークステーションでは、smtp リスナーとローカル配送 サブシステムを停止できます; もしくはクライアントは maildrop ディレクトリをファイルサーバからマウントし、Postifix プロセスを 全く常駐させなくします。

Postfix プロセス間の通信

Postfix システムの核は1ダースほどの半常駐プログラムによって実装されて います。秘匿性の理由から、これらの Postfix プロセスは UNIX ドメインソケットや保護されたディレクトリにある FIFO を通して 通信します。 このような秘匿性にもかかわらず、Postfix プロセスはこの方法で受け取る データを本当に信頼しません; Postfix キューファイルの内容と 全く同じように、それらを単なる噂話として扱います。

Postfix のプロセス間で渡される情報量は制限されています。多くの場合、 Postfix プロセス間で交換される情報はキューファイル名と受信者の リストもしくはいくつかの状態情報だけです。一旦 E メールメッセージが ファイルに保存されると、メール配送プログラムに読まれるまで、 そこに留まります。

Postfix は情報を失うことを避けるために、常に用心しています: 受信を確認する前に全てのデータを flush と fsync() し、エラー状態を 調べるため、全てのシステムコールの結果をチェックします。 このプログラミングスタイルを目新しいと感じる人がいるかもしれませんが、 ここ数年多くの場所で標準になってきているのは確かです。


上のレベルへ | イントロダクション | 目的と特徴 | グローバルアーキテクチャ | キューマネージメント | セキュリティ