サーバ管理
2008年08月12日
そう言う事か
00:00に実行されるようcronを設定し、一夜が明けた。
確認してみると、動いてない…?
何故だ…と思ったら、タイムゾーンがJSTになっていなかった。
# cp /usr/share/zoneinfo/Japan /etc/localtime # date
これで解決。
CentOS徹底入門 第2版 (DVD付)
posted with amazlet at 08.08.12
飛田 伸一郎 中島 能和
翔泳社
売り上げランキング: 8472
翔泳社
売り上げランキング: 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.sharedlink.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日
■mod_proxyがない
とある検証をしようとした。
configを修正したら起こられた。
■moduleを追加
楽過ぎる。
■問題発生
何だこれ。
■解決: mod_proxy*には、proxy_util.cが必要
やっと動いた。
とある検証をしようとした。
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日
■/service/に新サービスを追加したいけど面倒くさい
daemontoolsはサービスプロセスの起動管理をしてくれる便利ツール。
サービスを新規追加する時、その独特のディレクトリ構成のおかげで、
少々面倒な作業が発生する。毎回覚えてられない。
とにかく面倒くさいのだ。
■だったら、スクリプトを作ってしまえ
簡単な事をさせたい場合、シェルスクリプトは非常に便利だ。
面倒な処理をスクリプトにやらせてしまう。
そうして作られたスクリプトは下記の通り。
▼addsv.sh
▼必要に応じて変更
スクリプトでは「logadmin」と言うUNIXアカウントを設定した場合の例。
■使い方
自分は上記スクリプトを/service/addsv.shとして、
/service/ディレクトリ直下においている。
▼例: 「new-service」と言うサービスを追加
その後は、追加したサービスディレクトリ直下のrunファイルに管理したいプロセス等を記述。
■関連リンク
・daemontools
・半袖野郎 daemontools
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。
■初心に帰る
久々に初心に帰って統計情報を取得,記録する設定をした。
振り返りを兼ねて、ここに作業記録を残す。
作業記録は下記の通り
続きを読む
普段、統計情報の必要性はさほど無い。
長期間サーバを管理する場合、統計は重要となって来る。
▼サーバ統計情報
・負荷観察
・負荷予測
・スケールアップ,スケールアウトの検討材料
サーバの統計情報を記録する手段の1つがMRTG。
■初心に帰る
久々に初心に帰って統計情報を取得,記録する設定をした。
振り返りを兼ねて、ここに作業記録を残す。
作業記録は下記の通り
続きを読む
■特殊な環境で起きる
同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。
▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照
▼背景
【図1: 外部ネットワークからの接続】


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


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


しかし、hostコマンドだけでは足りなかったのだ…
■hostコマンド v.s. telnetコマンド
▼ある日
hostコマンドで確認すると問題ない。
しかし、telnetコマンドを使うと確かにルーターのIPアドレスが返って来る。
何だコレは?!
▼仮説
・hostコマンドとtelnetコマンドでは名前解決ロジックが違う
・telnetを実行したサーバのリゾルバが設定不十分
・nsswitchの設定で、検索優先順位が意図しない物を最優先にしている
▼検証: straceコマンド
コマンドの挙動を確認する時に使うのがstraceコマンド。
straceコマンドを使う事で、システムコールをトレース出来る。
この2つのコマンドを実行し、
どのファイルをopenしているのかを観察してみた。
▼新たな疑惑
そしてnscdのキャッシュ疑惑が生まれた。
どうもnscdがあやしいぞ?
■容疑者nscd
▼/etc/nscd.conf
nscdの設定ファイルは/etc/nscd.conf。
こいつの設定項目を確認していった。
その中で日と際目立つヤツを発見。
▼仮説
enable-cache hostに違いない。
▼検証
yesをnoへ変更
▼結果
成功だ
■まとめ
▼発生する環境
・内部コンテンツNSを立てている
・nscdを使っている
▼解決策
・『enable-cache hosts no』にする
『何故nscd使うの?』と言う突っ込みは今回の議論の対象外。
■関連リンク
・やむにやまれず: Air Stationに変えたらLAN側自社サービスにアクセスできなくなった
・tech memo: cached
同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。
▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照
▼背景
・外部からの接続にはプライベートネットワークのサーバへ、
ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
ルーティングしてくれない
ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
ルーティングしてくれない
【図1: 外部ネットワークからの接続】

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

ルーターのグローバルIPアドレスが返って来てしまう。
▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。
tinydns, dnscacheを設定
↓
hostコマンドで名前解決出来る事を確認
↓
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
$ 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
$ 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.
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を使う(Makefileを書く)。
▼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例
▼実行結果
makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。
結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。
makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。
広がるmakeの世界。
▼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_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.
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.
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を有効活用しない手は無い。
▼/etc/motdへ書いておいた方が良い事
・サーバの用途
・例: MTA(Postfix)
・サーバ関連情報のURI
・wikiでも何でもいい
・関連するサーバの構成図、IPアドレス・ホスト名一覧
・構成図を管理しているマスターURI
・構成変更があれば、マスタURIの情報を変更し、関連サーバへ配布
・その他メモ
・作業履歴
/etc/motdを生成するスクリプトを作り、cronで定期的に更新するのも良いかな。
過去に/etc/motdを書いた自分に助けられた事は多々ある。
/etc/motdは未来の自分への手紙。
記憶に依存するサーバ管理にさよなら。
複数のサーバを管理している場合、/etc/motdを有効活用しない手は無い。
▼/etc/motdへ書いておいた方が良い事
・サーバの用途
・例: MTA(Postfix)
・サーバ関連情報のURI
・wikiでも何でもいい
・関連するサーバの構成図、IPアドレス・ホスト名一覧
・構成図を管理しているマスターURI
・構成変更があれば、マスタURIの情報を変更し、関連サーバへ配布
・その他メモ
・作業履歴
/etc/motdを生成するスクリプトを作り、cronで定期的に更新するのも良いかな。
過去に/etc/motdを書いた自分に助けられた事は多々ある。
/etc/motdは未来の自分への手紙。
記憶に依存するサーバ管理にさよなら。
