hacks/サーバ管理
2010年07月26日
PHPからcurlを使うと何が良いのかは不明
要望があったので設定。
▼検証環境
- Ubuntu-8.04 LTS
- Linux 2.6.24-6-xen
▼環境構築
$ sudo apt-get install php5-curl $ sudo /etc/init.d/apache2 restart
▼テストコード
<?php
if ($ch = curl_init('http://www.google.com/')) {
echo curl_exec($ch);
curl_close($ch);
}
この場合、Googleのトップページが表示されれば良い。
2010年05月27日
ジョブ処理しないので、Hinemos Agent不必要
『Hinemos』を監視システムとして利用したい。
この場合、Hinemos Agentを利用したジョブ処理は不用。
Hinemos Agentはインストール不用で、snmpdの設定さえあれば良い。
「果たして、Hinemosを使う意味があるのか…?」と言う事は、今回の議論の対象外とする。
▼動作実績環境
- Amazon EC2
- Ubuntu 8.04 LTS(x86_64)
- Linux 2.6.24-6-xen
- Hinemos 3.1.4
- snmp 5.4.1~dfsg-4ubuntu4.3
作業内容
監視対象ノード
▼snmpdインストール
$ sudo apt-get -y install snmpd
▼使用IPアドレスを変更
$ sudo cp -pi /etc/default/snmpd /etc/default/snmpd.0 $ sudo vi /etc/default/snmpd $ diff /etc/default/snmpd.0 /etc/default/snmpd 11c11,12 < SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1' --- > #SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1' > SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 0.0.0.0'
▼managerからシステム情報を取得可能に設定変更
$ sudo cp -pi /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.0 $ sudo vi /etc/snmp/snmpd.conf $ diff /etc/snmp/snmpd.conf.0 /etc/snmp/snmpd.conf 61,62c61,62 < com2sec paranoid default public < #com2sec readonly default public --- > #com2sec paranoid default public > com2sec readonly default public
▼snmpd再起動
$ sudo /etc/init.d/snmpd restart
Hinemos Manager
▼システム情報取得可能かどうかを確認
$ snmpwalk -v 1 -c public [ 監視対象IPアドレス ] .1.3.6.1
※HOST情報を取得出来れば良い
あと書き
今回は、Amazon EC2のセキュリティグループ設定があるのでsnmp接続許可設定を無視している。
その他環境では、snmp接続の許可・拒否を考慮すべき。
2010年05月21日
Amazon EC2特有仕様により、環境構築に苦戦した
忘れないうちに手順をまとめておく。
苦戦要因は、IPアドレスだ。
Amazon EC2には、ローカルIPアドレスと、グローバルIPアドレスが存在する。
インスタンス内ではローカルIPアドレスを使用。
通常、Hinemosマネージャーに指定するのはIPアドレス。
果たして、Hinemosマネージャーに指定するIPアドレスは…?
▼動作実績環境
- CentOS-5.5(x86_64)
- Linux 2.6.21.7-2.fc8xen
- Hinemos 3.1.4
事前作業
▼Security Groupに新グループ追加
- tcp
- 1098
- 1099
- 3873
- 4444
- 4445
- 4446
- 4457
- 8009
- 8080
- 8083
- 24457
- udp
- 514
追加したグループを指定し、インスタンス起動する
作業内容
▼必要に応じてインストール
# yum -y update # yum -y install wget
▼Hinemosマネージャをダウンロード、伸張
# cd /tmp/ # wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fhinemos%2F45345%2Fhinemos_manager-3.1.4_rhel5_32.tar.gz' # tar zxvf hinemos_manager-3.1.4_rhel5_32.tar.gz # cd Hinemos_Manager-3.1.4_rhel5_32/
▼syslog-ngインストール時にエラーになるので、syslog-ng.confのテンプレートを修正
# cp -pi syslog-ng_setup.conf syslog-ng_setup.conf.0
# vi syslog-ng_setup.conf
# diff syslog-ng_setup.conf.0 syslog-ng_setup.conf
21c21
< source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
---
> source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); udp(ip(0.0.0.0) port(514)); };
※EC2のLinuxカーネルがIPv6を使えない為、IPv6アドレスにportをbindする際、起動に失敗する。失敗させないための策。
▼インストールスクリプトを実行
# export LANG=C # ./manager_installer_EN.sh Hinemos installation will be started, is that OK?(Y/N default:Y) >>enter<< The installation user and the installation directory are created. User hinemos is created. Creating mailbox file: File exists Changing password for user hinemos. New UNIX password:******** BAD PASSWORD: it is based on a dictionary word Retype new UNIX password:>>hinemos<< passwd: all authentication tokens updated successfully. User hinemos was created. Installation directory /opt/hinemos was created. Manager's IP address is set. Please input IP address of the server which installed Hinemos manager. [[ Public DNS Name ]]※ここでIPアドレスではなく、Public DNS Nameを指定する Is it [[ Public DNS Name ]]? (Y/N default:Y) Please input JBoss boot user name.(hinemos/root default:hinemos) >>enter<< hinemos is correct? (Y/N default:Y) >>enter<< Start copying required files into the installation directory. Please input ftp server's IP address needed by corrective run (default:127.0.0.1) >>enter<< JRE Do you agree to the above license terms? [yes or no] yes Starting system logger: [ OK ] /etc/hosts is changed. May I change /etc/hosts? (Y/N) Y /etc/hosts was changed. Please confirm it after the end of the installation. The database is initialized. waiting for postgres to start... done postgres started ALTER ROLE waiting for server to shut down.... done server stopped LDAP is initialized. The initialization of LDAP was completed. Hinemos manager installation was completed.
▼初回起動テスト
# su - hinemos -c /opt/hinemos/bin/hinemos_start.sh Hinemos starting waiting for postgres to start... done postgres started waiting for slapd to start... done slapd started waiting for jboss to start... ......................done jboss started Hinemos started
▼システム起動時にHinemosが起動するように設定
# cp -pi /etc/rc.local /tmp/rc.local.0 # vi /etc/rc.local # diff /tmp/rc.local.0 /etc/rc.local 9a10,11 > > /usr/bin/id hinemos && su - hinemos -c /opt/hinemos/bin/hinemos_start.sh
▼/etc/hostsを修正
# cp -pi /etc/hosts /tmp/hosts.0 # diff /tmp/hosts.0 /etc/hosts 2c2,3 < [[ Public DNS Name ]] domU-12-34-56-78-AB-90 --- > [[ Internal IPv4 ]] domU-12-34-56-78-AB-90 > [[ Internal IPv4 ]] [[ Public DNS Name ]]
インストールスクリプトは、IPアドレス指定を想定しているので、/etc/hostsが不正内容となる。その対応修正。
▼システム再起動
# reboot
▼この後、Hinemosクライアントを利用
- user: hinemos
- pass: ********
- host: jnp://[[ Public DNS Name ]]:1099
ログインに成功したら環境構築成功。
あと書き
Amazon EC2では「Public DNS Name」を上手に利用するべきだと分かった。
- 内部で名前解決するとローカルIPアドレス
- 外部で名前解決すると、グローバルIPアドレス
- ルーティングの関係?で、インスタンス内からグローバルIPアドレスへは通信出来ない
- 唯一、内外共通で利用出来るのが「Public DNS Name」と言う訳だ
これは別エントリで改めてまとめる予定。
自分でシンプル環境を構築しよう
前回は、Xen domU用イメージ作成スクリプトを作った。
今回はAmazon EC2用イメージ作成スクリプトだ。
▼動作実績環境
- CentOS-5.4(x86_64)
- Linux 2.6.18-164.15.1.el5xen
- yum 3.2.22
使用例
▼CentOS-5.5(2010/05/21現在最新)のツリーを作る
$ git clone git://github.com/hansode/vmbuilder.git $ cd vmbuilder/ec2/redhat/ $ sudo make-domu-tree.sh --dist=centos --ver=5.5 --arch=i386
※ --dist=fedora とすると、fedoraのツリーが構築される。
誰かが作るであろう最新版CentOSのAMIを、もう、待つ必要がない。
次はDebian系のイメージに着手予定。
【結果】問題解決に成功した
『Hinemos』をインストール。
インストール検証環境にてインストールを行い、動作確認を終えた。
その後、別環境への環境構築を行ったら問題にぶち当たった。
▼対象環境
- Amazon EC2
- CentOS-5.5 (i386)
- Linux 2.6.21.7-2.fc8xen
- Hinemos hinemos_manager-3.1.4_rhel5_32.tar.gz
▼syslog-ng起動失敗
# /etc/init.d/syslog-ng restart
Shutting down system logger: [ OK ]
Starting system logger: Error creating socket; error='Bad file descriptor (9)'
Error initializing source driver; source='s_net'
[FAILED]
同じ現象に遭遇した人を発見。
Re: Hinemosマネージャのインストール中にsyslog-ng起動失敗どなたか解決の方法をお知りでしたら、助けていただければ幸いです。
・・・?未解決のまま終わっている。
未解決は宜しく無い
こう言った原因解明にはstraceコマンドが便利だ。
困った時のstraceコマンド。
# strace /sbin/syslog-ng -d -f /etc/syslog-ng/syslog-ng.conf
...(省略)...
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(514), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 255) = 0
setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [0], 4) = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = -1 EAFNOSUPPORT (Address family not supported by protocol)
fcntl64(4294967295, F_GETFL) = -1 EBADF (Bad file descriptor)
fcntl64(4294967295, F_GETFD) = -1 EBADF (Bad file descriptor)
time(NULL) = 1274413588
write(2, "Error creating socket; error='Ba"..., 55Error creating socket; error='Bad file descriptor (9)'
) = 55
time(NULL) = 1274413588
write(2, "Error initializing source driver"..., 49Error initializing source driver; source='s_net'
) = 49
exit_group(2) = ?
PF_INET6…?
▼/etc/syslog-ng/syslog-ng.confを調査
source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
なるほど。
▼/etc/syslog-ng/syslog-ng.confを修正
# cp -pi /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.0
# vi /etc/syslog-ng/syslog-ng.conf
# diff /etc/syslog-ng/syslog-ng.conf.0 /etc/syslog-ng/syslog-ng.conf
92c92
< source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
---
> source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); udp(ip(0.0.0.0) port(514)); };
# /etc/init.d/syslog-ng restart
Shutting down system logger: [FAILED]
Starting system logger: [ OK ]
tcp6とudp6の設置を削除。
無事にsyslog-ngが起動した。
あと書き
- IPv6未対応環境だったのが原因
- 今回はIPv6を必要としないので問題ない
- 問題は解決しよう。
問題解決した時の達成感がタマラナイ。
2010年04月28日
RedHat系 domU環境構築
検証用に小さなdomUを用意したくなる事が多い。
domU作りの勉強がてら手順をまとめ、スクリプト化した。
現状はXen domU用のツリーを作る所までのスクリプトだけ。
▼動作実績環境
- CentOS-5.4(x86_64)
- Linux 2.6.18-164.15.1.el5xen
- yum 3.2.22
使用例
▼cloneを作成
$ git clone git://github.com/hansode/vmbuilder.git $ cd vmbuilder/xen/redhat/
▼Fedora Core 8(i386)の場合
$ sudo ./make-domu-tree.sh --dist=fedora --ver=8 --arch=i386
▼CentOS 5(i386)の場合
$ sudo ./make-domu-tree.sh --dist=centos --ver=5 --arch=i386
これ以降はddでイメージを作ってrsyncで同期するなり焼くなりは自由。
▼イメージへの同期例
$ sudo dd if=/dev/zero of=vm_i386_1gb.img bs=1G count=1 $ sudo mkfs.ext3 -F ./vm_i386_1gb.img $ mkdir mnt $ sudo mount -o loop ./vm_i386_1gb.img ./mnt/ $ sudo rsync -avx ./fedora-8_i386/ ./mnt/ $ sudo sync $ sudo umount ./mnt/
AMI登録用イメージスクリプトを近日登録予定。
2010年04月20日
何度か繰り返しているので書き残す
自分用メモ
▼検証環境
- Ubuntu 8.04 (i386)
- Amazon EC2(ami-5d59be34 canonical-cloud-us/ubuntu-hardy-20090422-i386.manifest.xml)
▼戦略
- ひとまずパッケージからNginxをインストール
- /etc/default/nginxを修正
- Nginxをソースからビルドして/opt/nginx/へインストール
作業内容
▼パッケージでnginxをインストール
$ sudo apt-get install nginx
▼ビルド依存パッケージをインストール
$ sudo apt-get install gcc make libc6-dev libssl-dev
▼nginxをビルド
$ cd /tmp/ $ wget http://sysoev.ru/nginx/nginx-0.7.65.tar.gz $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.02.tar.gz $ tar zxvf nginx-0.7.65.tar. $ tar zxvf pcre-8.02.tar.gz $ cd nginx-0.7.65 $ ./configure \ --prefix=/opt/nginx \ --with-pcre=/tmp/pcre-8.02 \ --with-http_realip_module $ make
▼nginxをインストール
$ sudo make install
▼インストール後のnginx状態を確認
$ /opt/nginx/sbin/nginx -V nginx version: nginx/0.7.65 built by gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu4) configure arguments: --prefix=/opt/nginx --with-pcre=/tmp/pcre-8.02 --with-http_realip_module
▼起動設定ファイル修正(新規追加)
$ sudo vi /etc/default/nginx DAEMON=/opt/nginx/sbin/nginx DAEMON_OPTS='-c /opt/nginx/conf/nginx.conf'
▼nginx.conf生成
$ cd /opt/nginx/conf/ $ sudo mv -i nginx.conf nginx.conf.0 $ sudo vi nginx.conf
▼nginx.conf生成
user www-data;
worker_processes 4;
error_log /var/log/nginx/error-passenger.log;
pid /var/run/nginx-passenger.pid;
events {
worker_connections 1024;
}
http {
include /opt/nginx/conf/mime.types;
include /opt/nginx/conf/conf.d/*.conf; # ex. passenger.conf
default_type application/octet-stream;
access_log /var/log/nginx/access-passenger.log;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
include vh/*.conf;
}
▼VirtualHost用設定ファイルディレクトリ作成
$ sudo mkdir vh $ sudo vi vh/ec2.conf
▼vh/ec2.conf生成
server {
listen 80;
server_name ec2.example.com;
# mod_real_ip
set_real_ip_from 10.0.0.0/8;
real_ip_header X-FORWARDED-FOR;
error_page 404 /404.html;
}
▼nginx起動
$ sudo /etc/init.d/nginx start
バージョン番号を隠蔽したい
▼検証環境
- Ubuntu 8.04 (i386)
- Linux 2.6.24-6-xen
- Nginx 0.7.65
作業内容
▼nginx.confを修正
> server_tokens off;
リロードして設定を反映させる
▼動作確認
$ HEAD http://ec2.example.com/path/to/page 404 Not Found Connection: close Date: Tue, 20 Apr 2010 10:03:48 GMT Server: nginx Content-Length: 162 Content-Type: text/html Client-Date: Tue, 20 Apr 2010 10:03:48 GMT Client-Peer: 184.73.69.193:80 Client-Response-Num: 1
Serverフィールドの値が「nginx」のみとなった事を確認。
apt-getだけで完結しなかった
▼検証環境
- Ubuntu 8.04 (i386)
作業内容
▼fcgiwrap依存パッケージ
$ sudo apt-get install libfcgi-dev
▼fcgiwrapをビルド・インストール
$ cd /tmp $ wget http://github.com/gnosek/fcgiwrap/tarball/master $ tar zxvf gnosek-fcgiwrap-28ac6f9.tar.gz $ cd gnosek-fcgiwrap-28ac6f9/ $ make $ sudo install -m 755 fcgiwrap /usr/local/bin/fcgiwrap
▼spawn-fcgiをビルド・インストール
$ cd /tmp $ wget http://freshmeat.net/urls/fe79d49e03a1762e9faf02b1ea482490 $ tar zxvf spawn-fcgi-1.6.3.tar.gz $ cd spawn-fcgi-1.6.3 $ ./configure $ make $ sudo make install
▼spawn-fcgi起動スクリプト配置: /etc/init.d/spawn-fcgi
#!/bin/sh
#
NAME=spawn-fcgi
DESC=spawn-fcgi
PIDFILE=/var/run/$NAME.pid
PROGRAM=/usr/local/bin/spawn-fcgi
ADDR=127.0.0.1
PORT=9000
USER=www-data
GROUP=www-data
FCGIWRAP=/usr/local/bin/fcgiwrap
if [ -f /etc/default/spawn-fcgi ]; then
. /etc/default/spawn-fcgi
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
$PROGRAM -f $FCGIWRAP -P $PIDFILE -a $ADDR -p $PORT -u $USER -g $GROUP
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
[ -f $PIDFILE ] || exit 1
PID=`cat $PIDFILE`
kill $PID
echo "$NAME."
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: /etc/init.d/$NAME [start|stop]" >&2
exit 1;
;;
esac
exit 0
▼spawn-fcgiを起動対象サービスに追加
$ sudo chmod +x /etc/init.d/spawn-fcgi $ sudo /usr/sbin/update-rc.d -f spawn-fcgi defaults $ sudo /etc/init.d/spawn-fcgi start
▼nginx.conf編集
location ~ ^/cgi-bin/.*\.cgi$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 5m;
fastcgi_index index.cgi;
include /opt/nginx/conf/fastcgi_params;
}
serverディレクティブ内に追記
2010年04月16日
[CentOS][Linux] /etc/sysconfig/network-scripts/ifcfg-Xをハックする (2/N) eth0からeth1に割り当てるIPアドレスを動的生成
eth1に割り当てるIPアドレスに規則がある場合、どうにかしたい
共通化したい情熱があればこそ、こんな事をやりたくなる。
▼要件
- eth0にはstaticかdhcpにより、IPアドレスが割り当てられる
- eth0とeth1は、違うサブネット
- eth1のIPアドレスの4オクテット目がeth0と同じ
▼設定例
- eth0: 192.168.10.10
- eth1: 192.168.11.10
レシピ
▼検証環境
- CentOS-5.4(i386)
▼/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=${CONFIG##ifcfg-}
BOOTPROTO=static
ONBOOT=yes
NETMASk=255.255.255.0
subnet=192.168.11
IPADDR=${subnet}.$(
base_nic=eth0
ifconfig ${base_nic} |\
grep 'inet addr:' |\
awk '{print $2}' |\
sed 's,addr:,,;' |\
awk -F\. '{print $4}'
)
あと書き
注目したいのは、シェルスクリプトを埋め込んでいる事。
ifcfg*には、「key=value」しか書けない と言う訳ではない。
シェルスクリプトを埋め込める事に気づくと、設定に対する世界観が変わる。
多少プログラムを書けると設定に対するアプローチが変わる。
「プログラマブル設定ファイル」
こんな事をやってると、ますます「変態」と言われそうだ。
光栄です。
2010年04月15日
ファイル名から推測出来るデバイス名を、何故指定するのか…
検証環境
- CentOS-5.4(i386)
まずはサンプル。
▼/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes
ファイル名は「ifcfg-eth0」だ。
設定ファイル内で「DEVICE=eth0」を指定。
eth0用設定をしているのに、何故 DEVICE=eth0 を指定するのか…?
ふと、疑問が生まれた。
「eth0」を値に持つ変数はないのか?
変数名「CONFIG」に「ifcfg-eth0」が入ってる事が判明。
これをシェル変数の文字列処理にて分解すると、 eth0 を得られる。
▼/etc/sysconfig/network-scripts/ifcfg-eth0 修正版
DEVICE=${CONFIG##ifcfg-}
BOOTPROTO=dhcp
ONBOOT=yes
これで再利用可能なifcfg-ethXが出来上がった。
再利用可能な状態へ変更してみる
ファイル名のsuffixが「.bak」であれば無視されるのを利用する。
▼/etc/sysconfig/network-scripts/ifcfg-ethX.bak
# vi ifcfg-ethX.bak
-----
DEVICE=${CONFIG##ifcfg-}
BOOTPROTO=dhcp
ONBOOT=yes
-----
▼eth0, eth1, eth2 を設定すると
# cd /etc/sysconfig/network-scripts/ # ln -s ifcfg-ethX.bak ifcfg-eth0 # ln -s ifcfg-ethX.bak ifcfg-eth1 # ln -s ifcfg-ethX.bak ifcfg-eth2
設定内容が同じである事が自明ならば、一元化された設定ファイルで管理が可能になる。
後は、 /etc/init.d/network restart して検証し、
可能であればシステム再起動して問題ないことまで確認する。
『wakame-vdc』がこっそりgithubにて公開された
wakame-vdcデモ環境構築時に行った作業記録である。
▼検証環境
- CentOS-5.4(i386)
▼要望:Ruby-1.8.7をインストールしたい
- 手順は暫定版で良い
- CentOS-5.4のRubyは、1.8.6
- 他のパッケージと依存関係を持たせたくない
- パッケージに依存する場所へインストールしたくない
こんな背景があった上での下記作業記録。
作業内容
▼ディレクトリ構成
- /opt/wakame/ruby-187
▼Ruby-1.8.7をインストール
# cd /tmp # wget ftp://core.ring.gr.jp/pub/lang/ruby/1.8/ruby-1.8.7-p249.tar.gz # tar zxvf ruby-1.8.7-p249.tar.gz # cd ruby-1.8.7-p249 # ./configure --prefix=/opt/wakame/ruby-187/ # make # make test test succeeded # make install
▼RubyGemsをインストール
# cd /tmp # wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz # tar zxvf rubygems-1.3.6.tgz # cd rubygems-1.3.6 # export PATH=$PATH:/opt/wakame/ruby-187/bin/ # ruby ./setup.rb
▼必要なGEMパッケージをインストール
# export PATH=$PATH:/opt/wakame/ruby-187/bin/ # ruby ./setup.rb # gem list # gem install rake --version=0.8.7 --no-rdoc --no-ri --bindir /opt/wakame/ruby-187/bin # gem install rack --version=1.1.0 --no-rdoc --no-ri --bindir /opt/wakame/ruby-187/bin # gem install bundler --version=0.9.11 --no-rdoc --no-ri --bindir /opt/wakame/ruby-187/bin # gem install fastthread --version=1.0.7 --no-rdoc --no-ri --bindir /opt/wakame/ruby-187/bin # gem install passenger --version=2.2.11 --no-rdoc --no-ri --bindir /opt/wakame/ruby-187/bin
▼インストール済GEMパッケージ一覧
# gem list *** LOCAL GEMS *** bundler (0.9.11) fastthread (1.0.7) passenger (2.2.11) rack (1.1.0) rake (0.8.7)
この後、wakame-vdcの環境が構築されて行く。
2010年04月13日
例えばシステム起動時に runlevel=[0-5] を指定したい
▼検証環境
- CentOS 5.4(i386)
- Linux 2.6.18-164.15.1.el5xen
▼材料
- /boot/grub/menu.list
- /etc/rc.d/rc.sysinit
作業内容
▼/boot/grub/menu.list を修正
default=0
timeout=15
splashimage=(hd0,0)/grub/splash.xpm.gz
title CUI| CentOS (2.6.18-164.15.1.el5xen)
root (hd0,0)
kernel /xen.gz-3.4.0
module /vmlinuz-2.6.18-164.15.1.el5xen ro root=/dev/sda3 quiet selinux=0 runlevel=3
module /initrd-2.6.18-164.15.1.el5xen.img-cui
title GSB | CentOS (2.6.18-164.15.1.el5xen)
root (hd0,0)
kernel /xen.gz-3.4.0
module /vmlinuz-2.6.18-164.15.1.el5xen ro root=/dev/sda3 quiet selinux=0 runlevel=5
module /initrd-2.6.18-164.15.1.el5xen.img-gui
それぞれ、runlevel=? を追加
▼/etc/rc.d/rc.sysinit の行末に追記
> if strstr "$cmdline" runlevel=; then
> for arg in $cmdline ; do
> runlevel=${arg##runlevel=}
> case "${runlevel}" in
> 3) # runlevel 3の場合
> command...;
> ;;
> 5) # runlevel 5の場合
> command...;
> ;;
> esac
> done
> fi
- strstr関数は、/etc/init.d/functions で定義されている
- 起動時に指定されたオプションは、/proc/cmdline に存在する
- /proc/cmdlineは、/etc/rc.d/rc.sysinit内で「cmdline=$(cat /proc/cmdline)」として変数が用意されている
ソフトウェア輸出禁止国などを設定する場合に重宝する
例えば日本からの接続のみ403にしたい。(…なんて事は滅多にないだろう)
delegated-apnic-latestから、IPアドレス範囲リストを生成し、HttpAccessModuleでdeny設定しても良い。
それよりも、GeoLite Countryと言う国別IPアドレスを利用するのが手っ取り早い。
▼材料
▼geo.confを生成
$ wget http://sysoev.ru/nginx/nginx-0.7.65.tar.gz $ tar zxvf nginx-0.7.65.tar.gz $ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip $ unzip GeoIPCountryCSV.zip $ perl ./nginx-0.7.65/contrib/geo2nginx.pl < ./GeoIPCountryWhois.csv > geo.conf $ sudo mv -i geo.conf /etc/nginx/.
▼nginx.confを修正
geo $geo {
default --;
include /etc/nginx/geo.conf; # ←GeoIPCountryWhois.csvから生成
}
location / {
if ($geo = 'JP') {
return 403;
}
}
後はNginxに設定を反映させれば完了。
▼運用へ向けて
- geo.confの定期メンテナンスを忘れない事
- cronを利用した自動更新や、Puppetなどを利用しても良いだろう
キャリア別に同時接続数制限したい
キャリアのMTAに対して大量にメールを配送すると、接続一時拒否される事がある。
その対策の1つが、配送数制御。
▼検証環境
- Fedora release 8
- Postfix 2.5.5
作業内容
▼/etc/postfix/main.cf 必要に応じて修正
> transport_maps = hash:/etc/postfix/transport
▼/etc/postfix/master.cfに追記
> smtp-softbank.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1 > smtp-ezweb.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1 > smtp-docomo.ne.jp unix - - n - 1 smtp > -o smtp_destination_concurrency_limit=1
▼/etc/postfix/transportに追記
> softbank.ne.jp smtp-softbank.ne.jp: > ezweb.ne.jp smtp-ezweb.ne.jp: > docomo.ne.jp smtp-docomo.ne.jp:
▼transport.dbを構築
# cd /etc/postfix # postmap transport
▼Postfixに設定を反映
# /etc/init.d/postfix reload
あとは日々ログを観察しつつ、
システムに似合ったsmtp_destination_concurrency_limitの設定値を割り出して行く。
2010年04月12日
rpmコマンドの復習
これまでの半年は作業環境はCentOSが多かった。
いつの間にか苦手だったrpmコマンドをそこそこ使いこなせるようになった。
復習を兼ね、下記にまとめる。
インストール済パッケージ
▼インストール済パッケージ一覧
$ rpm -qa
▼インストル済パッケージを新しい順に一覧表示
$ rpm -qa --last
▼パッケージ情報を表示
$ rpm -qi [package]
▼ファイル一覧表示
$ rpm -ql [package]
▼依存パッケージを表示
$ rpm -qR [package]
▼ドキュメント一覧
$ rpm -qd [package]
▼設定ファイル一覧
$ rpm -qc [package]
▼ファイルが所属するパッケージ名を表示
$ rpm -qf /path/to/file
▼ファイルの設定ファイルを表示
$ rpm -qcf /path/to/command
▼ファイルのドキュメントを表示
$ rpm -qdf /path/to/command
未インストールパッケージ
未インストールの場合は「p」を使う。
▼未インストールパッケージのファイル一覧表示
$ rpm -qpl [package].rpm
▼未インストールパッケージの依存関係表示
$ rpm -qpR [package].rpm
▼未インストールの設定ファイルを表示
$ rpm -qpc [package].rpm
▼未インストールのドキュメント表示
$ rpm -qpd [package].rpm
2010年04月02日
閉じた環境を構築したい
▼検証環境
- CentOS-5.4(i386)
■作業内容
▼設定ファイル生成
# vi /etc/sysconfig/network-scripts/ifcfg-newbr0 DEVICE=newbr0 BOOTPROTO=static BROADCAST=172.16.1.255 IPADDR=172.16.1.1 NETMASK=255.255.255.0 NETWORK=172.16.1.0 TYPE=Bridge ONBOOT=yes
▼設定反映
# /etc/init.d/network restart
▼内容確認
# ifconfig newbr0
newbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet addr:172.16.1.1 Bcast:172.16.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5426 errors:0 dropped:0 overruns:0 frame:0
TX packets:3157 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:426121 (416.1 KiB) TX bytes:243853 (238.1 KiB)
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

