サーバ管理

2010年01月25日

ファイルロック処理が実装されてないログファイルを、なるべく安全にログローテート

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

思わず手直ししたくなるスクリプト

「ログを吐き出しているけど、ロック処理が無い…」と言う、何とも初歩的なスクリプトがあったとする。
そんなログをローテートしたい。

▼要望

  • ログローテートする
  • ログは全て保存し、消さない
  • ファイル名に日付を付けたい

▼/etc/logrotate.d/foo-bar

/var/log/foo-bar.log {
    daily
    rotate 1
    missingok
    create 0644  www-data www-data
    sharedscripts
    postrotate
      basename=/var/log/foo-bar.log
      suffix=`date -d '1 day ago' +%Y%m%d-%s`.$$
      srcfile=${basename}.1
      dstfile=${basename}.${suffix}
      if [ -f ${srcfile} -a ! -f ${dstfile} ]; then
        (mv ${srcfile} ${dstfile} && gzip ${dstfile}) || :
      fi
    endscript
}

▼手動でローテートしてみる

$ sudo logrotate -f /etc/logrotate.d/foo-bar
$ sudo logrotate -f /etc/logrotate.d/foo-bar

$ ls -la /var/log/foo-bar*

▼作業後確認項目

  • 複数のログが生成されていれば良い
  • あとは日時ローテートされている事を確認出来れば良い
後書き

スクリプトでのロック処理実装は置いておくとして、

  • logrotate設定ファイル内にファイル操作処理を記述出来るのは嬉しい。
  • サーバ管理においてはシェルスクリプトを書ける事、それは大きな武器だと再認識。


半袖 at 13:55|PermalinkComments(0)TrackBack(0)

2009年07月09日

10分でredemineのホスティングサービスを作る

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

概要

プロジェクトおよび顧客の数だけ増えて行きそうだったので、 今後の為に、量産しやすい仕組みを作ってみた。

  • 「http://$(案件名).redmine.example.jp/」でアクセスする事を想定
  • 案件名指定でredmineを追加可能にする

作業環境

作業内容

■インスタンス作成

▼domU作成

$ sudo xen-create-image --ip=192.0.2.41 --gateway=192.0.2.1 --netmask=255.255.255.0 --hostname=redmine
$ sudo xm create -c /etc/xen/domains/redmine.cfg

▼rootパスワード変更

# passwd

▼作業アカウント作成

# groupadd redmine
# useradd -d /home/redmine -s /bin/bash -m -g redmine redmine
# passwd redmine
# exit

一旦ログアウトし、PuTTY等を使い、redmineアカウントでSSH接続


■MySQL設定

▼文字コードをutf8にする

$ cd /etc/mysql/
$ sudo cp -pi my.cnf my.cnf.0
$ diff my.cnf.0 my.cnf
21a22
> default-character-set = utf8
42c43,45
< language     = /usr/share/mysql/english
---
> #language    = /usr/share/mysql/english
> language     = /usr/share/mysql/japanese
> default-character-set = utf8
$ sudo /etc/init.d/mysql restart

■passenger環境構築

▼環境構築時に必要とされるパッケージをインストール

$ sudo apt-get install apache2-mpm-prefork mysql-server mysql-client dnsmasq ruby rdoc irb ri
$ sudo apt-get install apache2-prefork-dev ruby-dev make g++ libopenssl-ruby subversion

$ cd /tmp
$ wget http://ftp.us.debian.org/debian/pool/main/libg/libgems-ruby/rubygems1.8_1.3.4-1_all.deb
$ wget http://ftp.us.debian.org/debian/pool/main/libg/libgems-ruby/rubygems_1.3.4-1_all.deb
$ suod dpkg -i *.deb

2009/07/07時点では、rubygems関連パッケージのバージョンは1.3.4-1。必要に応じて変更。

▼ユーザー共通環境変数設定

$ sudo vi /etc/environment
$ diff /tmp/environment /etc/environment
0a1,2
> PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
> LANG="en_US.UTF-8"

▼railsをインストール(RedMine-0.8はrails-2.1.2に依存)

$ sudo GEM_HOME=/usr/local/gems gem install rails --no-ri --no-rdoc --version=2.1.2

▼passengerをインストール

$ sudo GEM_HOME=/usr/local/gems gem install passenger --no-ri --no-rdoc

▼passengerをビルド

$ cd /usr/local/gems/gems/passenger-2.2.4/; pwd
/usr/local/gems/gems/passenger-2.2.4
$ sudo GEM_HOME=/usr/local/gems ./bin/passenger-install-apache2-module

▼apache2用設定

$ sudo vi /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /usr/local/gems/gems/passenger-2.2.4/ext/apache2/mod_passenger.so
PassengerRoot  /usr/local/gems/gems/passenger-2.2.4
PassengerRuby /usr/local/bin/passenger_ruby.sh

▼passenger用ラッパースクリプト作成

$ sudo vi /usr/local/bin/passenger_ruby.sh
#!/bin/sh
. /etc/environment
export RUBYLIB GEM_HOME
exec /usr/bin/ruby $@
$ sudo chmod 755 /usr/local/bin/passenger_ruby.sh

▼passengerモジュールを読み込み対象に追加

$ sudo /usr/sbin/a2enmod passenger

▼mod_rewriteを使うのでロード対象モジュールに追加

$ sudo /usr/sbin/a2enmod rewrite

▼apache2を再起動

$ sudo /etc/init.d/apache2 force-reload

■Redmineの設定

▼redmine用ディレクトリ準備

$ cd /home/redmine
$ mkdir etc
$ mkdir etc/apache2
$ mkdir etc/redmine
$ mkdir lib

▼redmineのスケルトンを用意

$ cd /home/redmine/etc/redmine
$ svn checkout http://redmine.rubyforge.org/svn/branches/0.8-stable skel

▼make-redmine.shを作成

$ cd /home/redmine
$ vi make-redmine.sh
#!/bin/sh
#
# http://blog.hanosde.org/
#
GEM_HOME=/usr/local/gems

name=$1
prefix=/home/redmine
libdir=${prefix}/lib
etcdir=${prefix}/etc
domain=redmine.example.jp
fqdn=${name}.${domain}

echo fqdn:${fqdn}

# check
[ -z "${name}" ] && { exit 1; }
[ -d "${libdir}/${name}" ] && { exit 1; }

# rsync
rsync -au ${etcdir}/redmine/skel/ ${libdir}/${name}

# database.yml
cat <<EOS | tee ${libdir}/${name}/config/database.yml
production:
  adapter: mysql
  database: redmine_${name}
  host: localhost
  socket: /var/run/mysqld/mysqld.sock
  username: root
  password:
  encoding: utf8
EOS

# create database
mysqladmin -uroot create redmine_${name}

# initialize redmine
cd ${libdir}/${name}
/usr/local/gems/bin/rake db:migrate RAILS_ENV=production
echo en | /usr/local/gems/bin/rake redmine:load_default_data RAILS_ENV=production

# apache virtualhost config
cat <<EOS | tee ${etcdir}/apache2/${fqdn}
<VirtualHost *:80>
  ServerName ${fqdn}

  DocumentRoot ${libdir}/${name}/public
  ErrorLog  /var/log/apache2/${fqdn}-error.log
  CustomLog /var/log/apache2/${fqdn}-access.log combined

  RailsEnv production
</VirtualHost>
EOS

# ensite virtualhost
sudo ln -s ${etcdir}/apache2/${fqdn} /etc/apache2/sites-available/
sudo /usr/sbin/a2ensite ${fqdn}

exit 0

▼実行権限付与

$ chmod +x make-redmine.sh

▼apache2リロード

$ sudo /etc/init.d/apache2 reload

■Redmine VirtuaHostを新規追加

▼例として、foo.redmine.example.jpを追加

$ cd /home/redmine
$ ./make-redmine.sh foo
$ sudo /etc/init.d/apache2 reload

その後は http://foo.redmine.example.jp/ へアクセスして表示を確認


あとがき

ひとまずredmineを使えるようにするまでの作業が面倒だった。

もしこの先に何かをやるならば、
Webインターフェースから追加する仕組み、アカウント発行などの仕組みを取り入れればいいだろう。

個人的には追加スクリプトを作る所までで要件を満たせるので終わりにしておく。



半袖 at 12:20|PermalinkComments(0)TrackBack(0)

2009年07月06日

5分でSambaを使ったファイルサーバを作る

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

作業環境

ファイルサーバが必要になったのでSambaで構築。

  • Debian GNU/Linux 5.0.2
  • Samba 2:3.2.5-4lenny6

作業内容

▼domU作成

$ sudo xen-create-image --ip=192.0.2.10 --gateway=192.0.2.1 --netmask=255.255.255.0 --hostname=fileserver

▼domU起動

$ sudo xm create -c /etc/xen/domains/fileserver.cfg

▼rootパスワード設定

# passwd

▼作業アカウント作成

# groupadd hansode
# useradd -d /home/hansode -s /bin/bash -m -g hansode hansode
# passwd hansode
# exit

ここで一度抜けてPuTTYなどでssh接続

▼パッケージアップグレード

$ sudo apt-get update && sudo apt-get dist-upgrade

▼sambaをインストール

$ sudo apt-get install samba
WORKGROUP: HANSODE
DHCPうんぬん: NO
$ sudo apt-get install samba-tools
$ sudo apt-get install samba-doc

▼UNIXアカウント登録

$ for user in nagasode g-pan
echo ... ${user}
sudo useradd -g axsh -b /bin/true -d /home/${user} -m ${user}
sudo smbpasswd -a ${user}
done

▼sambaの設定変更

$ cd /etc/samba
$ sudo mkdir old
$ sudo cp -pi smb.conf old/smb.conf.`date +%Y%m%d-%s`.$$

$ sudo vi smb.conf
$ diff old/smb.conf.20090703-1246590736.1274 smb.conf
242c242,243
<    read only = yes
---
>    #read only = yes
>    read only = no
281,288c282,289
< [printers]
<    comment = All Printers
<    browseable = no
<    path = /var/spool/samba
<    printable = yes
<    guest ok = no
<    read only = yes
<    create mask = 0700
---
> #[printers]
> #   comment = All Printers
> #   browseable = no
> #   path = /var/spool/samba
> #   printable = yes
> #   guest ok = no
> #   read only = yes
> #   create mask = 0700
292,297c293,298
< [print$]
<    comment = Printer Drivers
<    path = /var/lib/samba/printers
<    browseable = yes
<    read only = yes
<    guest ok = no
---
> #[print$]
> #   comment = Printer Drivers
> #   path = /var/lib/samba/printers
> #   browseable = yes
> #   read only = yes
> #   guest ok = no
325a327,332
> [project]
>    comment = axsh fileserver project
>    path = /home/samba/project
>    guest ok = no
>    read only = no
>    share modes = yes
326a334,335
>    create mask = 2770
>    directory mask = 2770

▼共有ディレクトリ準備

$ sudo mkdir -p /home/samba/project
$ sudo chgrp hansode /home/samba/project
$ sudo chmod 2770 /home/samba/project

▼samba再起動

$ sudo /etc/init.d/samba restart


半袖 at 14:20|PermalinkComments(0)TrackBack(0)

2009年02月28日

さくらレンタルサーバでDebianを使う (環境構築編)

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

さくらレンタルサーバでDebianを使うの続き

chroot環境構築時の方針は下記のものとする

  • host環境は可能な限り手をつけない
  • デーモンプロセスはdaemontoolsで管理する物とする
  • host環境用sshとguest環境用sshをそれぞれ用意する

作業内容

作業対象を明確化するため、プロンプトで示す

プロンプト内用
debianDebianがインストールされている別サーバ
hostchroot呼び出し元
guestchroot環境下

chroot環境構築下準備
debian環境にてchrootツリーを作っておく

debian$ mkdir sid
debian$ sudo /usr/sbin/debootstrap sid sid
debian$ sudo tar zcvpf sid.tar.gz sid
debian$ scp sid.tar.gz admin@192.0.2.205:~/

host環境にてchroot用ディレクトリ作成

host$ su
host# cd /home
host# mkdir -p chroot/debian
host# cd chroot/debian

debianツリーを伸長

host# tar zxvpf sid.tar.gz

子環境用に必要な物をマウント

host# mount -t proc proc /home/chroot/debian/sid/proc
host# mount -t devpts devpts /home/chroot/debian/sid/dev/pts
host# mount -o bind /dev /home/chroot/debian/sid/dev
host# mount -o bind / /home/chroot/debian/sid/mnt

リゾルバ設定

host# cp -pi /etc/resolv.conf sid/etc/.

パッケージを更新

guest# export PATH=/bin:/usr/bin:/sbin:/usr/sbin
guest# apt-get update
guest# apt-get dist-upgrade

daemontools起動設定

guest# apt-get install daemontools
guest# exit
host# vi /etc/inittab
SV:123456:respawn:/usr/sbin/chroot /home/chroot/debian/sid /usr/bin/svscanboot
host# /sbin/telinit q

親環境のhttpdを停止

host# /sbin/chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
host# /sbin/chkconfig --del httpd
host# /sbin/chkconfig --list httpd
service httpd supports chkconfig, but is not referenc

OpenSSH設定

guest# apt-get install openssh-server
guest# apt-get install ucspi-tcp
guest# cd /etc/service
guest# ./addsv.sh ssh
guest# cd .ssh; pwd
guest# vi run

※addsv.shはdaemontoolsの/service/に、サービスを追加するスクリプト「addsv.sh」 を参照。

#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

exec 2>&1
sleep 3

exec envdir ./env sh -c '
  /usr/bin/tcpserver -HRDl0 -x ./tcp.ssh.cdb \
  -u 0 -g 0 0 ${PORT:-2022} /usr/sbin/sshd -i -e
'
guest# mkdir env
guest# echo 2022 > env/PORT
guest# echo :allow > tcp.ssh
guest# tcprule ./tcp.ssh.cdb ./tcp.ssh.tmp < ./tcp.ssh
guest# cd ../; pwd
guest# mv -i .ssh ssh

これ以降の作業は2022番ポートを指定してssh接続。
必要に応じてパッケージをインストールして行く。


まとめ

  • hostのinittabにてguestのsvscanを実行するのがポイント
  • chrootのツリーを他サーバへ持っていけば簡単に論理移転可能と言うメリットがある


半袖 at 17:15|PermalinkComments(0)TrackBack(0)

2009年02月15日

さくらレンタルサーバでDebianを使う

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

調べてみると「Fedora 7」だった

使われずにいた「さくらのレンタルサーバ」を使って良いと言われ、
サーバ状況を確認してみると「Fedora7」

  • 可能であればDebianにしたい
  • 1年後に論理移転予定
  • 今ある環境には手をつけたくない

これを実現させる為に自分が選んだのは、chroot。
chroot環境内にDebianを用意する。

chrootの利点

  • 親環境の古いライブラリに依存しない
  • Xenとは違い、無駄なオーバーヘッドが無い

今回はネットワークリソースが親環境と共有されても問題が無いので、
chrootを使う事で要求を満たせる。

具体的な構築方法は、また次回



半袖 at 17:45|PermalinkComments(0)TrackBack(0)

2009年01月20日

X-Powered-By: PHP/x.y.z を非表示化

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

作業概要

HTTPレスポンスヘッダーにPHPのバージョンを表示させたくないと言うので隠ぺい作業。
※Serverフィールドに出て来るPHPのバージョン情報非表示設定は今回の議論の対象外。

  • php.iniで「expose_php = Off」にする
  • Apacheをreloadして設定繁栄

作業内容

ディストリビューション名、バージョン確認

-bash-3.2# cat /etc/redhat-release
CentOS release 5.2 (Final)

php.iniのバックアップ

-bash-3.2# cp -pi /etc/php.ini /etc/php.ini.0

php.ini編集

-bash-3.2# vi /etc/php.ini
-bash-3.2# diff /etc/php.ini.0 /etc/php.ini
293c293,294
< expose_php = On
---
> ;expose_php = On
> expose_php = Off

設定反映前の状態確認

-bash-3.2# HEAD http://localhost/ | egrep ^X
X-Powered-By: PHP/5.2.6

設定反映

-bash-3.2# /etc/init.d/httpd reload
Reloading httpd:                                           [  OK  ]

設定反映後の状態確認

-bash-3.2# HEAD http://localhost/ | egrep ^X

出力されていない事を確認出来た。


プログラミングPHP 第2版
Rasmus Lerdorf Kevin Tatroe Peter MacIntyre
オライリー・ジャパン
売り上げランキング: 55870


半袖 at 11:05|PermalinkComments(0)TrackBack(1)

2008年10月06日

Amazon EC2のデータをS3へバックアップ

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

無くなってからでは遅い

消えたら困る大事なデータを定期的にS3へバックアップする

同期ツールをインストール

今回はaws-s3を採用

$ gem install aws-s3

同期スクリプト配置

  • 保持期間は1か月分
  • ファイル名には日付(+%d)を入れておく
  • 一カ月後には同ファイル名でファイルが生成され、上書きされて行く
  • 例)
    • mysql_redmine.sql.01.gz
    • svn_ec2.01.gz
$ cd /root
$ vi ec2-daily-backup.sh
-----
#!/bin/sh
 
# env.
AWS_ACCESS_KEY_ID=**********
AWS_SECRET_ACCESS_KEY=**********
export AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY
 
#
# vars.
#
theday=$(date +%d)
 
## mysql
db_name=redmine
db_backup_gzip=/var/backup/daily/mysql/mysql_${db_name}.sql.${theday}.gz
## subversion
svn_name=ec2
svn_backup_gzip=/var/backup/daily/svn/svn_${svn_name}.${theday}.gz
 
# dump
mysqldump --default-character-set=utf8 -uroot ${db_name} | gzip > ${db_backup_gzip}
svnadmin dump /home/svn/repos/ec2/ | gzip > ${svn_backup_gzip}
 
# sync
s3sync -v ${db_backup_gzip}  redmine:backup
s3sync -v ${svn_backup_gzip} redmine:backup

実行権限付与

$ chmod +x ./ec2-daily-backup.sh

一度実行して確認

$ sh -n ./ec2-daily-backup.sh 
$ ./ec2-daily-backup.sh 

更にS3Foxなどで確認

crontabのエントリ修正

エントリ追加

$ crontab -e
----
0 0 * * * /root/ec2-daily-backup.sh >/dev/null 2>&1
----

エントリの内容確認

$ crontab -l


半袖 at 14:50|PermalinkComments(0)TrackBack(0)

Amazon EC2をS3へフルバックアップ

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

概要

  • EC2をA3へバックアップする手順をまとめた文書

補足

  • EC2はインスタンスを停止させるとデータがクリアされてしまうのでデータのバックアップが必要
  • そこでEC2用ストレージであるS3へバックアップを行う
  • 今回はAMIまるごとバックアップ

作業内容

EC2のイメージのバックアップファイル作成
$ ec2-bundle-vol -d /mnt -k /mnt/pk-*****.pem -c /mnt/cert-*****.pem -u 2337-8359-0872
Please specify a value for arch [i386]: <--- エンター
Copying / into the image file /mnt/image...
Excluding:
         /sys
         /proc
         /proc/sys/fs/binfmt_misc
         /dev
         /media
         /mnt
         /proc
         /sys
         /mnt/image
         /mnt/img-mnt
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.002869 seconds, 365 MB/s
mke2fs 1.39 (29-May-2006)
/etc/fstab:
         # Legacy /etc/fstab
         # Supplied by: ec2-ami-tools-1.3-20041
         /dev/sda1 /     ext3    defaults 1 1
         /dev/sda2 /mnt  ext3    defaults 0 0
         /dev/sda3 swap  swap    defaults 0 0
         none      /proc proc    defaults 0 0
         none      /sys  sysfs   defaults 0 0
Bundling image file...

.....

Creating bundle manifest...
ec2-bundle-vol complete.

ファイルが作成されている事を確認

  • image.manifest.xml
  • image.part.*
S3へアップロード

先の手順で生成されたimage.manifest.xmlが必要

  • -b でバケット名を指定可能
  • -aでアクセスキーを指定
  • -sで秘密アクセスキー指定
# ec2-upload-bundle -b centos5.0-2008081101 -m /mnt/image.manifest.xml -a アクセスキー -s 秘密アクセスキー
Uploading bundled image parts to https://s3.amazonaws.com:443/centos5.0-2008081101 ...
Uploading manifest ...
Uploaded manifest to https://s3.amazonaws.com:443/centos5.0-2008081101/image.manifest.xml.
Bundle upload completed.
AMIへ登録

FirefoxのアドオンElasticfoxを利用

  1. タブから「AMIs and Instances」を選択
  2. 「Machine Images (AMIs)」から「+」をクリック
  3. 「AIM Manifest Path:」に 「centos5.0-2008081101/image.manifest.xml」を指定して「OK」
  4. 「Machine Images (AMIs)」に「centos5.0-2008081101/image.manifest.xml」がある事を確認


半袖 at 14:30|PermalinkComments(2)TrackBack(0)

2008年10月03日

手頃なメールサーバを作る(Postfix+Dovecot+MySQL+Postfixadmin)

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

改めてメールサーバ構築のまとめ


久しぶりにメールサーバの設定作業を行った。
自分自身の復習目的に、以前書いたメールサーバ構築関連エントリのまとめなおしてみた。
自宅や中小企業用にはこれで間に合うのではないだろうか。


メールサーバ構成概要


postadmin
主な機能
  • Submissionポート
  • SMTP-Auth
  • IMAP4
  • メールアカウント管理ツール
  • 複数バーチャルドメイン
前提条件として下記アプリケーションがインストール済みであるものとする

PostfixAdminの設定


環境概要

PostfixAdmindirectory/var/lib/postfixadmin/
URIhttp://postfixadmin.example.com/
Mailbox$(domain)/$(local-part)
MySQLdb_hostlocalhost
db_namepostfixadmin
db_userpostfix
db_pass********

ユーザー用Maildirディレクトリデザイン補足

今回、
  • 『$(local-part)@$(domain)』のメールボックスを、
  • 『$(domain)/$(local-part)』となるようにする
これは単にvpopmailの構成が好きだったから。

PostfixAdminで設定する。
設定すべき変数が下記2つ。
$CONF['domain_path']'NO'(無し)
'YES'$(domain)/
$CONF['domain_in_mailbox']'YES'$(local-part)@$(domain)
'NO'$(local-part)

今回の設定。
$CONF['domain_path']'YES'
$CONF['domain_in_mailbox']'NO'

作業内容

# mkdir -p /var/lib/postfixadmin
# cd /var/lib/postfixadminostfixadmin; pwd
/var/lib/postfixadmin
# wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0
# tar zxvf postfixadmin_2.2.0.tar.gz
# ln -s postfixadmin-2.2.0 htdocs
Apacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd
/etc/httpd/conf/vhosts-available
# vi postfixadmin.example.com
.....(省略).....

# cd ../; pwd
/etc/httpd/conf
# ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/
問題なければ反映(reload)
# /usr/sbin/apachectl configtest
Syntax OK
# /etc/init.d/httpd reload
Reloading httpd:                                           [  OK  ]
ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。

DBアクセス用アカウント作成
$ mysql -uroot
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
PostfixAdminの設定
# pwd
/var/lib/postfixadmin/htdocs
# cp -pi config.inc.php config.inc.php.0
# vi config.inc.php
# diff config.inc.php.0 config.inc.php
31c31
< $CONF['configured'] = false;
---

> $CONF['configured'] = true;
51,53c51,53
< $CONF['database_host'] = 'localhost';
< $CONF['database_user'] = 'postfixadmin';
< $CONF['database_password'] = 'postfixadmin';
---
> $CONF['database_host'] = 'localhost';
> $CONF['database_user'] = 'postfix';
> $CONF['database_password'] = '********';
123c123
< $CONF['domain_path'] = 'NO';
---
> $CONF['domain_path'] = 'YES';
129c129

< $CONF['domain_in_mailbox'] = 'YES';
---
> $CONF['domain_in_mailbox'] = 'NO';
再び http://postfixadmin.example.com/setup.php を確認。
  • 各項目がOKとなる事を確認。
  • 管理アカウント作成を要請されるので、管理アカウントを作成する。
  • この時点でPostfixAdminがtableを生成してくれる
設定内容に問題がなければsetup.phpをリネームする。
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted
管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/

この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。


Postfixの設定


  • vpopmailの様なディレクトリ構成にする
  • SMTP-Authの認証はDovecotに任せる
  • Submissionポート(tcp/587)

設定概要

virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/
設定ファイル/var/lib/vpostmail/etc/*.cf


作業内容

masterにsubmissionポートを追加。
# cd /etc/postfix/
# vi master.cf
> submission inet n       -       n       -       -       smtpd
バーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmail
バーチャルドメイン用にmain.cf修正
また、SASLの設定も追加する。
# pwd
/etc/postfix
# cp -pi main.cf main.cf.0
# vi main.cf
# diff main.cf.0 main.cf
> virtual_gid_maps = static:12000
> virtual_uid_maps = static:12000
> virtual_mailbox_limit   = 51200000
> virtual_minimum_uid     = 1001
> virtual_transport       = virtual
> virtual_mailbox_base    = /var/lib/vpostmail/domain
> virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf
> virtual_mailbox_maps    = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf
> virtual_alias_maps      = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cf
>
> smtpd_sasl_auth_enable = yes
> smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
> smtpd_sasl_type = dovecot
> smtpd_sasl_path = private/auth
メールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/
# cd /var/lib/vpostmail/; pwd
/var/lib/vpostmail
# mkdir etc domain
vpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domain
Postfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc

# vi mysql_virtual_alias_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT goto FROM alias WHERE address='%s'

# vi mysql_virtual_domains_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT description FROM domain WHERE domain='%s'

# vi mysql_virtual_mailbox_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、
concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。

etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd
/var/lib/vpostmail
# chown -R postfix:postfix etc/
# ls -ld etc/
drwx------  2 postfix postfix 4096 May  7 20:35 etc/
設定内容確認
# /etc/init.d/postfix check
問題なければ反映
# /etc/init.d/postfix reload
Reloading postfix:                                         [  OK  ]
送信テスト
$ telnet localhost 25
helo localhost
mail from:foo@example.net
rcpt to:bar@example.com
data
Subject: test

test
test
.
quit
ログ確認

# tail -F /var/log/maillog
.....
エラーが出てなければOK


Dovecotの設定


メールを受信

PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。


設定概要

virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/
設定ファイル/etc/dovecot-mysql.conf



作業内容

dovecotをMySQL対応にする。
# yum install dovecot-mysql
dovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3

auth default {
  mechanisms = plain
  passdb pam {
  }
  passdb sql {
    args = /etc/dovecot-mysql.conf
  }
  userdb passwd {
  }
  userdb sql {
    args = /etc/dovecot-mysql.conf
  }
  user = root

  socket listen {
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}
MySQL用の設定。
※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'

設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]
POPの確認
$ telnet localhost 25
user foo@example.com
pass ********
list
retr 1
.....
ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。


まとめ


  • この構成にはスパムメール対策がない事に気づいた
  • そのうちスパムメール対策も追加した物をまとめる…かも知れない



半袖 at 16:15|PermalinkComments(1)TrackBack(0)

2008年10月01日

mongrel_clusterを使わず、似たような事をdaemontoolsで実現させる

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

mongrel_clusterのメモでまとめたとおり


mongrel_clusterは
  • 単に複数mongrel_railsの起動を起動管理
  • 設定をYAML形式で記述可能
  • フォアグラウンドでは起動させられない

mongrel_cluster


daemontoolsを導入するに辺り、
fghackを使ってmongrel_clusterを管理すると言うてがあるのだろうけど、
自分はmongrel_clusterを使わない事にした。

mongrel_clusterが何をやっているのかを知ってからは、
mongrel_clusetr対する熱がすっかり冷めてしまったのだ…。


課題


何を解決しなければ行けないのかを上げてみる
  • serversの扱いをどうするのか
  • YAMLの設定項目はどのように設定するか
こんな所だろう。


解決策


daemontoolsをある程度使っている人ならば恐らく当たり前な事。
  • serversの数だけserviceを作成
  • YAMLの設定項目はenvdirで設定する
図解するとこうなる。

mongrel_cluster


作業内容


サービス追加
# cd /servie/
# ./addsv.sh mongrel_cluster-0
※addsv.shはdaemontoolsの/service/に、サービスを追加するスクリプト「addsv.sh」 を参照。


runファイル設定
# cd /service/.mongrel_cluster-0
# vi run
ここではenvuidgidではなく、USERとGROUPを指定する。
管理の都合など、どうしてもUSERで指定するアカウントで環境変数を指定したいと言う方はenvuidgidを使って下さい。
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

exec 2>&1
sleep 10

exec envdir ./env sh -c '
 [ -d "${CHDIR}" ] || exit 1
 id "${USER}"      || exit 1
 exec mongrel_rails start \
  -e ${ENVIRONMENT:-DEVELOPMENT} \
  -a ${ADDRESS:-127.0.0.1} \
  -p ${PORT:-3000} \
  -c ${CHDIR} \
  -r ${ROOT:-public} \
  --user  ${USER} \
  --group ${GROUP} \
'
envdirディレクトリ作成
# mkdir env
# cd env
envdir用ファイル作成
# echo 127.0.0.1 > ADDRESS
# echo /var/lib/rails/project/ > CHDIR
# echo production > ENVIRONMENT
# echo www-data > GROUP
# echo 8080 > PORT
# echo rails > USER
runの確認
# cd ../
# sh -n ./run
# sh -x ./run
問題無ければサービス対象にする
# cd /service
# mv -i .mongrel_cluster-0 mongrel_cluster-0
同じ作業を繰り返し、
ノード名とPORTファイルの設定が違うmongrelサービスのノードを増加させて行く。

ノード名env/PORT
/service/mongrel_cluster-08080
/service/mongrel_cluster-18081
/service/mongrel_cluster-28082
/service/mongrel_cluster-38083


あくしゅ!はこの仕組みで管理してます。


まとめ


mongerel_clusterを使わないメリット。
  • daemontoolsにより、プロセスが異常終了しても起動してくれる
  • グループの中の特定ノードだけ起動停止が可能になる
  • ログの扱いはmultilog任せ
デメリットは…考えない。
daemontoolsは素敵です。


関連リンク



半袖 at 16:25|PermalinkComments(0)TrackBack(0)

2008年09月30日

mongrel_clusterのメモ

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

mongrel_cluster
  • mongrel_cluster_ctlがmongrel_railsを起動管理する
  • 設定ファイルはYAML形式
    • 代表的設定項目
      • 起動サーバ数
      • 開始ポート番号
      • 起動サーバ数が2以上であれば、
        「開始ポート番号+1」をポート番号として2つ目のmongrel_railsを起動
  • mod_proxy_balancerなどのロードバランサーと組み合わせた環境向け



思い込み


「cluster」と言うから素晴らしい仕組みだと思い込んでいたら、大したことはない。
  • 単に複数mongrel_railsの起動を起動管理
  • 設定をYAML形式で記述可能
  • フォアグラウンドでは起動させられない
daemontoolsでmongrel_clusterを管理しようと思ったけど、無理だと分かった。
さて困ったな。


半袖 at 00:00|PermalinkComments(2)TrackBack(1)

2008年08月12日

CentOSでタイムゾーンをJSTへ変更する

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

そう言う事か


00:00に実行されるようcronを設定し、一夜が明けた。

確認してみると、動いてない…?
何故だ…と思ったら、タイムゾーンがJSTになっていなかった。

# cp /usr/share/zoneinfo/Japan /etc/localtime
# date

これで解決。


CentOS徹底入門 第2版 (DVD付)
飛田 伸一郎 中島 能和
翔泳社
売り上げランキング: 8472


半袖 at 10:55|PermalinkComments(1)TrackBack(0)

2008年06月05日

[RHEL4] sysstatの設定変更

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

環境


ディストリビューション
Red Hat Enterprise Linux ES release 4 (Nahant Update 5)
sysstat
5.0.5



デフォルトだと10分毎

rhel4# cat /etc/cron.d/sysstat
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A
sa1の「*/10」を「*/5」としてやれば5分毎。
検証環境では毎分の変動を観察したいので「*」とした。



保管ログファイル数を増やす

rhel4# cat /etc/sysconfig/sysstat
# How long to keep log files (days), maximum is a month
HISTORY=7

長期間保管させたい場合はHISTORYを増やすだけ。


半袖 at 02:15|PermalinkComments(0)TrackBack(0)

2008年05月08日

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(5/n) - Dovecotの設定

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

メールを受信


PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。



設定概要


virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/
設定ファイル/etc/dovecot-mysql.conf



作業内容


dovecotをMySQL対応にする。
# yum install dovecot-mysql
dovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3

auth default {
  mechanisms = plain
  passdb pam {
  }
  passdb sql {
    args = /etc/dovecot-mysql.conf
  }
  userdb passwd {
  }
  userdb sql {
    args = /etc/dovecot-mysql.conf
  }
  user = root
}
MySQL用の設定。
※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]
POPの確認
$ telnet localhost 25
user foo@example.com
pass ********
list
retr 1
.....
ここで認証が通れば問題なし。

複数バーチャルドメイン対応メール環境が出来上がった。



関連リンク



半袖 at 19:35|PermalinkComments(0)TrackBack(0)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(4/n) - Postfixの設定

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

構成イメージはvpopmail


vpopmailの様なディレクトリ構成にする。



設定概要


virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/
設定ファイル/var/lib/vpostmail/etc/*.cf



作業内容


バーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmail
バーチャルドメイン用にmain.cf修正
# pwd
/etc/postfix
# cp -pi main.cf main.cf.0
# vi main.cf
# diff main.cf.0 main.cf
> virtual_gid_maps = static:12000
> virtual_uid_maps = static:12000
> virtual_mailbox_limit   = 51200000
> virtual_minimum_uid     = 1001
> virtual_transport       = virtual
> virtual_mailbox_base    = /var/lib/vpostmail/domain
> virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf
> virtual_mailbox_maps    = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf
> virtual_alias_maps      = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cf
メールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/
# cd /var/lib/vpostmail/; pwd
/var/lib/vpostmail
# mkdir etc domain
vpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domain
Postfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc

# vi mysql_virtual_alias_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT goto FROM alias WHERE address='%s'

# vi mysql_virtual_domains_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT description FROM domain WHERE domain='%s'

# vi mysql_virtual_mailbox_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、
concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。

etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd
/var/lib/vpostmail
# chown -R postfix:postfix etc/
# ls -ld etc/
drwx------  2 postfix postfix 4096 May  7 20:35 etc/
設定内容確認
# /etc/init.d/postfix check
問題なければ反映
# /etc/init.d/postfix reload
Reloading postfix:                                         [  OK  ]
送信テスト
$ telnet localhost 25
helo localhost
mail from:foo@example.net
rcpt to:bar@example.com
data
Subject: test

test
test
.
quit
ログ確認
# tail -F /var/log/maillog
.....
エラーが出てなければOK


次回はPOP3サーバの設定



関連リンク



半袖 at 18:40|PermalinkComments(0)TrackBack(1)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

管理ツールで管理負荷軽減


エンジニアであればコマンドラインからの作業で事足りる。
納品する場合など、相手がエンジニアとは限らない。
管理ツールを導入する事により、覚える事は最小限。

今回はメールアカウント管理ツールとしてPostfixAdminを使う。



環境概要

PostfixAdmindirectory/var/lib/postfixadmin/
URIhttp://postfixadmin.example.com/
Mailbox$(domain)/$(local-part)
MySQLdb_hostlocalhost
db_namepostfixadmin
db_userpostfix
db_pass********

ユーザー用Maildirディレクトリデザイン補足


今回、
『$(local-part)@$(domain)』のメールボックスを、
『$(domain)/$(local-part)』となるようにする。
これは単にvpopmailの構成が好きだったから。

PostfixAdminで設定する。
設定すべき変数が下記2つ。
$CONF['domain_path']'NO'(無し)
'YES'$(domain)/
$CONF['domain_in_mailbox']'YES'$(local-part)@$(domain)
'NO'$(local-part)

今回の設定。
$CONF['domain_path']'YES'
$CONF['domain_in_mailbox']'NO'



作業内容


# mkdir -p /var/lib/postfixadmin
# cd /var/lib/postfixadminostfixadmin; pwd
/var/lib/postfixadmin
# wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0
# tar zxvf postfixadmin_2.2.0.tar.gz
# ln -s postfixadmin-2.2.0 htdocs
Apacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd
/etc/httpd/conf/vhosts-available
# vi postfixadmin.example.com
.....(省略).....

# cd ../; pwd
/etc/httpd/conf
# ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/
問題なければ反映(reload)
[root@www conf]# /usr/sbin/apachectl configtest
Syntax OK
[root@www conf]# /etc/init.d/httpd reload
Reloading httpd:                                           [  OK  ]
ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。

DBアクセス用アカウント作成
$ mysql -uroot
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
PostfixAdminの設定
# pwd
/var/irokoi/postfixadmin/htdocs
# cp -pi config.inc.php config.inc.php.0
# vi config.inc.php
# diff config.inc.php.0 config.inc.php
31c31
< $CONF['configured'] = false;
---
> $CONF['configured'] = true;
51,53c51,53
< $CONF['database_host'] = 'localhost';
< $CONF['database_user'] = 'postfixadmin';
< $CONF['database_password'] = 'postfixadmin';
---
> $CONF['database_host'] = 'localhost';
> $CONF['database_user'] = 'postfix';
> $CONF['database_password'] = '********';
123c123
< $CONF['domain_path'] = 'NO';
---
> $CONF['domain_path'] = 'YES';
129c129
< $CONF['domain_in_mailbox'] = 'YES';
---
> $CONF['domain_in_mailbox'] = 'NO';
再び http://postfixadmin.example.com/setup.php を確認。
  • 各項目がOKとなる事を確認。
  • 管理アカウント作成を要請されるので、管理アカウントを作成する。
  • この時点でPostfixAdminがtableを生成してくれる
設定内容に問題がなければsetup.phpをリネームする。
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted
管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/

この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。

続きは次回。



関連リンク



半袖 at 17:55|PermalinkComments(0)TrackBack(1)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

RHEL4のPostfixでは駄目


出鼻をくじかれる。
Postfixが対応するルックアップテーブル一覧を確認してみた。

$ /usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix
mysqlが無い!!



Postfixを作り直す


参考にしたページはPostfix + Courier-IMAP

$ pwd
/home/admin/work/rpms
$ mkdir -p {SOURCES,SPECS,BUILD,SRPMS,RPMS/i386}
$ echo "%_topdir $HOME/work/rpms" > ~/.rpmmacros
$ cat ~/.rpmmacros
%_topdir /home/admin/work/rpms
SRPMを取得する
$ cd SRPMS/; pwd
/home/admin/work/rpms/SRPMS
$ wget http://ftp.riken.jp/Linux/centos/5/os/SRPMS/postfix-2.3.3-2.src.rpm
$ rpm -ivh postfix-2.3.3-2.src.rpm
quota修正用パッチ
$ cd ../SOURCES/; pwd
/home/admin/work/rpms/SOURCES
$ wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz
$ gunzip -d postfix-2.3.3-vda.patch.gz
$ cd ../SPECS/; pwd
/home/admin/work/rpms/SPECS
specファイル修正。
MySQLを使えるようにする。
$ cp -pi postfix.spec /tmp/
$ vi postfix.spec
$ diff /tmp/postfix.spec postfix.spec
2c2
< %define MYSQL 0
---
> %define MYSQL 1
82a83
< Patch10: postfix-2.3.3-vda.patch
136a138
> %patch10 -p1 -b .vda
$ rpmbuild -ba postfix.spec
標準パッケージと入れ替える
$ su
Password:
# apt-get remove postfix
# rpm -ivh ../RPMS/i386/postfix-2.3.3-2.i386.rpm
mysqlが入っている事を確認
$ /usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
mysql
nis
pcre
proxy
regexp
static
unix
OK



関連ページ



半袖 at 16:00|PermalinkComments(0)TrackBack(0)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

話を聞いてみると、この構成が一番スマート


メールを環境を構築して欲しい。
そう頼まれた。
  • POPを使いたい
  • 複数ドメインを使いたい
  • アカウント管理をしたい

なるほど。

まだ構築した事がなかったけど、
一番スマートに思えた構成がこれ。

MTAPostfix+MySQL
POP3Dovecot+MySQL
管理ツールPostfixadmin+MySQL)

数エントリに分割して環境構築方法をまとめていく。


半袖 at 15:45|PermalinkComments(0)TrackBack(1)

RHEL4にImageMagickとRMagicをインストールする

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

環境


ディストリビューションRed Hat Enterprise Linux ES release 4 (Nahant Update 6)
Rubyruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
Gems1.0.1



ImageMagic


作業メモ
  • ImageMagickはRPMを取得
    • libtiff-develに依存
    • libexif-develに依存
  • libtiffはRPMを取得
  • libexifはup2dateでインストール
    • 今回libexifだけはup2dateとした
    • 当初は他RPMsと同様にrpmコマンドでインストールしようとしたが、
      libexifがインストール済みであり、ダウンロードしたパッケージよりも
      インストール済みパッケージのバージョンが新しかった為、up2dateでインストールした。

まずは必要なRPMをwget。
[admin@www ~]$ cd work/rpms/; pwd
/home/admin/work/rpms

[admin@www rpms]$ wget http://ftp.riken.jp/Linux/centos/4/os/i386/CentOS/RPMS/libtiff-3.6.1-12.i386.rpm
[admin@www rpms]$ wget http://ftp.riken.jp/Linux/centos/4/os/i386/CentOS/RPMS/libtiff-devel-3.6.1-12.i386.rpm
[admin@www rpms]$ wget http://ftp.riken.jp/Linux/centos/4/os/i386/CentOS/RPMS/ImageMagick-6.0.7.1-17.i386.rpm
[admin@www rpms]$ wget http://ftp.riken.jp/Linux/centos/4/os/i386/CentOS/RPMS/ImageMagick-devel-6.0.7.1-17.i386.rpm

[admin@www rpms]$ su
[root@www rpms]# up2date install libexif-devel
あとはrpmコマンドでインストール
[root@www rpms]# rpm -ivh libtiff-3.6.1-12.i386.rpm
[root@www rpms]# rpm -ivh libtiff-devel-3.6.1-12.i386.rpm
[root@www rpms]# rpm -ivh ImageMagick-6.0.7.1-17.i386.rpm
[root@www rpms]# rpm -ivh ImageMagick-devel-6.0.7.1-17.i386.rpm



RMagick


[root@www rpms]# /usr/local/ruby/bin/gem  install -v 1.13.0 rmagick
しばらく待たされる。
終わるまで待つ。

[root@www admin]# /usr/local/ruby/bin/gem list

*** LOCAL GEMS ***

actionmailer (1.3.3)
actionpack (1.13.3)
actionwebservice (1.2.3)
activerecord (1.15.3)
activesupport (1.4.2)
rails (1.2.3)
rake (0.8.1)
rmagick (1.13.0)
終了

半袖 at 14:45|PermalinkComments(0)TrackBack(0)

2008年04月09日

どうもパフォーマンスが低下してるな・・・と思ったら/tmpに多量のファイル

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

システムコールを追いかけてみた


大した処理をしてないはずのスクリプトのCPU使用率が高くなっていた。
straceでシステムコールを追いかけてみた。

どうも/tmp配下のファイルが多量に出て来ている。
早速いくつファイルがあるのか調査してみた。

# cd /tmp
# ls | wc -l
1191236

そして、大リストラが始まったのであった。

1ディレクトリに119万エントリもあれば
オーバーヘッドが大きくなり、パフォーマンス低下しても不思議ではない。


半袖 at 15:40|PermalinkComments(1)TrackBack(0)

2008年02月05日

Cache::Memcachedが原因?でサーバ過負荷多発

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

ログインしようとしたら、反応が鈍い


20秒くらい経過して、やっとログインプロンプトが現れた。

「やばい…過負荷だ」

やっとログイン出来た所で、すぐさまapacheをダウンさせた。
最近、apacheにメモリを食いまくられる現象が多発している為だ。



過負荷状態のapacheログ


Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Memcachedが悪さしてる模様。

それが起因となり、apacheにメモリを食い尽くされ、swapも食い尽くされる。
MySQLへの接続も失敗する始末。



バージョン情報


「Debian GNU/Linux (sid)」を使用
$ dpkg -l | awk '$1 == "ii" && $2 ~ "^(apache|mysql|memcached|libcache-memcached-perl|libapache-mod-perl)" {print $2, $3}'
apache 1.3.34-4.1
apache-common 1.3.34-4.1
apache2-mpm-prefork 2.2.6-3
apache2-utils 2.2.6-3
apache2.2-common 2.2.6-3
libapache-mod-perl 1.29.0.4-4.1
libcache-memcached-perl 1.24-1
memcached 1.2.2-1
mysql-client-5.0 5.0.51-2
mysql-common 5.0.51-2
mysql-server-5.0 5.0.51-2

この過負荷頻発状況から脱出したい。


半袖 at 10:50|PermalinkComments(1)TrackBack(0)

2007年09月27日

Apache2のmoduleをDSOでビルド&インストール「mod_proxy」

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

■mod_proxyがない

とある検証をしようとした。
configを修正したら起こられた。



■moduleを追加

# cd /path/to/build/httpd-2.2.3/modules/proxy
# /usr/local/apache2/bin/apxs -i -c mod_proxy.c
# /usr/local/apache2/bin/apxs -i -c mod_proxy_http.c

楽過ぎる。



■問題発生
# /usr/local/apache2/bin/apachectl configtest
httpd: Syntax error on line ... of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_proxy.so into server: /usr/local/apache2/modules/mod_proxy.so: undefined symbol: proxy_lb_workers

何だこれ。



■解決: mod_proxy*には、proxy_util.cが必要

# /usr/local/apache2/bin/apxs -i -c mod_proxy.c proxy_util.c
# /usr/local/apache2/bin/apxs -i -c mod_proxy_http.c proxy_util.c
# /usr/local/apache2/bin/apachectl configtest
Syntax OK

やっと動いた。


半袖 at 12:35|PermalinkComments(0)TrackBack(0)

2007年09月22日

daemontoolsの/service/に、サービスを追加するスクリプト「addsv.sh」

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

■/service/に新サービスを追加したいけど面倒くさい

daemontoolsはサービスプロセスの起動管理をしてくれる便利ツール。
サービスを新規追加する時、その独特のディレクトリ構成のおかげで、
少々面倒な作業が発生する。毎回覚えてられない。

とにかく面倒くさいのだ。



■だったら、スクリプトを作ってしまえ

簡単な事をさせたい場合、シェルスクリプトは非常に便利だ。
面倒な処理をスクリプトにやらせてしまう。

そうして作られたスクリプトは下記の通り。


▼addsv.sh
#!/bin/sh
#
# http://blog.hansode.org/
#
# $0 <service name>
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH


#
# usage
#
usage() {
  cat <<EOS
usage:
  $0 <service name>

EOS
  exit 1
}



#
# main
#
[ $# = 1 ] || usage

svdir=/service
svname=$(basename $1)
acct_name=logadmin
acct_group=logadmin

[ -d ${svdir}  ] || usage
[ -z ${svname} ] && usage
[ -d ${svdir}/.${svname} ] && usage
id ${acct_name} 2>&1 >/dev/null || { echo "no such acct: ${acct_name}"; usage; }



# directory, file

mkdir    ${svdir}/.${svname}
chmod +t ${svdir}/.${svname}
mkdir    ${svdir}/.${svname}/log
mkdir    ${svdir}/.${svname}/log/main
touch    ${svdir}/.${svname}/log/status
chown ${acct_name}:${acct_group} ${svdir}/.${svname}/log/main
chown ${acct_name}:${acct_group} ${svdir}/.${svname}/log/status


# run script

cat <<EOS > ${svdir}/.${svname}/run
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

exec 2>&1
sleep 3

EOS
chmod +x ${svdir}/.${svname}/run


cat <<EOS > ${svdir}/.${svname}/log/run
#!/bin/sh
exec setuidgid ${acct_name} multilog t s1000000 n100 ./main
EOS

chmod +x ${svdir}/.${svname}/log/run



exit 0

▼必要に応じて変更
acct_name=logadmin
acct_group=logadmin
log管理用アカウントを設定する。
スクリプトでは「logadmin」と言うUNIXアカウントを設定した場合の例。



■使い方

自分は上記スクリプトを/service/addsv.shとして、
/service/ディレクトリ直下においている。

▼例: 「new-service」と言うサービスを追加
$ cd /service/
$ sudo ./addsv.sh new-service
addsv.shすると、ドット付きディレクトリが作成される。
その後は、追加したサービスディレクトリ直下のrunファイルに管理したいプロセス等を記述。
$ sudo mv -i .new-service new-service
$ sudo svstat ./new-service



■関連リンク
daemontools
半袖野郎 daemontools

半袖 at 15:35|PermalinkComments(2)TrackBack(0)

2007年08月27日

初心に帰ってMRTGを設定した

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

■サーバ統計情報
普段、統計情報の必要性はさほど無い。
長期間サーバを管理する場合、統計は重要となって来る。


▼サーバ統計情報
・負荷観察
・負荷予測
・スケールアップ,スケールアウトの検討材料

サーバの統計情報を記録する手段の1つがMRTG。



■初心に帰る
久々に初心に帰って統計情報を取得,記録する設定をした。
振り返りを兼ねて、ここに作業記録を残す。


作業記録は下記の通り
続きを読む

半袖 at 19:15|PermalinkComments(1)TrackBack(0)

内部コンテンツNSで名前解決出来ない問題を解決

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

■特殊な環境で起きる

同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。



▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照


▼背景
・外部からの接続にはプライベートネットワークのサーバへ、
 ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
 グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
 ルーティングしてくれない


【図1: 外部ネットワークからの接続】




【図2: 内部ネットワークからの接続】



ルーターのグローバルIPアドレスが返って来てしまう。



▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。

tinydns, dnscacheを設定

hostコマンドで名前解決出来る事を確認


【図3: 内部ネットワーク内で解決した名前解決】




しかし、hostコマンドだけでは足りなかったのだ…



■hostコマンド v.s. telnetコマンド

▼ある日
やむ:『telnet web.example.com 80 とすると、ルーターに接続してしまうよ』


hostコマンドで確認すると問題ない。
しかし、telnetコマンドを使うと確かにルーターのIPアドレスが返って来る。

何だコレは?!


▼仮説
・hostコマンドとtelnetコマンドでは名前解決ロジックが違う
・telnetを実行したサーバのリゾルバが設定不十分
・nsswitchの設定で、検索優先順位が意図しない物を最優先にしている


▼検証: straceコマンド
コマンドの挙動を確認する時に使うのがstraceコマンド。
straceコマンドを使う事で、システムコールをトレース出来る。

$ strace host web.examle.com
$ strace telnet web.examle.com 80


この2つのコマンドを実行し、
どのファイルをopenしているのかを観察してみた。


▼新たな疑惑
そしてnscdのキャッシュ疑惑が生まれた。
どうもnscdがあやしいぞ?


■容疑者nscd

▼/etc/nscd.conf

nscdの設定ファイルは/etc/nscd.conf。
こいつの設定項目を確認していった。

その中で日と際目立つヤツを発見。
enable-cache hosts yes


▼仮説
enable-cache hostに違いない。
enable-cache hosts yes


▼検証
yesをnoへ変更
$ sudo cp -pi /etc/nscd.conf /etc/nscd.conf.0
$ sudo vi /etc/nscd.conf
$ diff /etc/nscd.conf.0 /etc/nscd.conf
enable-cache hosts no
$ sudo /etc/init.d/nscd restart


▼結果
$ telnet web.examle.com 80
Trying 192.168.0.80...
Connected to web.example.com.
Escape character is '^]'.
^]
telnet> close
Connection closed.


成功だ



■まとめ
▼発生する環境
・内部コンテンツNSを立てている
・nscdを使っている
▼解決策
・『enable-cache hosts no』にする

『何故nscd使うの?』と言う突っ込みは今回の議論の対象外。


■関連リンク
やむにやまれず: Air Stationに変えたらLAN側自社サービスにアクセスできなくなった
tech memo: cached


半袖 at 01:30|PermalinkComments(0)TrackBack(0)

2007年08月13日

makeでサーバ管理効率を上げる Postfix編

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

自分は良くmakeを使う(Makefileを書く)。


▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。


この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。

Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。


効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。

▼confを結合する時のイメージ
d47f193a.png


※画像クリックで拡大表示


▼/etc/postfix/main.cfを結合生成プロセス

・/etc/postfix/parts.d-common/main.cf 管理サーバ群共通設定
・/etc/postfix/parts.d-local/main.cf サーバ特有設定
  ↓
  ↓2つを結合する
  ↓
・/etc/postfix/master.cf


▼Makefile例
PARTS_COMMON=parts.d-common
PARTS_LOCAL=parts.d-local
MAIN_CFS=$(PARTS_COMMON)/main.cf $(PARTS_LOCAL)/main.cf

all: main.cf

main.cf: $(MAIN_CFS)
cat $(MAIN_CFS) > $@
echo $@ done.



▼実行結果
$ make
cat parts.d-common/main.cf parts.d-local/main.cf > main.cf
echo main.cf done.
main.cf done.


makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。


結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。

makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。

広がるmakeの世界。


半袖 at 23:35|PermalinkComments(0)TrackBack(0)

2007年07月06日

/etc/motdを有効活用

livedoorClipに登録 livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

/etc/motdはサーバへログインした時に出るメッセージ
複数のサーバを管理している場合、/etc/motdを有効活用しない手は無い。



▼/etc/motdへ書いておいた方が良い事
・サーバの用途
 ・例: MTA(Postfix)
・サーバ関連情報のURI
 ・wikiでも何でもいい
・関連するサーバの構成図、IPアドレス・ホスト名一覧
 ・構成図を管理しているマスターURI
 ・構成変更があれば、マスタURIの情報を変更し、関連サーバへ配布
・その他メモ
 ・作業履歴


/etc/motdを生成するスクリプトを作り、cronで定期的に更新するのも良いかな。
過去に/etc/motdを書いた自分に助けられた事は多々ある。

/etc/motdは未来の自分への手紙。
記憶に依存するサーバ管理にさよなら。


半袖 at 10:45|PermalinkComments(0)TrackBack(0)