サーバ管理

2009年09月20日

図解でわかるLinux環境設定のすべて

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

図解でわかるLinux環境設定のすべて
西村 めぐみ
日本実業出版社
売り上げランキング: 16140

こんな本を探していた

Linuxの起動とinitの解説が書かれた本を探していた。
いくつかの本屋で探してみたけど、丁度良い本見当たらなかった。
そして、ついに見つけたのがこの一冊。

Linuxをある程度使った人向けの一冊だ。
ApacheやMySQLに関する内容は載っていない。
そもそも、載っていなくていい。

他とは違う一冊に仕上がっている。

  • 設定のしくみ
  • initとは
  • 定期実行って?
  • マウント
  • ext2とext3
  • ReiserFS
  • autofs
  • NFS/Samba/smbfs
  • ユーザー管理
  • シェルオプション
  • 環境変数・シェル変数
  • 日本語環境
  • フォント
  • XDMとstartx
  • Xサーバ
  • ネットワークの基本
  • inetd/xinetd
  • SSH
  • ブートローダ
  • LILO/GRUB
  • カーネル再構築


半袖 at 23:20|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年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)

2008年01月24日

みんなで棚卸しDS

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

仮説「楽しければ積極的に管理するはず」


先日、データセンターのサーバ棚卸し作業を行った。
管理表との差分探し。差分無く常に更新されるのが健全な状態だ。

誰かのちょっとした油断や後回しにした事、色々と要因はあるだろう。
様々な要因で健全な状態が保たれなくなる事が発生する。

積極的になれないのは、楽しくないから。
そう仮定し、果たして面白く、かつ誰もがやりたがるようなのは何だろう。

ニンテンドーDSで棚卸し出来たらどうなんだ?



入力インターフェースとしてのニンテンドーDSの魅力


DSの魅力を挙げてみる。
  • 持ってる人が多い
  • ペン入力可能
  • Wi-Fi対応
  • マイク内臓なので音声認識可能

ざっとこんなものだろう。
データ入力には手書きペン入力でも音声入力でも、どちらでもいい。

ニンテンドーDS Lite クリスタルホワイト
任天堂 (2006/03/02)
売り上げランキング: 62



楽しくするには…ゲーム性を持たせる


とにかく最終更新からの期間が短ければ短い程いい。
積極的に情報を更新したくなるような動機例。
  • 最終更新から一定期間経過したラックを対象とする
  • 誰よりも早く更新したらポイント獲得
全くの無関係者が興味を持つかどうかは分からないけど、
少なくとも日常管理している人は楽しく管理出来るだろうと思う。

ちょっと時間あるなぁ。「みん棚」やろうかな。

そんな会話が聞こえる日が来るかも知れない。



誰が作るのさ


企画書としてまとめて、自分が作る。
DS用ソフト開発が仕事になるって楽しそう。
そして完成したら、幸せになれる人がたくさん居るはずだ。

遊び心を持って仕事出来たら素晴しい。


半袖 at 02:20|PermalinkComments(1)TrackBack(0)

2008年01月21日

おじいちゃんサーバに渇!200万エントリのテーブルに「ALTER TABLE」

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

ALTER TABLE


mysql> alter table whois modify ......;
Query OK, 2038362 rows affected (1 hour 19 min 8.65 sec)
Records: 2038362  Duplicates: 0  Warnings: 0
固まってるのかと心配になるくらい待たされた…。


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

2007年12月19日

おじいちゃんサーバのチューニング「Hypere Straier」

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

おじいちゃんの血圧が高い

「おじいちゃんサーバ」の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以内で落ち着いている。手術成功だ!

老体にはキャッシュを少なくするのが良い様だ。


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

2007年12月17日

SpamAssassinでspamメール対策 (20/n) : spamdを別サーバで動かす

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

検証サーバの限界…そして次の一手

メインで使用している「お爺ちゃんサーバ」。
その「お爺ちゃんサーバ」のリソースの大半をspamdが使っている。
自分が使用可能な検証サーバが複数あるので、試しにspamdを外部サーバへ切替えてみた。

spamc(procmail)の設定

procmailのレシピ例
:0fw
| /usr/bin/spamc -u spamd -d spamd.example.com
spamdに-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だけサービス提供』と言うのも面白い…かな。


半袖 at 11:55|PermalinkComments(0)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)