検索
連載

qmailのパフォーマンス・チューニング実用qmailサーバ運用・管理術(11)(2/2 ページ)

qmailanalogなどでログを管理していると、ボトルネックが見えてくる。では、ボトルネックを改善するにはどうすればよいのだろうか? 今回は、qmailのさまざまなチューニング方法を紹介する。

Share
Tweet
LINE
Hatena
前のページへ |       

MySQLによるユーザー認証

 次に、ユーザー認証にRDBMSを組み込んでみます。qmailのユーザー認証がそれほどボトルネックを発生しているわけではありません。ただし、大規模なサイトになるとユーザー管理の煩雑さが、メールサーバ運用の足かせになってしまうことは否めません。そこで、/etc/passwdファイルの代わりにデータベースサーバを利用すれば、メールサービスだけでなくほかのさまざまなサービスともユーザー情報を共有できるようになり、ユーザーの登録や利用の一時停止といった作業を簡略化できます。

 以前にvpopmailというツールを紹介しました(第6回 バーチャルドメインにおけるqmailの運用)。さらに、vpopmailはRDBMSであるMySQLサーバをユーザー認証のバックエンドに利用できることも紹介しました(第7回 GUI管理ツールの導入とユーザー情報のSQL化)。vpopmailを紹介した際はバーチャルドメインを実現させることが前提でしたが、実はMySQLを組み込むことでスケーラビリティを兼ね備えさせることも可能となっていたのです。今回は、アドインツールのような大げさな実装をするまでもなく、qmailにパッチを当てるだけで実現する方法を紹介します。

 ここで紹介するのは、MySQLのサポートや関連ツールの開発で定評のあるソフトエージェンシー(http://www.softagency.co.jp/)の拡張パッチです。qmailに対するパッチとcheckpasswordに対するパッチが提供されています。checkpasswordは、qmail-pop3d自体に認証を行う機能がないため、それを補うものです(第2回 POP/IMAPサーバの構築と不正中継対策)。これらのパッチを当てることで、次のことが実現します。

  1. ユーザー認証をMySQLで行える(MySQLを先にするか/etc/passwdを先にするか選択可能)
  2. ユーザーの有効期限を設定でき、一時的なサービス停止もセット可能
  3. Maildir/に保存される全メールの合計サイズをduコマンドで確認し、制限する
  4. APOP対応
  5. 仮想ドメインを実装
  6. locals、rcpthostsに仮想ドメインを自動的に追加可能

 では、パッチファイルに含まれるREADME.mysql.enを参考にインストール手順を見ていきましょう。

qmailの再インストール

 http://www.softagency.co.jp/mysql/qmail.htmlから最新版パッチをダウンロードし、作業ディレクトリで展開します。その後qmailにパッチを当て、すでにインストールされているqmailに上書きインストールします。

# gzip -d qmail-1.03-mysql-0.7.4.patch.gz
# cd qmail-1.03
# patch -p1 < パッチがあるディレクトリ/qmail-1.03-mysql-0.7.4.patch
patching file Makefile
patching file README.mysql.en
patching file TARGETS
patching file auto_du.sh
patching file conf-cc
patching file conf-du
patching file mysql.c
patching file qmail-getpw.c
patching file qmail-local.c
patching file qmail-lspawn.c
patching file qmail-popup.c
patching file qmail-send.c
patching file qmail-smtpd.c
patching file rcpthosts.c
README.mysql.en
# make setup 

checkpasswordの再インストール

 qmailの再インストールと同じように、http://www.softagency.co.jp/mysql/qmail.htmlから最新版パッチをダウンロードし、作業ディレクトリで展開します。その後パッチを当てて上書きインストールを実行します。

# gzip -d checkpassword-0.90-mysql-0.7.3.patch.gz
# cd checkpassword-0.90
# patch -p1 < パッチがあるディレクトリ/checkpassword-0.90-mysql-0.7.3.patch
patching file Makefile
patching file README.mysql.en
patching file auto_qmail.c
patching file auto_qmail.h
patching file checkpassword.c
patching file md5.c
patching file md5.h
patching file mysql.c 

 前回checkpasswordを/usr/local/binにインストールした場合は、今回も同じようにインストールする必要があります。conf-homeファイルを次のように書き換えます。

/usr/local 

 変更後、上書きインストールを続けます。

# make
# make setup check 

設定ファイルの準備

 qmailの設定やcheckpasswordの使用方法は第1回 qmailによるSMTPサーバの構築および第2回 POP/IMAPサーバの構築と不正中継対策と変わりませんが、今回のパッチの適用で次の2つのファイルを準備する必要があります。なお、以下に挙げるファイルの内容は、各自の環境に合わせて変更してください。

mysql_use        yes
server           localhost
port             3306
login            user
password         pass
db               qmail_db
table            usertable
ignore_validity  yes
quota            no
swap_check_order no
/var/qmail/control/sqlserverファイル
mysql_use        yes
server           localhost
port             3306
login            user
password         pass
db               qmail_db
table            usertable
passfield        crypt
userfield        id
uidfield         uid
gidfield         gid
homefield        home
shellfield       shell
apop_passfield   plain
ignore_validity  yes
enc_type         des
swap_check_order no
/etc/checkpassword/sqlserverファイル
mysql_use MySQLの機能を使うかどうか。デフォルトは「yes」
server MySQLサーバ。デフォルトは「localhost」
port MySQLサーバのポート番号。デフォルトはmake時のlibmysqlclientのデフォルト
login MySQLサーバに接続するときのユーザー名
password MySQLサーバに接続するときのパスワード
db 使用するデータベース名。デフォルトは「dbname」
table 使用するテーブル名。デフォルトは「usertable」
ignore_validity ユーザーの有効期限指定の有無。「yes」で機能無効。デフォルトは有効期限を確認
quota Maildir/の容量制限の有無。制限する場合は「yes」を指定。デフォルトは「no」
swap_check_order /etc/passwdファイルとMySQLのどちらを優先するか。「yes」でMySQL優先。デフォルトは「no」
passfield ユーザーのパスワードを保存するフィールドの名前。デフォルトは「crypt」
userfield ユーザーのアカウント名を保存するフィールドの名前。デフォルトは「id」
uidfield ユーザーのUIDを保存するフィールドの名前。デフォルトは「uid」
gidfield ユーザーのGIDを保存するフィールドの名前。デフォルトは「gid」
homefield ユーザーのホームディレクトリを保存するフィールドの名前。デフォルトは「home」
shellfield ユーザーのシェルを保存するフィールドの名前。デフォルトは「shell」
apop_passfield APOP専用。APOPの認証に使用するパスワードを保存したフィールドの名前を指定。デフォルトは「plain」
enc_type ユーザーのパスワードの保存形式。以下から選択可能(ただしAPOP使用時は「plaintext」のみ)。省略時は「des」
 des:DES形式。MySQL SQL文ではENCRYPT()関数で変換できる
 plaintext:平文
 md5:MD5形式
 mysql:MySQLのPASSWORD()関数で変換したもの
両ファイルの設定項目内容

 デフォルト値を利用する場合は、特に項目を付け加える必要はなく省略可能です。

MySQLの準備

 MySQLのインストール方法は、「快速MySQLでデータベースアプリ!」第1回 MySQLインストール完全ガイドを参考にしてください。また、最近のディストリビューションではすでにインストールされている場合もあるので、あらかじめ確認してからインストールを行います。

 次にデータベース/テーブルを用意します。ここでは、データベース:qmail_db、テーブル:usertableとして利用することにします。まず、viなどのエディタで次の内容のファイル(ここではusertable.sql)を作成します。

CREATE TABLE usertable (
  id char(32) DEFAULT '' NOT NULL,
  crypt char(32) binary DEFAULT '' NOT NULL,
  uid int(10) unsigned DEFAULT '65534' NOT NULL,
  gid int(10) unsigned DEFAULT '65534' NOT NULL,
  shell char(100) binary DEFAULT '/noexists' NOT NULL,
  home char(100) binary DEFAULT '/tmp/foofoo/barbar' NOT NULL,
  start_date date DEFAULT '0000-00-00' NOT NULL,
  expire_date date DEFAULT '2030-01-01' NOT NULL,
  active enum('Y','N') DEFAULT 'Y' NOT NULL,
  KEY id (id(10)),
  KEY shell (shell(10)),
  KEY home (home(20)),
  KEY start_date (start_date),
  KEY expire_date (expire_date),
  KEY active (active)
);
usertable.sqlファイル
注:今回のテーブル構成ではAPOPには対応していません

 続いてデータベース:qmail_dbを作成し、このデータベースにusertable.sqlを使ってテーブル:usertableを作成します。

# mysqladmin create qmail_db
# mysql qmail_db < usertable.sql

 データベースおよびテーブルが作成されているか確認しておきます。

画像をクリックすると、テキストで拡大表示します
画像をクリックすると、テキストで拡大表示します

 次に参照権を設定します。ユーザー:user、パスワード:passを使用する場合は以下のようにします。

# mysql
mysql> grant select on qmail_db.* to user@qmailサーバのIPアドレス identified by 'pass';

 ただし、qmailとMySQLを同一のホスト上で動かす場合は次のようにします。

mysql> grant select on qmail_db.* to user@localhost identified by 'pass';
mysql> grant select on qmail_db.* to user@127.0.0.1 identified by 'pass';

 以上でインストール作業は終了です。qmailの起動や使用法は従来どおりですが、いくつか注意が必要になります。うまく機能しない場合は、次の点を確認します。

  • uidとgidに100以上の値が設定されているか
  • 各ユーザーのMaildirディレクトリを、MySQLに登録したhome、uid、gidに合わせてあらかじめ作成しているか
  • qmailが高速に処理できても、MySQLがボトルネックになる可能性があるため、MySQLの最大接続数をqmailの配信プロセス数より多くしているか

 MySQLの最大接続数を上げるには、mysqldにオプション「--set variable=コネクション数」を指定するか、設定ファイルmy.cnfに次の行を追加します。

set-variable = max_connections=コネクション数

 ここではユーザー認証でMySQLを使用するところまでを紹介しましたが、本パッチにはバーチャルドメインを実現する機能も備わっています。興味のある方はパッチ付属のREADME.mysql.enファイルを参考にしてください。

そのほかチューニングと運用の見直し

 ここまでの作業で、相当の配信能力を備えたqmailサーバができあがっていることと思います。しかし、このほかにも見直す点はいくつかあります。

 tcpserverの起動オプション「-c」はすでに紹介しましたが、これ以外にもパフォーマンスに影響を及ぼすオプションの指定があります。まず、IPアドレスの逆引きを行ってホスト名を確認する作業が必要がないのであれば、「-H」オプションを指定します。同時に、ident情報(Identification Protocol)を必要としないのであれば「-R」を指定します。こうすることで、DNSやほかのプロトコルによるボトルネックの発生を抑えられます。

 運用面においては、ディスクの圧迫を防ぐためにユーザーに既読メールをサーバに残さないよう呼び掛けたり、数十Mbytesに及ぶ巨大メールを送信しない(必要な場合は分割して送る)ように啓もうするなどの活動も効果的です。啓もう活動も功を奏さないのであれば、Maildirに対してquota(用量制限)を行うことも最後の手段として検討しましょう。その際は、前述のパッチを使用するか、単純にquota機能だけを追加したいのであればLevent Serinol氏の「quota patch for qmail-local」(http://www.mrjesus.org/patches/qmail-local-quota.patch)を導入します。

 ここまでの方法でも成果が出ないのであれば、最後の手段として「メールサーバの分割」を検討する必要があるでしょう。サブドメインを用意し、サブドメイン分だけのメールサーバを新規に用意します。

まとめと次回予告

 今回は、パフォーマンスチューニングの手法をいくつか紹介しました。数あるMTAの中でもqmailは最速といわれる部類に属していますが、登録ユーザーや送配信メッセージが増加すれば、当然それに比例してサーバの負荷も高くなり、いつかは見直し作業を迫られることになります。

 マシンのスペックやバックボーンの速度がムーアの法則的に増加しても、そうそうシステムの置き換えができるものではありません。いまはノーマルのqmailで正常に動作している場合でも、ここで紹介した方法でパフォーマンスを上げられることを覚えておけば、いつかは役に立てるはずです。

 1年近くにわたりqmailについて紹介してきた本連載も、あと2回を残すのみとなりました。次回は、これまでに紹介し切れなかったケース・バイ・ケースの対応事例をTipsとして取り上げます。もし皆さんのところで困難または特殊な状況に直面した経験がありましたら、ぜひLinux Square会議室にご投稿ください。次回の参考にさせていただきたいと思います。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る