サーバ管理
2010年01月25日
思わず手直ししたくなるスクリプト
「ログを吐き出しているけど、ロック処理が無い…」と言う、何とも初歩的なスクリプトがあったとする。
そんなログをローテートしたい。
▼要望
- ログローテートする
- ログは全て保存し、消さない
- ファイル名に日付を付けたい
▼/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設定ファイル内にファイル操作処理を記述出来るのは嬉しい。
- サーバ管理においてはシェルスクリプトを書ける事、それは大きな武器だと再認識。
2009年07月09日
概要
プロジェクトおよび顧客の数だけ増えて行きそうだったので、
今後の為に、量産しやすい仕組みを作ってみた。
- 「http://$(案件名).redmine.example.jp/」でアクセスする事を想定
- 案件名指定でredmineを追加可能にする
作業環境
- Debian GNU/Linux 5.0.2
- apache2-mpm-prefork 2.2.9-10+lenny3
- mysql-server 5.0.51a-24+lenny1
- redmine 0.8-stable
- passenger 2.2.4
作業内容
■インスタンス作成
▼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インターフェースから追加する仕組み、アカウント発行などの仕組みを取り入れればいいだろう。
個人的には追加スクリプトを作る所までで要件を満たせるので終わりにしておく。
2009年07月06日
作業環境
ファイルサーバが必要になったので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
2009年02月28日
さくらレンタルサーバでDebianを使うの続き
chroot環境構築時の方針は下記のものとする
- host環境は可能な限り手をつけない
- デーモンプロセスはdaemontoolsで管理する物とする
- host環境用sshとguest環境用sshをそれぞれ用意する
作業内容
作業対象を明確化するため、プロンプトで示す
| プロンプト | 内用 |
|---|---|
| debian | Debianがインストールされている別サーバ |
| host | chroot呼び出し元 |
| guest | chroot環境下 |
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のツリーを他サーバへ持っていけば簡単に論理移転可能と言うメリットがある
2009年02月15日
2009年01月20日
作業概要
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
出力されていない事を確認出来た。
オライリー・ジャパン
売り上げランキング: 55870
2008年10月06日
無くなってからでは遅い
消えたら困る大事なデータを定期的に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
概要
- 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を利用
- タブから「AMIs and Instances」を選択
- 「Machine Images (AMIs)」から「+」をクリック
- 「AIM Manifest Path:」に 「centos5.0-2008081101/image.manifest.xml」を指定して「OK」
- 「Machine Images (AMIs)」に「centos5.0-2008081101/image.manifest.xml」がある事を確認
2008年10月03日
改めてメールサーバ構築のまとめ
久しぶりにメールサーバの設定作業を行った。
自分自身の復習目的に、以前書いたメールサーバ構築関連エントリのまとめなおしてみた。
自宅や中小企業用にはこれで間に合うのではないだろうか。
メールサーバ構成概要

主な機能
- Submissionポート
- SMTP-Auth
- IMAP4
- メールアカウント管理ツール
- 複数バーチャルドメイン
PostfixAdminの設定
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| db_pass | ******** |
ユーザー用Maildirディレクトリデザイン補足
今回、
- 『$(local-part)@$(domain)』のメールボックスを、
- 『$(domain)/$(local-part)』となるようにする
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 htdocsApacheの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が残っていると管理画面へアクセス出来ない。
# 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 domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-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-mysqldovecot.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 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
まとめ
- この構成にはスパムメール対策がない事に気づいた
- そのうちスパムメール対策も追加した物をまとめる…かも知れない
2008年10月01日
mongrel_clusterのメモでまとめたとおり
mongrel_clusterは
- 単に複数mongrel_railsの起動を起動管理
- 設定をYAML形式で記述可能
- フォアグラウンドでは起動させられない

daemontoolsを導入するに辺り、
fghackを使ってmongrel_clusterを管理すると言うてがあるのだろうけど、
自分はmongrel_clusterを使わない事にした。
mongrel_clusterが何をやっているのかを知ってからは、
mongrel_clusetr対する熱がすっかり冷めてしまったのだ…。
課題
何を解決しなければ行けないのかを上げてみる
- serversの扱いをどうするのか
- YAMLの設定項目はどのように設定するか
解決策
daemontoolsをある程度使っている人ならば恐らく当たり前な事。
- serversの数だけserviceを作成
- YAMLの設定項目はenvdirで設定する

作業内容
サービス追加
# 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 envenvdir用ファイル作成
# echo 127.0.0.1 > ADDRESS # echo /var/lib/rails/project/ > CHDIR # echo production > ENVIRONMENT # echo www-data > GROUP # echo 8080 > PORT # echo rails > USERrunの確認
# cd ../ # sh -n ./run # sh -x ./run問題無ければサービス対象にする
# cd /service # mv -i .mongrel_cluster-0 mongrel_cluster-0同じ作業を繰り返し、
ノード名とPORTファイルの設定が違うmongrelサービスのノードを増加させて行く。
| ノード名 | env/PORT |
| /service/mongrel_cluster-0 | 8080 |
| /service/mongrel_cluster-1 | 8081 |
| /service/mongrel_cluster-2 | 8082 |
| /service/mongrel_cluster-3 | 8083 |
あくしゅ!はこの仕組みで管理してます。
まとめ
mongerel_clusterを使わないメリット。
- daemontoolsにより、プロセスが異常終了しても起動してくれる
- グループの中の特定ノードだけ起動停止が可能になる
- ログの扱いはmultilog任せ
daemontoolsは素敵です。
関連リンク
2008年09月30日

- mongrel_cluster_ctlがmongrel_railsを起動管理する
- 設定ファイルはYAML形式
- 代表的設定項目
- 起動サーバ数
- 開始ポート番号
- 起動サーバ数が2以上であれば、
「開始ポート番号+1」をポート番号として2つ目のmongrel_railsを起動
- 代表的設定項目
- mod_proxy_balancerなどのロードバランサーと組み合わせた環境向け
思い込み
「cluster」と言うから素晴らしい仕組みだと思い込んでいたら、大したことはない。
- 単に複数mongrel_railsの起動を起動管理
- 設定をYAML形式で記述可能
- フォアグラウンドでは起動させられない
さて困ったな。
2008年08月12日
そう言う事か
00:00に実行されるようcronを設定し、一夜が明けた。
確認してみると、動いてない…?
何故だ…と思ったら、タイムゾーンがJSTになっていなかった。
# cp /usr/share/zoneinfo/Japan /etc/localtime # date
これで解決。
翔泳社
売り上げランキング: 8472
2008年06月05日
環境
- ディストリビューション
- 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 -Asa1の「*/10」を「*/5」としてやれば5分毎。
検証環境では毎分の変動を観察したいので「*」とした。
保管ログファイル数を増やす
rhel4# cat /etc/sysconfig/sysstat # How long to keep log files (days), maximum is a month HISTORY=7
長期間保管させたい場合はHISTORYを増やすだけ。
2008年05月08日
メールを受信
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-mysqldovecot.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 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(4/n) - Postfixの設定
構成イメージは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 domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-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サーバの設定
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
管理ツールで管理負荷軽減
エンジニアであればコマンドラインからの作業で事足りる。
納品する場合など、相手がエンジニアとは限らない。
管理ツールを導入する事により、覚える事は最小限。
今回はメールアカウント管理ツールとしてPostfixAdminを使う。
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| 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 htdocsApacheの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が残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/
この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。
続きは次回。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
RHEL4のPostfixでは駄目
出鼻をくじかれる。
Postfixが対応するルックアップテーブル一覧を確認してみた。
$ /usr/sbin/postconf -m btree cidr environ hash ldap nis pcre proxy regexp static unixmysqlが無い!!
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.rpmquota修正用パッチ
$ 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/SPECSspecファイル修正。
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.rpmmysqlが入っている事を確認
$ /usr/sbin/postconf -m btree cidr environ hash ldap mysql nis pcre proxy regexp static unixOK
関連ページ
環境
| ディストリビューション | Red Hat Enterprise Linux ES release 4 (Nahant Update 6) |
| Ruby | ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux] |
| Gems | 1.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)終了
2008年04月09日
2008年02月05日
ログインしようとしたら、反応が鈍い
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
この過負荷頻発状況から脱出したい。
2007年09月27日
とある検証をしようとした。
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
やっと動いた。
2007年09月22日
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=logadminlog管理用アカウントを設定する。
スクリプトでは「logadmin」と言うUNIXアカウントを設定した場合の例。
■使い方
自分は上記スクリプトを/service/addsv.shとして、
/service/ディレクトリ直下においている。
▼例: 「new-service」と言うサービスを追加
$ cd /service/ $ sudo ./addsv.sh new-serviceaddsv.shすると、ドット付きディレクトリが作成される。
その後は、追加したサービスディレクトリ直下のrunファイルに管理したいプロセス等を記述。
$ sudo mv -i .new-service new-service $ sudo svstat ./new-service
■関連リンク
・daemontools
・半袖野郎 daemontools
2007年08月27日
普段、統計情報の必要性はさほど無い。
長期間サーバを管理する場合、統計は重要となって来る。
▼サーバ統計情報
・負荷観察
・負荷予測
・スケールアップ,スケールアウトの検討材料
サーバの統計情報を記録する手段の1つがMRTG。
■初心に帰る
久々に初心に帰って統計情報を取得,記録する設定をした。
振り返りを兼ねて、ここに作業記録を残す。
作業記録は下記の通り
続きを読む
同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。
▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照
▼背景
ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
ルーティングしてくれない
【図1: 外部ネットワークからの接続】

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

ルーターのグローバルIPアドレスが返って来てしまう。
▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。
↓
hostコマンドで名前解決出来る事を確認
【図3: 内部ネットワーク内で解決した名前解決】

しかし、hostコマンドだけでは足りなかったのだ…
■hostコマンド v.s. telnetコマンド
▼ある日
hostコマンドで確認すると問題ない。
しかし、telnetコマンドを使うと確かにルーターのIPアドレスが返って来る。
何だコレは?!
▼仮説
・hostコマンドとtelnetコマンドでは名前解決ロジックが違う
・telnetを実行したサーバのリゾルバが設定不十分
・nsswitchの設定で、検索優先順位が意図しない物を最優先にしている
▼検証: straceコマンド
コマンドの挙動を確認する時に使うのがstraceコマンド。
straceコマンドを使う事で、システムコールをトレース出来る。
$ strace telnet web.examle.com 80
この2つのコマンドを実行し、
どのファイルをopenしているのかを観察してみた。
▼新たな疑惑
そしてnscdのキャッシュ疑惑が生まれた。
どうもnscdがあやしいぞ?
■容疑者nscd
▼/etc/nscd.conf
nscdの設定ファイルは/etc/nscd.conf。
こいつの設定項目を確認していった。
その中で日と際目立つヤツを発見。
▼仮説
enable-cache hostに違いない。
▼検証
yesをnoへ変更
$ sudo vi /etc/nscd.conf
$ diff /etc/nscd.conf.0 /etc/nscd.conf
enable-cache hosts no
$ sudo /etc/init.d/nscd restart
▼結果
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
2007年08月13日
▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。
この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。
Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。
効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。
▼confを結合する時のイメージ

※画像クリックで拡大表示
▼/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_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.
▼実行結果
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の世界。
2007年07月06日
複数のサーバを管理している場合、/etc/motdを有効活用しない手は無い。
▼/etc/motdへ書いておいた方が良い事
・サーバの用途
・例: MTA(Postfix)
・サーバ関連情報のURI
・wikiでも何でもいい
・関連するサーバの構成図、IPアドレス・ホスト名一覧
・構成図を管理しているマスターURI
・構成変更があれば、マスタURIの情報を変更し、関連サーバへ配布
・その他メモ
・作業履歴
/etc/motdを生成するスクリプトを作り、cronで定期的に更新するのも良いかな。
過去に/etc/motdを書いた自分に助けられた事は多々ある。
/etc/motdは未来の自分への手紙。
記憶に依存するサーバ管理にさよなら。

