arinux

Linux サーバー設定備忘録
ffmpeg-php


ffmpeg-php は、ffmpeg の機能の一部を PHP エクステンションとして利用できるものです。


メモ ffmpeg コンパイル


※ ffmpeg-phpのインストールには ffmpeg 本体が必要で、ffmpeg のコンパイル時に以下を指定する必要があります。

--enable-shared


メモ ffmpeg-php インストール


  1. ffmpeg-php を利用するためには、以下のものが必要です。

    • ffmpeg-0.4.9_pre1 以上
    • php-4.3.0 以上
    • gd-2.0 以上(PHP にバンドルされています)


  2. http://ffmpeg-php.sourceforge.net/ から、「ffmpeg-php-0.6.0.tbz2」 をダウンロードして、「/usr/local/src」 に置きます。


  3. 解凍します。
  4. [root]# cd /usr/local/src
    [root]# tar xjf ffmpeg-php-0.6.0.tbz2 -C /usr/local/src
    


  5. configuration ファイルを作成します。
  6. [root]# cd /usr/local/src/ffmpeg-php-0.6.0
    [root]# phpize
    Configuring for:
    PHP Api Version:         20041225
    


  7. コンフィグ、コンパイル、インストールします。
  8. [root]# ./configure
    [root]# make
    [root]# make install
    Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20060613/
    


  9. php.ini に extension を追加します。
  10. [root]# vi /usr/local/lib/php.ini
    extension_dir="/usr/local/lib/php/extensions/no-debug-non-zts-20060613"
    extension=ffmpeg.so
    


  11. httpd を再起動します。
  12. [root]# /etc/rc.d/init.d/httpd restart
    


  13. 動作確認をします。動作の確認は、/usr/local/src/ffmpeg-php-0.6.0 ディレクトリにある tests と test_ffmpeg.php をドキュメントルートにコピーしてアクセスし、テスト用ファイルのデータが出力されれば正常です。

    • http://10.1.1.15/test_ffmpeg.php にアクセス
    • ffmpeg-php version string: 0.6.0-svn
      ffmpeg-php build date string: Feb 25 2009 10:03:14
      libavcodec build number: 3412480
      libavcodec version number: 3412480
      
      Methods available in class 'ffmpeg_movie':
      __construct
      getduration
      getframecount
      getframerate
      getfilename
      (以下、省略)
      


メモ サンプル・コード


参考サイト: ITpro: ffmpeg-phpで動画のデータを取得しよう


  1. フレームレートを表示
  2. [root]# vi sample01.php
    
    <?php
    
    //dl("ffmpeg." . PHP_SHLIB_SUFFIX); //php.ini に記述していれば extension のロードは不要
    
    $movie_path = '/data/www/doga/movie/SampleMovie.mov';  //画像ファイルのパス
    $movie = new ffmpeg_movie($movie_path);    //インスタンス生成
    
    echo $movie->getFileName();   //ファイル名取得、表示
    echo "<br>";
    echo $movie->getFrameRate();  //フレームレート取得、表示
    
    ?>
    


    • 実行結果(http://10.1.1.15/sample01.php にアクセス)
    • movie/SampleMovie.mov
      30
      


  3. 100フレーム目で切り出した画像を表示
  4. [root]# vi sample02.php
    
    <??php
    
    $movie_path = 'movie/spider-man_3-tsr_h480.mov';  //画像のパス
    $movie = new ffmpeg_movie($movie_path);    //インスタンス生成
    
    $frame = $movie->getFrame(100);            //100フレーム目を取得
    $image = $frame->toGDImage();              //画像データを取得
    
    ob_end_clean();
    header('Content-Type: image/jpeg');
    imageJpeg($image,null,100);
    imageDestroy($image);
    
    ?>
    



ここまで

| arinux | Tools | 15:30 | comments(0) | trackbacks(0) | pookmark |
MySQL (10) - MySQL Cluster (4)


メモ 管理コンソール


ここでは、MySQL Cluster の管理コンソールの操作を説明します。


  1. 起動

  2. 管理コンソールは、管理ノードで以下のように起動します。

     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm>
    


  3. 停止

  4. 管理コンソールを抜ける時は、何かコマンドを実行した後では 「quit」 を入力するとコンソールがハングアップします。よって 「^C(Ctrl を押しながら c を押す)」 で抜けます(MySQL の Bug #39679 で報告されています)。

    ndb_mgm> ^C
    


  5. ヘルプ表示
  6. コマンド一覧は、「?」 または 「help」 で表示されます。
    ndb_mgm> ?
    


    各コマンドの詳しいヘルプは、「? <command>」 または 「help <command>」 で表示されます。

    ndb_mgm> ? show
    


  7. ステータス表示
  8. ndb_mgm> show
    


  9. データノード再起動
  10. ndb_mgm> show
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    ndb_mgm> 2 restart
    Node 2: Node shutdown initiated
    Node 2: Node shutdown completed, restarting, no start.
    Node 2 is being restarted
    
    ndb_mgm> Node 2: Start initiated (version 6.3.20)
    Node 2: Started (version 6.3.20)
    <Enter> を入力
    
    ndb_mgm> show
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    


    • 「Master」 側を restart すると、残った Active のデータノードに 「Master」 が切り替わります。
    • 「restart」 には、以下のオプションがあります。
    -n停止後に start しません。
    -i停止後の start の際に、データノードをイニシャライズされ、もう片方のデータノードをからコピーされます。
    -aGCP(Global Checkpoint)の sync をせずに、強制 stop します。


  11. データノード停止
  12. ndb_mgm> 3 stop
    Node 3: Node shutdown initiated
    Node 3 has shutdown.
    
    ndb_mgm> Node 3: Node shutdown completed.
    


  13. データノード起動

  14. データノードを管理コンソール上で起動すると、以下のエラーが出ますので、該当のデータノード上で 「ndbd」 を起動します。

    ndb_mgm> 3 start
    Start failed.
    *    22: Error
    *        No contact with the process (dead ?).: Permanent error: Application error
    
     データノード
    [root]# /etc/rc.d/initi.d/ndbd start
    ndbd を起動中:
    


  15. バックアップ
  16. ndb_mgm> START BACKUP <backup_id>
    
    例:
    ndb_mgm> START BACKUP 1
    Waiting for completed, this may take several minutes
    Node 3: Backup 1 started from node 1
    Node 3: Backup 1 started from node 1 completed
     StartGCP: 42022 StopGCP: 42025
     #Records: 93196 #LogRecords: 0
     Data: 7431556 bytes Log: 0 bytes
    


    • 「<backup_id>」 には、何回目のバクアップかの数値を指定します。
    • 以下のものが保存されます。
    メタデータすべてのデータベース・テーブルの名前と定義
    テーブル・レコードバックアップしたときのデータベース・テーブルに保存された実際のデータ
    トランザクション・ログデータがデータベースにどのように何時保存されたを記録したシーケンシャルなレコード


    • 実際のバックアップ・データは、「config.ini」 の 「DataDir」 で指定したディレクトリ下の 「BACKUUP」 ディレクトリに保存されます。
    • バックアップ先のディレクトリは、「config.ini」 に 「BackupDataDir」 を指定することで変更可能です。
    • 以下は、保存されるファイルの説明です。
    BACKUP-backup_id.node_id.ctl コントロール情報およびメタデータを含むコントルール ファイルです。
    BACKUP-backup_id-0.node_id.data テーブルレコードを含むデータファイルで、フラグメント毎に保存されます。
    BACKUP-backup_id.node_id.log 実行されたトランザクションのレコードを含むログ ファイルバックアップで保存されたテーブルのトランザクションのみがログの保存されます。



メモ ユーティリティ・コマンド


ここでは、MySQL Cluster のユーティリティ・コマンドの一部を説明します。


  1. ステータス表示(1)

  2. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_mgm -e show
    または
    [root]# /usr/local/mysql/bin/ndb_mgm -e "show"
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20)
    id=5    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    


  3. 特定の ID のステータス表示(1)

  4. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_mgm -e "4 status"
    Connected to Management Server at: localhost:1186
    Node 4: connected (Version 6.3.20)
    


  5. ステータス表示(2)

  6. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_waiter
    Connecting to mgmsrv at localhost
    Node 2: STARTED
    Node 3: STARTED
    
    NDBT_ProgramExit: 0 - OK
    


    • このコマンドは、全てのデータノードのステータスが 「STARTED」 になるまでデフォルトで 120秒間待ち続け、その間、メッセージを表示し続けます。
    • [root]# /usr/local/mysql/bin/ndb_waiter
      Connecting to mgmsrv at localhost
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      (以下、省略)
      


    • 以下のように timeout の時間を指定を指定できます。
      [root]# /usr/local/mysql/bin/ndb_waiter  --timeout=1
      Connecting to mgmsrv at localhost
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      (省略)
      waitNodeState(STARTED, -1) timeout after 8 attempts
      
      NDBT_ProgramExit: 1 - Failed
      



ここまで

| arinux | MySQL | 11:11 | comments(0) | trackbacks(0) | pookmark |
ffmpeg


フリーの動画と音声コンバータである ffmpeg のインストール方法を説明します。


メモ サーバー構築環境


機種DELL PE650
OSCentOS 4.5
kernel2.6.18-92.1.18.el5
glibc2.5-24
ffmpegSVN-r17630



メモ lame(mp3 エンコーダ)インストール


  1. http://lame.sourceforge.net/download.php/ から、
    「lame-398-2.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。

  2. 解凍します。
  3. [root]# cd /usr/local/src
    [root]# tar zxvf lame-398-2.tar.gz
    


  4. コンフィグ、コンパイル、インストールします。
    [root]# ./configure
    [root]# make
    [root]# make install
    



メモ subversion インストール


  1. ffmpeg の最新版のダウンロードのために svn コマンドが必要ですので、subversion をインストールします。
  2. [root]# yum install subversion
    



メモ ffmpeg インストール


  1. ffmpeg のソースをダウンロードします。
  2. [root]# svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
    (省略)
    Checked out external at revision 28738.
    
    Checked out revision 17630.
    


  3. こちらのサイトを参考に、「libavcodec/libmp3lame.c」にパッチを当てます。

  4. コンフィグ、コンパイル、インストールします。
  5. [root]# cd /usr/local/src/ffmpeg
    [root]# ./configure --prefix=/usr/local --enable-libmp3lame --enable-encoder=swf --enable-shared
    --disable-demuxer=v4l --disable-demuxer=v4l2
    [root]# make
    [root]# make install
    
    虫眼鏡 videodev.h に対するエラーの対処


    コンパイル中に、以下のエラーが発生するため、「configure」実行の際、「--disable-demuxer=v4l --disable-demuxer=v4l2」を指定しています。

    /usr/include/linux/videodev.h:56: error: 文法エラー が "ulong" の前にあります
    /usr/include/linux/videodev.h:72: error: 文法エラー が '}' トークンの前にあります
    libavdevice/v4l.c: In function `grab_read_header':
    libavdevice/v4l.c:75: error: storage size of 'tuner' isn't known
    libavdevice/v4l.c:133: error: invalid application of `sizeof' to incomplete type `video_tuner'
    libavdevice/v4l.c:140: error: invalid application of `sizeof' to incomplete type `video_tuner'
    libavdevice/v4l.c:75: 警告: unused variable `tuner'
    make: *** [libavdevice/v4l.o] エラー 1
    



メモ ffmpeg の実行


ここでは、QuickTime の「.mov」ファイルをフラッシュ「.swf」への変換を例にしています。


※ffmpeg のオプションの意味は、こちらに載っています。


  1. 音声のサンプリング値を指定しない場合
  2. [root]# ffmpeg -i ./SampleMovie.mov -acodec libmp3lame sample01.swf
    FFmpeg version SVN-r17630, Copyright (c) 2000-2009 Fabrice Bellard, et al.
    (省略)
    [swf @ 0x894e160]swf does not support that sample rate, choose from (44100, 22050, 11025).
    Could not write header for output file #0 (incorrect codec parameters ?)
    
    虫眼鏡 -ar オプションで、サンプリング周波数の指定が必要です。


  3. 音声をカットする場合
  4. [root]# ffmpeg -i ./SampleMovie.mov -an sample02.swf
    


  5. 音声のサンプリング値を指定
  6. [root]# ffmpeg -i ./SampleMovie.mov -ar 22050 -acodec libmp3lame sample03.swf
    


  7. 変換元の動画ファイルの情報を見る
  8. [root]# ffmpeg -i SampleMovie.mov
    (省略)
    Seems stream 0 codec frame rate differs from container frame rate: 23.98 (2997/125) -> 23.98 (24000/1001)
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'SampleMovie.mov':
      Duration: 00:01:37.15, start: 0.000000, bitrate: 1382 kb/s
        Stream #0.0(eng): Video: h264, yuv420p, 480x228, 23.98 tbr, 23.98 tbn, 23.98 tbc
        Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16
        Stream #0.2(eng): Data: tmcd / 0x64636D74
    At least one output file must be specified
    


  9. ビットレート、フレーム、サイズを指定
  10. [root]# ffmpeg -i ./SampleMovie.mov -b 512k -r 24 -s 480x228 -ar 44100 -acodec libmp3lame sample04.swf
    (省略)
    Output #0, swf, to 'sample04.swf':
        Stream #0.0(eng): Video: flv, yuv420p, 480x228, q=2-31, 512 kb/s, 90k tbn, 24 tbc
        Stream #0.1(eng): Audio: libmp3lame, 44100 Hz, stereo, s16, 64 kb/s
    Stream mapping:
      Stream #0.0 -> #0.0
      Stream #0.1 -> #0.1
    Press [q] to stop encoding
    frame= 2330 fps=108 q=2.0 Lsize=    7004kB time=97.08 bitrate= 591.0kbits/s
    video:6180kB audio:759kB global headers:0kB muxing overhead 0.937022%
    


  11. さらに、音量を倍に指定
  12. [root]# ffmpeg -i ./SampleMovie.mov -b 512k -r 24 -s 480x228 -ar 44100 -vol 512 -acodec libmp3lame sample05.swf
    (省略)
    


  13. HTML編集
  14. [root]# vi /var/www/html/sample05.html
    
    <!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -->
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>ffmpeg TEST</title>
    </head>
    <body topmargin="0" leftmargin="0" bgcolor="#d9d9d9">
    <OBJECT CLASSID="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
     CODEBASE="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=4,0,0,0" 
     WIDTH=480 HEIGHT=228>
    <PARAM NAME=movie VALUE="sample05.swf">
    <PARAM NAME=bgcolor VALUE=#FFFFFF>
    <PARAM NAME=LOOP VALUE=false>
    <PARAM NAME=quality VALUE=high>
    <EMBED SRC="sample05.swf" WIDTH=480 HEIGHT=228 bgcolor=#FFFFFF LOOP=false QUALITY=high
    PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" 
     TYPE="application/x-shockwave-flash" </EMBED>
    </OBJECT>
    </body>
    </html>
    


  15. swf ファイルを DocumentRoot へコピーします。
  16. [root]# cp sample05.swf /var/www/html/.
    


  17. http://<url>/sample05.html へアクセスして、正常に動画が再生されることを確認します。



つづく

| arinux | Tools | 11:44 | comments(0) | trackbacks(0) | pookmark |
MySQL (9) - MySQL Cluster (3)


メモ SQLノード設定


  1. mysql グループと mysql ユーザーを作成します。
  2.  SQLノード
    [root]# groupadd -g 401 mysql
    [root]# useradd -g mysql -u 401 mysql -d /nonexistent -s /sbin/nologin
    


  3. インストールスクリプトを実行します。
  4.  SQLノード
    [root]# cd /usr/local/mysql
    [root]# ./scripts/mysql_install_db --user=mysql
    Installing MySQL system tables...
    OK(以下、省略)
    


  5. オーナーとグループを変更します。
  6.  SQLノード
    [root]# cd /usr/local
    [root]# chown -R root:mysql mysql-cluster-gpl-6.3.20-linux-i686-glibc23
    [root]# cd /usr/local/mysql
    [root]# chown -R mysql data
    


  7. 「~/.bash_profile」 に PATH 変数の設定を追加します。
  8.  SQLノード
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    ENV=$HOME/.bashrc
    USERNAME="root"
    
    #export USERNAME ENV PATH                   #この行はコメントアウト
    export USERNAME ENV                         #この行を追加
    export PATH=$PATH:/usr/local/mysql/bin      #この行を追加
    
    mesg n
    


  9. 「~/.bash_profile」 を実行します。
  10.  SQLノード
    [root]# . ~/.bash_profile
    


  11. もしデータノードとは別のサーバーで SQLノードを動かす場合は、SQLノード側の 「/etc/my.cnf」 を作成します。
  12.  SQLノード
    [root]# vi /etc/my.cnf
    
    #innodb_lock_wait_timeout = 50          # この行はもともとあります
    
    ndbcluster                              # ここから赤字の部分を追加
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysql_cluster]
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysqldump]                             # ここから下の行も、もともとあります
    quick
    


  13. スタートアップ・スクリプトをコピーします。
  14.  SQLノード
    [root]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  15. mysqld を起動します。
  16.  SQLノード
    [root]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  17. 同様に、もう一台のデータノードをセットアップし、mysqld を起動します。

  18. 管理ノードでステータスを確認します。
  19.  管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20)             → これが SQLノード
    id=5    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20)             → これも SQLノード
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 09:50 | comments(0) | trackbacks(0) | pookmark |
MySQL (8) - MySQL Cluster (2)


メモ データノード設定


  1. 「mysql-cluster」 をインストールします。
    http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-6.3/ から、
    「mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。

  2. 「/usr/local」 に解凍します。
  3.  データノード
    [root]# cd /usr/local/src
    [root]# tar zxvf mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz -C /usr/local
    


  4. シンボリックリンクを張ります。
  5.  データノード
    [root]# cd /usr/local
    [root]# ln -s mysql-cluster-gpl-6.3.20-linux-i686-glibc23 mysql
    


  6. my.cnf ファイルを作成します。
     データノード
    [root]# vi /etc/my.cnf
    
    #innodb_lock_wait_timeout = 50          # この行はもともとあります
    
    ndbcluster                              # ここから赤字の部分を追加
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysql_cluster]
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysqldump]                             # ここから下の行も、もともとあります
    quick
    


  7. ポート番号 1186 と 63132 を使用しますので、iptables などで制限している場合には、そのポートを開けます。

  8. 「/usr/local/mysql-cluster」を作成します。
     データノード
    [root]# mkdir /usr/local/mysql-cluster
    


  9. 初回のみイニシャライズのオプションを付けて、ndbd を起動します。
     データノード
    [root]# cd /usr/local/mysql/bin
    [root]# ./ndbd --initial
    [root]# ps -ef | grep ndbd
    root     14749     1  0 16:16 ?        00:00:00 ./ndbd --initial
    root     14750 14749  1 16:16 ?        00:00:00 ./ndbd --initial
    


  10. ndbd のスタートアップ・スクリプトを作成します。
     データノード
    [root]# vi /etc/rc.d/init.d/ndbd
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=ndbd
    path=/usr/local/mysql/bin/ndbd
    conf=/etc/my.cnf
    
    start() {
            echo -n $"Starting $prog: "
            $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  11. パーミッションを設定します。
     データノード
    [root]# chmod 755 /etc/rc.d/init.d/ndbd
    


  12. ndbd を再起動します。
     データノード
    [root]# /etc/rc.d/init.d/ndbd restart
    ndbd を停止中:                                             [  OK  ]
    ndbd を起動中:
    
    [root]# ps -ef | grep ndbd
    root     26148     1  0 11:25 ?        00:00:00 /usr/local/mysql/bin/ndbd
    root     26149 26148 14 11:25 ?        00:00:11 /usr/local/mysql/bin/ndbd
    


  13. 管理ノードでステータスを確認します。
     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    id=3 (not connected, accepting connect from 10.1.1.22)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    


  14. 同様に、もう一台のデータノードをセットアップし、ndbd を起動します。


  15. 管理ノードでステータスを表示し、片方のデータノードが 「Master」 になっていることを確認します。
     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 10:40 | comments(0) | trackbacks(0) | pookmark |
MySQL (7) - MySQL Cluster (1)


メモ サーバー構築環境


用途管理ノードデータノード/SQLノード
機種DELL PE650IBM x336、NEC Express5800
メモリー512MB2GB/台
OSCentOS 5.2
kernel2.6.18-92.el5
glibc2.5-24
mysql5.1.30
mysql-cluster6.3.20



メモ MySQL Cluster の構成


ここでは、以下のように MySQL Cluster を構成します。
MySQL Cluster の構成


  • 点線の部分が、物理的な一台のサーバーを指し、以下の 3台構成にしています。
    • 【10.1.1.11】 管理ノード
    • 【10.1.1.21】 データノードと SQLノード
    • 【10.1.1.22】 データノードと SQLノード
  • 各ノードは、それぞれユニークな id を持ちます。
  • 以下は、各ノードの説明です。


管理ノードクラスターの設定、管理作業を行います。データノードの構成情報も持ちます。クラスターを構築するには、まず最初に管理ノードを起動し、データノード、SQLノードの順に起動します。各データノードや SQLノードのは、自身の起動時に、この管理ノードに対して定義情報を問い合わます。管理ノードの実体は ndb_mgmd というデーモンです。
データノード実態は ndbd です。ndb とは、MySQL のストレージエンジン(MyISAM、InnoDB など)の一つです。ndb が複数のサーバ上で起動している場合、お互いを認識して同期します。クライアントからは、単一ノードとして見えます(つまり、クラスターとして動きます)。テーブルは、このデータノードに格納されます。
SQLノードndb ストレージエンジンを使用した MySQL サーバー。クラスター化されたデータノードにアクセスします。SQL ノードは、実際は単にクラスターデータにアクセスするアプリケーションを意味します。接続方法は、他のストレージエンジンを使用する場合と同じで、クライアントからの接続ポートはデフォルト 3306 を使用します。mysqld を起動する際は、「--ndbcluster」 オプションが必要、また table 作成の際も 「engine=ndbcluster」 を付加する必要があります。



メモ 管理ノード設定


  1. 「mysql-cluster」 をインストールします。
    http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-6.3/ から、
    「mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。

  2. 「/usr/local」 に解凍します。
  3.  管理ノード
    [root]# cd /usr/local/src
    [root]# tar zxvf mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz -C /usr/local
    


  4. シンボリックリンクを張ります。
  5.  管理ノード
    [root]# cd /usr/local
    [root]# ln -s mysql-cluster-gpl-6.3.20-linux-i686-glibc23 mysql
    


  6. クラスターのコンフィグ・ファイルを作成します。
  7.  管理ノード
    [root]# mkdir /usr/local/mysql-cluster
    [root]# cp /usr/local/mysql/support-files/ndb-config-2-node.ini /usr/local/mysql-cluster/config.ini
    [root]# vi /usr/local/mysql-cluster/config.ini
    
    [ndbd default]         #データノード(ndb)が参照する値です。
    NoOfReplicas= 2
    MaxNoOfConcurrentOperations= 10000
    DataMemory= 80M
    IndexMemory= 24M
    TimeBetweenWatchDogCheck= 30000
    DataDir= /usr/local/mysql-cluster
    MaxNoOfOrderedIndexes= 512
    
    [ndb_mgmd default]     #管理ノード(ndb_mgmd)が参照する値です。
    DataDir= /usr/local/mysql-cluster
    
    [ndb_mgmd]
    Id=1
    HostName= 10.1.1.11
    
    [ndbd]
    Id= 2
    HostName= 10.1.1.21
    
    [ndbd]
    Id= 3
    HostName= 10.1.1.22
    
    # TCP/IP Connections     #データノード同士を private LAN で直結する場合に追加。
    [TCP]
    NodeId1=2
    NodeId2=3
    HostName1=192.168.1.2
    HostName2=192.168.1.3
    
    [mysqld]
    Id= 4
    HostName= 10.1.1.21
    
    [mysqld]
    Id= 5
    HostName= 10.1.1.22
    
    [mysqld]
    Id= 6
    
    [mysqld]
    Id= 7
    
    # choose an unused port number
    # in this configuration 63132, 63133, and 63134
    # will be used
    [tcp default]
    PortNumber= 63132
    
    • NoOfReplicas
      • レプリケーション(複製)の数。1〜4 のいずれかを指定します。通常は 「2」 を指定します。「1」 を指定すると複製なしとなり、冗長性がなくなります。データノードは、お互いの複製を持ち合うためにノードグループを形成します。

      • ノードグループに属するデータノードの数は、NoOfReplicas の値と同じです。NoOfReplicas が 2、データノードが 2つの場合は、ノードグループは 1つになります。

      • MySQL Cluster データノードのレプリケーション


      • NoOfReplicas が 2、データノードの id が 2,3,4,5 の 4つの場合は、ノードグループ0 に id 2,3、ノードグループ1 に 4,5 のように、id の小さいものから順にノードグループを形成します。

      • MySQL Cluster データノードのレプリケーション


    • id
      • ノードのアドレスとして使用されるユニークな ID です。1〜63 までの整数で指定します。
    • [TCP]
      • データノード間をプライベートLAN で直結する場合に、各データノードの ID と IPアドレスを指定します。
      • 「NodeIdN」 と 「HostNameN」 の 「N」 の値は、同じ番号であれば、同じデータノードを指します。
      • 「NodeId」 には、該当のデータノードに指定した 「Id」 と同じ番号を指定します。
      • 「HostName」 には、該当のデータノードの IPアドレスを指定します。


  8. ポート番号 1186 を使用しますので、iptables などで制限している場合には、そのポートを開けます。

  9. ndb_mgmd
  10. のスタートアップ・スクリプトを作成します。
     管理ノード
    [root]# vi /etc/rc.d/init.d/ndb_mgmd
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=ndb_mgmd
    path=/usr/local/mysql/bin/ndb_mgmd
    conf=/usr/local/mysql-cluster/config.ini
    
    start() {
            echo -n $"Starting $prog: "
            $path -d -f $conf
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  11. ndb_mgmd を起動します。
  12.  管理ノード
    [root]# /etc/rc.d/init.d/ndb_mgmd start
    ndb_mgmd を起動中:
    


  13. 管理コンソールを起動します。
  14.  管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm>
    


  15. 現在のクラスターの情報を表示します。
     管理ノード
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2 (not connected, accepting connect from 10.1.1.21)
    id=3 (not connected, accepting connect from 10.1.1.22)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 10:17 | comments(1) | trackbacks(0) | pookmark |
MySQL (6) - virtual_alias_maps, virtual_alias_domains


メモ バーチャルドメインによるメール転送


  1. 以下の図のように、自分自身とは違うドメイン宛のメールを受信した際に、エイリアス先のアドレスへ転送します。

  2. バーチャルドメインによるメール転送


  3. この例では、「examples.com」ドメインに対する MX レコードが、「mail.arinux.net」であると仮定しています。
  4. [mail]# dig examples.com MX
    ;; ANSWER SECTION:
    examples.com.           86400   IN      MX      10 mail.arinux.net.
    


  5. 自分自身とは違うドメイン宛のメールを実際のメールサーバーに届けるためには、そのドメインを「virtual_alias_domains」に記述しておきます。ここに書かれていないドメイン宛のメールは、宛先不明として処理されます。
  6. main.cf
    virtual_alias_domains = hash:/usr/local/etc/postfix/valias_domains
    
    valias_domains
    examples.com anything
    


  7. 実際の転送先は、「virtual_alias_maps」に記述します。
    main.cf
    virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_alias_maps
    
    valias_alias_maps
    ari@examples.com ari@mailserver.jp
    
    虫眼鏡 この場合は、以下のように各ファイルを DB化して使用します。


    [mail]# postmap /usr/local/etc/postfix/virtual_alias_domains
    [mail]# postmap /usr/local/etc/postfix/virtual_alias_maps
    


  8. これらの情報を、MySQL DB へ登録して、そこから読み込みます。



メモ MySQL への virtual_alias_maps, virtual_alias_domains の登録


※ 以下の操作は、全てマスターで実施します。


  1. mysql に root でログインします。
  2. [master]# mysql -u root -p
    Enter password:
    


  3. 「virtual_alias」用の DB を作成します。
  4. mysql> CREATE DATABASE valias;
    Query OK, 1 row affected (0.00 sec)
    


  5. DB が作成されたことを確認します。
  6. mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | usersdb            |
    | mysql              |
    | repldb             |
    | test               |
    | valias             |
    +--------------------+
    5 rows in set (0.00 sec)
    


  7. ローカルから DB へ接続するためのユーザーを作成します。このユーザーには、全ての権限を与えます。
  8. mysql> GRANT ALL PRIVILEGES ON valias.* TO  vaadmin@localhost IDENTIFIED BY '3joTz_Csm7wf';
    Query OK, 0 rows affected (0.00 sec)
    


  9. クライアントから DB へ接続するためのユーザーを作成します。このユーザーには、SELECT 権限のみ与えます。
  10. mysql> GRANT SELECT ON valias.* TO  vauser@'mail.arinux.net' IDENTIFIED BY 'w7f}jTeq4zNe';
    Query OK, 0 rows affected (0.00 sec)
    


  11. ユーザ情報を反映します。
  12. mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  13. ユーザーが作成されたことを確認します。
  14. mysql> SELECT * FROM mysql.db ¥G
    (以下、省略)
    mysql> SELECT * FROM mysql.user ¥G
    (以下、省略)
    mysql> SHOW GRANTS for vauser@'mail.arinux.net';
    +----------------------------------------------------------------------------------+
    | Grants for cwuser@test15.arinux.net                                              |
    +----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'vauser'@'mail.arinux.net' IDENTIFIED BY PASSWORD
     '*F71855E2C14BA3F48906F7B0AAFB99F172020C19'                                       |
    | GRANT SELECT ON `valias`.* TO 'vauser'@'mail.arinux.net'                         |
    +----------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    


  15. valiasmap テーブルを作成します。
  16. 青い旗 以下をコピーして、mysql> プロンプトで貼り付ければ入力できます。
    CREATE TABLE valiasmap (
      valias_id int(11) NOT NULL auto_increment primary key,
      status char(1) DEFAULT 'A',
      mail varchar(80) DEFAULT '' NOT NULL,
      domain varchar(50) DEFAULT '' NOT NULL,
      alias varchar(80) DEFAULT '' NOT NULL
    );
    
    mysql> CREATE TABLE valiasmap (
        ->   valias_id int(11) NOT NULL auto_increment primary key,
        ->   status char(1) DEFAULT 'A',
        ->   mail varchar(80) DEFAULT '' NOT NULL,
        ->   domain varchar(50) DEFAULT '' NOT NULL,
        ->   alias varchar(80) DEFAULT '' NOT NULL
        -> );
    Query OK, 0 rows affected (0.00 sec)
    


  17. valiasmap テーブルが作成されたことを確認します。
  18. mysql> SHOW TABLES;
    +------------------+
    | Tables_in_valias |
    +------------------+
    | valiasmap        |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> SHOW FIELDS FROM valiasmap;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | valias_id | int(11)     | NO   | PRI | NULL    | auto_increment |
    | status    | char(1)     | YES  |     | A       |                |
    | mail      | varchar(80) | NO   |     |         |                |
    | domain    | varchar(50) | NO   |     |         |                |
    | alias     | varchar(80) | NO   |     |         |                |
    +-----------+-------------+------+-----+---------+----------------+
    5 rows in set (0.00 sec)
    


  19. valiasmap にデータを追加します。
  20. mysql> INSERT INTO valiasmap VALUES (1,'A','ari@examples.com','examples.com','ari@mailserver.jp');
    Query OK, 1 row affected (0.00 sec)
    


  21. 追加されたことを確認します。
  22. mysql> SELECT * FROM valiasmap;
    +-----------+--------+------------------+--------------+--------------------+
    | valias_id | status | mail             | domain       | alias              |
    +-----------+--------+------------------+--------------+--------------------+
    |         1 | A      | ari@examples.com | examples.com | ari@mailserver.jp  |
    +-----------+--------+------------------+--------------+--------------------+
    1 rows in set (0.00 sec)
    


  23. ログアウトします。
  24. mysql> ¥q
    Bye
    
    [master]#
    



メモ virtual_alias_maps, virtual_alias_domains の設定


  1. main.cf に以下を追加します。
  2. [mail]# vi /usr/local/etc/postfix/main.cf
    
    virtual_alias_domains = mysql:/usr/local/etc/postfix/mysql-alias_domains.cf
    virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias_maps.cf
    


  3. 「mysql-alias_domains.cf」を作成します。
  4. [mail]# vi /usr/local/etc/postfix/main.cf/mysql-alias_domains.cf
    
    hosts = slave01.arinux.net slave02.arinux.net   #スペースで区切って複数指定可
    user = vauser
    password = w7f}jTeq4zNe
    dbname = valias
    query = SELECT domain FROM valiasmap WHERE mail='%s' AND status='A'
    


  5. 「mysql-alias_maps.cf」を作成します。
  6. [mail]# vi /usr/local/etc/postfix/main.cf/mysql-alias_maps.cf
    
    hosts = slave01.arinux.net slave02.arinux.net   #スペースで区切って複数指定可
    user = vauser
    password = w7f}jTeq4zNe
    dbname = valias
    query = SELECT alias FROM valiasmap WHERE mail='%s' AND status='A'
    


  7. postfix を再起動します。
  8. [mail]# /etc/rc.d/init.d/postfix restart
    Shutting down postfix:                                     [  OK  ]
    Starting postfix:                                          [  OK  ]
    


  9. 期待通りに値が引けるかをテストします。
  10. [mail]# postmap -q "ari@examples.com" mysql:/usr/local/etc/postfix/mysql-alias_domains.cf
    examples.com
    
    [mail]# postmap -q "ari@examples.com" mysql:/usr/local/etc/postfix/mysql-alias_maps.cf
    ari@mailserver.jp
    


  11. テストメールを送信します。
  12. [mail]# echo "valias test 201" | mail -s "test 201" ari@examples.com
    


  13. 転送先に届いたかを確認します。



つづく

| arinux | MySQL | 10:00 | comments(0) | trackbacks(0) | pookmark |
Postfix + Dovecot + SMTP-auth


メモ SMTP-Auth 設定


  1. postfix は、以下のように SASL をサポートするように make ファイルを作成して、コンパイルする必要があります。
  2. [mail]# make makefiles CCARGS='-DHAS_MYSQL -DUSE_SASL_AUTH -DDEF_SASL_SERVER=¥"dovecot¥" 
    -I/usr/local/include -I/usr/local/mysql/include -DDEF_CONFIG_DIR=¥"/usr/local/etc/postfix¥"' 
    AUXLIBS="-L/usr/local/mysql/lib -L/usr/local/lib -lmysqlclient -lm -lz"
    
    虫眼鏡 SASL を指定せずにコンパイルした環境で、AMTP-Auth を利用しようとすると、以下のエラーが記録されます。


    Aug 21 15:50:37 mail-mst postfix/smtpd[20877]: warning: smtpd_sasl_auth_enable is true,
    but SASL support is not compiled in
    


  3. main.cf に、以下を追加します。
  4. smtpd_sasl_security_options = noanonymous
    smtpd_sasl_auth_enable = yes
    smtpd_recipient_restrictions =
            permit_mynetworks
            permit_sasl_authenticated
            reject_unauth_destination
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = /usr/local/var/run/dovecot/auth-client
    


  5. dovecot.conf に、以下を追加します。
  6. auth default {
    (省略)
      socket listen {
        client {
          # The client socket is generally safe to export to everyone. Typical use
          # is to export it to your SMTP server so it can do SMTP AUTH lookups
          # using it.
          #path = /var/run/dovecot/auth-client
          path = /usr/local/var/run/dovecot/auth-client
          mode = 0660
          user = postfix
          group = postfix
        }
      }
    }
    


  7. postfix と dovecot を再起動します。
    [mail]# /etc/rc.d/init.d/postfix restart
    Shutting down postfix:                                     [  OK  ]
    Starting postfix:                                          [  OK  ]
    
    [mail]#  /etc/rc.d/init.d/dovecot restart
    dovecot を停止中:                                          [  OK  ]
    dovecot を起動中:
    


  8. メール・クライアントから送信テストをします。メール・クライアントのメールボックスを以下のように設定します(ここでは Becky! を例にしています)。
    Becky! SMTP認証 PLAIN


  9. SMTP 認証が行われていれば、maillog に以下のように記録されます。
    Jan 26 13:39:15 mail postfix/smtpd[14496]: 2D3B084D78: client=test15.arinux.net[10.1.1.15],
    sasl_method=PLAIN, sasl_username=muser
    



メモ CRAM-MD5 利用


パスワードに CRAM-MD5 を使用する場合は、以下のように設定します。


  1. CRAM-MD5 を生成します。
    [root]# /usr/local/sbin/dovecotpw
    Enter new password: muserpasswd
    Retype new password: muserpasswd
    {HMAC-MD5}af2498d0f17c7e150959c71824f5fcae43bb5f10095e8ceaa8b3ae4ff7002cbe
    


  2. マスターDB の mysql にログインして、パスワードを入れ替えます。
    [master]# mysql -u myadmin -p
    Enter password:
    


  3. user テーブルの password の Type を確認します。
    mysql> show fields from user;
    +------------+-------------+------+-----+---------------+----------------+
    | Field      | Type        | Null | Key | Default       | Extra          |
    +------------+-------------+------+-----+---------------+----------------+
    | user_id    | int(11)     | NO   | PRI | NULL          | auto_increment |
    | user_name  | varchar(50) | NO   |     |               |                |
    | realname   | varchar(32) | NO   |     |               |                |
    | shell      | varchar(20) | NO   |     | /sbin/nologin |                |
    | password   | varchar(50) | NO   |     | NULL          |                |
    (以下省略)
    


  4. password フィールドの桁数を増やします。
    mysql> ALTER TABLE user MODIFY password varchar(80) NOT NULL;
    


  5. password を更新します。
    mysql> update user set password="{HMAC-MD5}af2498d0f17c7e150959c71824f5fcae43b
    b5f10095e8ceaa8b3ae4ff7002cbe" where user_id="2";
    


  6. 更新されたかを確認します。
    mysql> SELECT password from user where user_id="2";
    +----------------------------------------------------------------------------+
    | password                                                                   |
    +----------------------------------------------------------------------------+
    | {HMAC-MD5}af2498d0f17c7e150959c71824f5fcae43bb5f10095e8ceaa8b3ae4ff7002cbe |
    +----------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    


  7. mysql を抜けます。
    mysql> ¥q
    


  8. dovecot.conf に、以下の赤字の部分を追加します。
    auth default {
      mechanisms = plain cram-md5
    (以下省略)
    


  9. dovecot を再起動します。
    [mail]#  /etc/rc.d/init.d/dovecot restart
    dovecot を停止中:                                          [  OK  ]
    dovecot を起動中:
    


  10. メール・クライアントから送信テストをします。メール・クライアントのメールボックスを以下のように設定します(ここでは Becky! を例にしています)。
    Becky! SMTP認証 CRAM-MD5


  11. SMTP 認証が行われていれば、maillog に以下のように記録されます。
    Jan 26 14:20:54 mail postfix/smtpd[14649]: 9F8A384D78: client=test15.arinux.net[10.1.1.15],
    sasl_method=CRAM-MD5, sasl_username=muser
    



ここまで

| arinux | Postfix | 16:49 | comments(0) | trackbacks(0) | pookmark |
MySQL (5) - メールアカウント管理 (2)


メモ Dovecot のインストール、設定


  1. http://www.dovecot.org/download.html から、
    「dovecot-1.1.7.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. 解凍します。
    [mail]# cd /usr/local/src
    [mail]# tar zxvf dovecot-1.1.7.tar.gz
    


  3. 「dovecot」 ユーザーとグループを作成します(ログインさせないようにします)。
    [mail]# groupadd dovecot
    [mail]# useradd -g dovecot -d /dev/null -s /sbin/nologin dovecot
    


  4. コンフィグします(prefix の default は /usr/local です)。
    [mail]# ./configure --with-sql --with-mysql
    
    虫眼鏡 SSL を使用する場合


    pops や imaps を利用する場合は、以下のように指定して、コンフィグします。なお、「openssl」 「openssl-devel」 パッケージがインストールされている必要があります。

    [mail]# ./configure --with-sql --with-mysql --with-ssl=openssl
    
  5. コンパイル、インストールします。
    [mail]# make
    [mail]# make install
    


  6. 「/usr/local/etc」 以下のコンフィグファイルを 「/usr/local/etc/dovecot」 に移動します。
    [mail]# cd /usr/local/etc
    [mail]# mkdir dovecot
    [mail]# mv dovecot-*.conf dovecot/.
    


  7. dovecot.conf を編集します。
    [mail]# cd /usr/local/etc/dovecot
    [mail]# cp dovecot-example.conf dovecot.conf
    [mail]# vi dovecot.conf
    
    protocols = pop3 imap
    listen = *
    disable_plaintext_auth = no
    log_path = /var/log/dovecot.log
    log_timestamp = "%b %d %H:%M:%S "
    syslog_facility = mail
    ssl_disable = yes
    mail_location = maildir:~/Maildir
    protocol imap {
    }
    protocol pop3 {
      pop3_uidl_format = %u
    }
    protocol lda {
      postmaster_address = postmaster@mail.arinux.net
    }
    auth_debug = no
    auth default {
      mechanisms = plain
      passdb sql {
        args = /usr/local/etc/dovecot/dovecot-mysql.conf
      }
      userdb sql {
        args = /usr/local/etc/dovecot/dovecot-mysql.conf
      }
      user = root
    }
    dict {
    }
    plugin {
    }
    


  8. dovecot-mysql.conf を編集します。
    [mail]# cd /usr/local/etc/dovecot
    [mail]# cp dovecot-sql-example.conf dovecot-mysql.conf
    [mail]# vi dovecot-mysql.conf
    
    driver = mysql
    connect = host=slave01.arinux.net dbname=myusers user=cwuser password=n,V0dX6kjgcd
    default_pass_scheme = MD5
    password_query = SELECT password FROM user WHERE user_name = '%n' and status = 'A' and user.shost = 'mail.arinux.net'
    user_query = SELECT homedir as home, uid, gid FROM user WHERE user_name = '%n'
    
    虫眼鏡 複数のホストを指定する場合


    指定したホストに接続できない場合に、別のホストに接続させることができます。以下は、2つの host を指定した例です(3つ以上指定したテストはしておりません)。

    connect = host=slave01.arinux.net host=localhost dbname=myusers user=cwuser password=n,V0dX6kjgcd
    


  9. スタートアップ・スクリプトを作成します。
    [mail]# vi /etc/rc.d/init.d/dovecot
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=dovecot
    path=/usr/local/sbin/dovecot
    conf=/usr/local/etc/dovecot/dovecot.conf
    
    start() {
            echo -n $"Starting $prog: "
            $path -c $conf
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  10. パーミッションを変更します。
    [mail]# chmod 755 dovecot
    


  11. dovecot を起動します。
    [mail]# /etc/rc.d/init.d/dovecot start
    dovecot を起動中:
    


  12. telnet でログイン認証のテストをします。
    [mail]# telnet localtest 110
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    +OK Dovecot ready.
    user muser
    +OK
    pass muserpasswd
    +OK Logged in.
    quit
    +OK Logging out.
    Connection closed by foreign host.
    [mail]#
    


  13. メールクライアントを使用して、メール受信ができることを確認します。



つづく

| arinux | MySQL | 17:04 | comments(0) | trackbacks(0) | pookmark |
MySQL (4) - メールアカウント管理 (1)


メールアカウントの認証の際に、MySQL DB を参照させます。POP/IMAP 及び SASL サーバーとして Dovecot を使用します。


※ ここでは、メールサーバーのホスト名を 「mail.arinux.net」 としています。



メモ テスト環境


機種DELL PE750
OSCentOS 5.2
kernel2.6.18-92.1.18.el5
glibc2.5-24
MySQL5.0.67
Postfix2.5.5
Dovecot1.1.7



メモ DB接続ユーザーとデータ追加


※ 以下の操作は、全てマスターで実施します。


  1. openssl を使用して MD5 パスワードを作成します。
    [master]# openssl passwd -1
    Password: muserpasswd
    Verifying - Password: muserpasswd
    $1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1
    


  2. MySQL にログインします。
    [master]# mysql -u root -p
    Enter password: 
    


  3. メールサーバーから DB へ接続するためのユーザーを作成します。このユーザーには、SELECT 権限のみ与えます。
    mysql> GRANT SELECT ON usersdb.* TO  cwuser@'mail.arinux.net' IDENTIFIED BY 'n,V0dX6kjgcd';
    Query OK, 0 rows affected (0.00 sec)
    


  4. ユーザ情報を反映します。
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  5. ユーザーが作成されたことを確認します。
    mysql> SELECT * FROM mysql.db ¥G
    (以下、省略)
    mysql> SELECT * FROM mysql.user ¥G
    (以下、省略)
    mysql> SHOW GRANTS for cwuser@'mail.arinux.net';
    +----------------------------------------------------------------------------------+
    | Grants for cwuser@test15.arinux.net                                              |
    +----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'cwuser'@'mail.arinux.net' IDENTIFIED BY PASSWORD
     '*69B3D5081425557A449413DD0FBD59FBE30CC1FF'                                       |
    | GRANT SELECT ON `usersdb`.* TO 'cwuser'@'mail.arinux.net'                     |
    +----------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    


  6. user テーブルにデータを追加します。
    mysql> use usersdb;
    mysql> INSERT INTO user VALUES (2,'muser','Muser','/sbin/nologin','$1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1',
    'A',1002,511,'/home/muser', '14194', '0', '0', '7', '-1', '-1', 'mail.arinux.net');
    Query OK, 1 row affected (0.00 sec)
    


  7. 追加されたことを確認します。
    mysql> select * from user where user_id='2'¥G
    *************************** 1. row ***************************
       user_id: 2
     user_name: muser
      realname: Muser
         shell: /sbin/nologin
      password: $1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1
        status: A
           uid: 1002
           gid: 511
       homedir: /home/muser
    lastchange: 14194
           min: 0
           max: 0
          warn: 7
         inact: -1
        expire: -1
         shost: mail.arinux.net
    1 row in set (0.00 sec)
    




メモ メールサーバーへの nss-mysql のインストール


    MySQL (3) - passwd 管理 (2) を参考に、メールサーバー上に nss-mysql をインストールします。



メモ Postfix のインストール


※ 以下の操作は、全てメールサーバー上で実施します。


  1. http://mirror.postfix.jp/postfix-release/index.html から、
    「postfix-2.5.5.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. 解凍します。
    [mail]# cd /usr/local/src
    [mail]# tar zxvf postfix-2.5.5.tar.gz
    


  3. sendmail 関連のコマンドを rename します。
    [mail]# mv /usr/sbin/sendmail /usr/sbin/sendmail.org
    [mail]# mv /usr/bin/newaliases /usr/bin/newaliases.org
    [mail]# mv /usr/bin/mailq /usr/bin/mailq.org
    


  4. sendmail プロセスを停止し、boot 時に自動起動しないようにします。
    [mail]# /etc/rc.d/init.d/sendmail stop
    (停止しない場合は、「killall sendmail」 を実行)
    [mail]# chkconfig sendmail off
    [mail]# chkconfig --list sendmail
    sendmail        0:off   1:off   2:off   3:off   4:off   5:off   6:off
    


  5. postfix ユーザーと、postfix 及び postdrop グループを作成します。postfix ユーザーはログインさせないようにします。
    [mail]# groupadd postfix
    [mail]# groupadd postdrop
    [mail]# useradd -g postfix -d /dev/null -s /sbin/nologin postfix
    


  6. Makefile を作成します。
    [mail]# cd /usr/local/src/postfix-2.5.5
    [mail]# make makefiles CCARGS='-DHAS_MYSQL -DUSE_SASL_AUTH -DDEF_SASL_SERVER=¥"dovecot¥" 
    -I/usr/local/include -I/usr/local/mysql/include -DDEF_CONFIG_DIR=¥"/usr/local/etc/postfix¥"' 
    AUXLIBS="-L/usr/local/mysql/lib -L/usr/local/lib -lmysqlclient -lm -lz"
    
    虫眼鏡 「No <db.h> include file found.」


    このエラーが出る場合は、「db4-devel」 パッケージをインストールしてから、再度 Makefile 作成を実行します。

    [mail]# yum install db4-devel
    
    虫眼鏡 SMTPS 利用の場合


    SMTPS を利用する場合は、以下のように ssl に関するパラメータを追加します。

    [mail]# make makefiles CCARGS='-DHAS_MYSQL -DUSE_SASL_AUTH -DDEF_SASL_SERVER=¥"dovecot¥"
    -I/usr/local/include -I/usr/local/mysql/include -DDEF_CONFIG_DIR=¥"/usr/local/etc/postfix¥"
    -DUSE_TLS -I/usr/local/src/openssl-0.9.7m/include/openssl'
    AUXLIBS="-L/usr/local/mysql/lib -L/usr/local/lib -lmysqlclient -lm -lz  -lssl -lcrypto"
    


  7. コンパイル、インストールを実施します。
    [mail]# make
    [mail]# make install
    (省略)
    install_root: [/] <Enter>
    tempdir: [/usr/local/src/postfix-2.5.1] <Enter>
    config_directory: [/usr/local/etc/postfix] <Enter>
    command_directory: [/usr/sbin] /usr/local/sbin
    daemon_directory: [/usr/libexec/postfix] /usr/local/libexec/postfix
    data_directory: [/var/lib/postfix] /usr/local/var/postfix
    html_directory: [no] <Enter>
    mail_owner: [postfix] <Enter>
    mailq_path: [/usr/bin/mailq] <Enter>
    manpage_directory: [/usr/local/man] <Enter>
    newaliases_path: [/usr/bin/newaliases] <Enter>
    queue_directory: [/var/spool/postfix] <Enter>
    readme_directory: [no] <Enter>
    sendmail_path: [/usr/sbin/sendmail] <Enter>
    setgid_group: [postdrop] <Enter>
    (省略)
    


  8. コンフィグしたパラメータを確認します。
    [mail]# postconf -n -c /usr/local/etc/postfix
    command_directory = /usr/local/sbin
    config_directory = /usr/local/etc/postfix
    daemon_directory = /usr/local/libexec/postfix
    data_directory = /usr/local/var/postfix
    debug_peer_level = 2
    html_directory = no
    mail_owner = postfix
    mailq_path = /usr/bin/mailq
    manpage_directory = /usr/local/man
    newaliases_path = /usr/bin/newaliases
    queue_directory = /var/spool/postfix
    readme_directory = no
    sample_directory = /usr/local/etc/postfix
    sendmail_path = /usr/sbin/sendmail
    setgid_group = postdrop
    unknown_local_recipient_reject_code = 550
    


  9. aliases の root の転送先の設定と、postfix アカウントの記述を確認します。
    [mail] cd /usr/local/etc/postfix
    [mail] vi aliases
    root:           admin   # これを追加(root 以外のメール管理者に転送する場合のみ)。
    postfix:        root    # この行はもともとあります。
    


  10. aliases.db に反映させます。
    [mail]# postalias -c /usr/local/etc/postfix /usr/local/etc/postfix/aliases
    


  11. main.cf を編集します。
    [mail] cd /usr/local/etc/postfix
    [mail] vi main.cf
    
    queue_directory = /var/spool/postfix
    command_directory = /usr/local/sbin
    daemon_directory = /usr/local/libexec/postfix
    data_directory = /usr/local/var/postfix
    mail_owner = postfix
    myhostname = mail.arinux.net
    mydomain = arinux.net
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain, localhost
    unknown_local_recipient_reject_code = 550
    mynetworks = 127.0.0.0/8, 10.1.1.0/24
    alias_maps = hash:/usr/local/etc/postfix/aliases
    alias_database = hash:/usr/local/etc/postfix/aliases
    home_mailbox = Maildir/
    debug_peer_level = 2
    debugger_command =
             PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
             ddd $daemon_directory/$process_name $process_id & sleep 5
    sendmail_path = /usr/sbin/sendmail
    newaliases_path = /usr/bin/newaliases
    mailq_path = /usr/bin/mailq
    setgid_group = postdrop
    html_directory = no
    manpage_directory = /usr/local/man
    sample_directory = /usr/local/etc/postfix
    readme_directory = no
    smtp_host_lookup = dns
    


  12. スタートアップ・スクリプトを作成します。
    [mail] vi /etc/rc.d/init.d/postfix
    
    #!/bin/sh
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    # Check networking
    if [ -r /etc/sysconfig/network ] ; then
            . /etc/sysconfig/network
            [ ${NETWORKING} = "no" ] && exit 0
    fi
    
    RETVAL=0
    
    start() {
            # Start daemons.
            echo -n "Starting postfix: "
            /usr/local/sbin/postfix -c /usr/local/etc/postfix start 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
            echo
            return $RETVAL
    }
    
    stop() {
            # Stop daemons.
            echo -n "Shutting down postfix: "
            /usr/local/sbin/postfix stop 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
            echo
            return $RETVAL
    }
    
    reload() {
            echo -n "Reloading postfix: "
            /usr/local/sbin/postfix reload 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    abort() {
            /usr/local/sbin/postfix abort 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    flush() {
            /usr/local/sbin/postfix flush 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    check() {
            /usr/local/sbin/postfix check 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    restart() {
            stop
            start
    }
    
    # See how we were called.
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            stop
            sleep 2
            start
            ;;
      reload)
            reload
            ;;
      abort)
            abort
            ;;
      flush)
            flush
            ;;
      check)
            check
            ;;
      status)
            status master
            ;;
      condrestart)
            [ -f /var/lock/subsys/postfix ] && restart || :
            ;;
      *)
            echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}"
            exit 1
    esac
    
    exit $?
    


  13. パーミッションを変更します。
    [mail]# chmod 755 postfix
    


  14. postfix を起動します。
    [mail]# /etc/rc.d/init.d/postfix start
    Starting postfix:                                          [  OK  ]
    


  15. テストメールを送信します。
    [mail]# echo "test 101" | mail -s "test mail 101" muser@mail.arinux.net
    


  16. メールが届いたかを確認します。
    [mail]# ls -l /home/muser/Maildir/new
    -rw------- 1 muser sales 433 Dec 17 17:16 1229501814.V802I1f403M77446.mail.arinux.net
    
    [root]# cat /home/muser/Maildir/new/1229*
    
    Return-Path: 
    X-Original-To: muser@mail.arinux.net
    Delivered-To: muser@mail.arinux.net
    Received: by mail.arinux.net (Postfix, from userid 0)
            id 09EF784D75; Wed, 17 Dec 2008 17:16:54 +0900 (JST)
    To: muser@mail.arinux.net
    Subject: test 101
    Message-Id: <20081217081654.09EF784D75@mail.arinux.net>
    Date: Wed, 17 Dec 2008 17:16:54 +0900 (JST)
    From: root@mail.arinux.net (root)
    
    test 101
    



つづく

| arinux | MySQL | 15:33 | comments(0) | trackbacks(0) | pookmark |
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ 掲載予定のタイトル
  • Wordpress
  • Pukiwiki
  • SMTPs/POPs/IMAPs
  • fml
  • Tips
+ CSS Nite
+ MOBILE
qrcode
+ LINKS
+ RECOMMEND
+ PROFILE