サーバ管理
2009年09月20日
日本実業出版社
売り上げランキング: 16140
こんな本を探していた
Linuxの起動とinitの解説が書かれた本を探していた。
いくつかの本屋で探してみたけど、丁度良い本見当たらなかった。
そして、ついに見つけたのがこの一冊。
Linuxをある程度使った人向けの一冊だ。
ApacheやMySQLに関する内容は載っていない。
そもそも、載っていなくていい。
他とは違う一冊に仕上がっている。
- 設定のしくみ
- initとは
- 定期実行って?
- マウント
- ext2とext3
- ReiserFS
- autofs
- NFS/Samba/smbfs
- ユーザー管理
- シェルオプション
- 環境変数・シェル変数
- 日本語環境
- フォント
- XDMとstartx
- Xサーバ
- ネットワークの基本
- inetd/xinetd
- SSH
- ブートローダ
- LILO/GRUB
- カーネル再構築
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年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
この過負荷頻発状況から脱出したい。
2008年01月24日
仮説「楽しければ積極的に管理するはず」
先日、データセンターのサーバ棚卸し作業を行った。
管理表との差分探し。差分無く常に更新されるのが健全な状態だ。
誰かのちょっとした油断や後回しにした事、色々と要因はあるだろう。
様々な要因で健全な状態が保たれなくなる事が発生する。
積極的になれないのは、楽しくないから。
そう仮定し、果たして面白く、かつ誰もがやりたがるようなのは何だろう。
ニンテンドーDSで棚卸し出来たらどうなんだ?
入力インターフェースとしてのニンテンドーDSの魅力
DSの魅力を挙げてみる。
- 持ってる人が多い
- ペン入力可能
- Wi-Fi対応
- マイク内臓なので音声認識可能
ざっとこんなものだろう。
データ入力には手書きペン入力でも音声入力でも、どちらでもいい。
売り上げランキング: 62
楽しくするには…ゲーム性を持たせる
とにかく最終更新からの期間が短ければ短い程いい。
積極的に情報を更新したくなるような動機例。
- 最終更新から一定期間経過したラックを対象とする
- 誰よりも早く更新したらポイント獲得
少なくとも日常管理している人は楽しく管理出来るだろうと思う。
ちょっと時間あるなぁ。「みん棚」やろうかな。
そんな会話が聞こえる日が来るかも知れない。
誰が作るのさ
企画書としてまとめて、自分が作る。
DS用ソフト開発が仕事になるって楽しそう。
そして完成したら、幸せになれる人がたくさん居るはずだ。
遊び心を持って仕事出来たら素晴しい。
2008年01月21日
2007年12月19日
おじいちゃんの血圧が高い
「おじいちゃんサーバ」のload averageが2.0前後をうろちょろしている。原因を調査してみると、estmasterがメモリを使いまくっている事が分かった。
物理メモリだけでなく、スワップもまた使っている。
おじいちゃんの記憶力
$ egrep '^MemTotal|^SwapTotal' /proc/meminfo MemTotal: 515732 kB SwapTotal: 995988 kB大分古いマシン。
2ヶ月前くらいにメモリを128Mから512Mへ増やした。
緊急オペ
キャッシュサイズを少なくすると改善しそうだ。昨夜、緊急オペをする事にした。
手術内容は下記の通り。
$ cd /var/lib/hyperestraier/estmaster/; pwd /var/lib/hyperestraier/estmaster $ sudo cp -pi _conf _conf.0 $ sudo vi _conf $ diff _conf.0 _conf 62c62,63 < scalepred: 2 --- > #scalepred: 2 > scalepred: 3 87c88,89 < cacheanum: 8192 --- > #cacheanum: 8192 > cacheanum: 4096 90c92,93 < cachetnum: 1024 --- > #cachetnum: 1024 > cachetnum: 512 93c96,97 < cachernum: 256 --- > #cachernum: 256 > cachernum: 128 $ sudo /etc/init.d/hyperestraier restart
手術後の経過
今朝の血圧を測ってみた。1.0以内で落ち着いている。手術成功だ!
老体にはキャッシュを少なくするのが良い様だ。
2007年12月17日
検証サーバの限界…そして次の一手
メインで使用している「お爺ちゃんサーバ」。その「お爺ちゃんサーバ」のリソースの大半をspamdが使っている。
自分が使用可能な検証サーバが複数あるので、試しにspamdを外部サーバへ切替えてみた。
spamc(procmail)の設定
procmailのレシピ例:0fw | /usr/bin/spamc -u spamd -d spamd.example.comspamdに-dオプションを指定すると、サーバを指定可能。
spamdの設定
設定の詳細は割愛。分かる人にはわかる設定。自分はdaemontoolsが好きなのでsuperviseとenvdirでプロセスを管理している。
envdirを使うと、共通項目とサーバ固有の設定を分離出来る点がとても良い。
# cat /service/spamd-shared-ro/run
#!/bin/sh
#
# for spamd-ro (read-only)
#
exec 2>&1
sleep 3
PATH=/sbin:/bin:/usr/sbin:/usr/bin
exec envdir ./env sh -c '
exec /usr/sbin/spamd \
--siteconfigpath=${SITECONFIGPATH:-/etc/spamassassin/spamd-ro} \
--helper-home-dir=${HELPERHOMEDIR:-/var/lib/spamd/ro} \
--username=${USERNAME:-spamd} \
--groupname=${GROUPNAME:-spamd} \
--max-children=${MAXCHILDREN:-2} \
--debug=${DEBUGAREAS} \
--syslog=${SYSLOG} \
--allowed-ips=${ALLOWEDIPS:-127.0.0.1} \
--listen-ip=${LISTENIP:-127.0.0.1}
'
allowd-ipsには接続を許可する元IPアドレスを指定する。これにより、論理的でも物理的でもいいけど、spamcとspamdを別サーバで動かせる。
効果
[変更前] 作業をしていてストレスを感じる事がたたあった。↓
[変更後] ストレスを感じなくなった。
共用spamd構想
そこそこのスペックのspamdサーバと、数台のspamcサーバで検証するのはどうなんだろうか。
社内向けに『spamdだけサービス提供』と言うのも面白い…かな。
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の世界。


