サーバ起動制御 †
※以下、PHP、Oracle環境時のメモ
【連携処理 実装の背景】
・WEBサーバ(Apache)起動前にDBサーバ(Oracle)が起動していないと、以降の(ほぼ)全ての接続でエラーとなる。
(「ORA-03113: 通信チャネルでend-of-fileが検出されました。」 が検出される。)
また、DBサーバを再起動した場合は、必ずWEBサーバも再起動しないと同じエラーになる。
なので、”DBサーバ”、”WEBサーバ” のプロセス起動順は、必ず
「DBサーバ起動」 −> 「WEBサーバ起動」 という順序を経る必要がある。
しかし、それぞれのサーバが別PCで動作している場合はサービス起動順の自動管理が困難となる。
そこで、以下に示すように chkconfig および ssh を利用してサービスの起動順を自動管理する。
|
|
|
【構築手順(概要)】
(1)DBサーバ側のOracleを chkconfigによりサービス管理し、Oracleの{起動}{再起動}{終了}などは全て chkconfig 用のサービス起動スクリプトで行うように設定する。
(2)DBサーバ側で ssh秘密鍵、公開鍵を作成する。※自動運転用の鍵なのでパスフレーズはなしで作成。
(3)作成した公開鍵に、実行を許可するコマンドを登録する。 ※あらかじめ決められたコマンドしか実行できないような鍵にしておく。
(ここで は ”実行を許可するコマンド” は 「WEBサーバの再起動コマンド」( "/etc/init.d/httpd restart" とか ) となります。)
(4)公開鍵の内容を、WEBサーバ側PCの認証済み公開鍵として ( authorized_keys )に登録する。
(5)Oracleのサービス起動スクリプトの最後に、SSHでWEBサーバPCへのアクセス処理を記述する。
※もしくは、Oracleより後に起動するような別サービスを作ってもよいかもしれません。
【処理の流れ】
(1)Oracleのサービス起動スクリプトにより、DBサーバを(再)起動。
(2)起動スクリプト内で WEBサーバへのアクセス処理が行われる。
(3)WEBサーバ側では、公開鍵に登録されたコマンド(WEBサーバ再起動用のコマンド)が実行される。
|
|
※セキュリティを考慮して以下の点を徹底する。
(1)SSHプロトコルはバージョン2のみ使用(SSH2)。
(2)認証は公開鍵認証のみを使用する。
(3)上記のような自動運転を行う場合は、公開鍵ファイルに実行できるコマンド記述しておく。
(任意のコマンドを実行できないように設定する。)
|
【構築手順(詳細)】
(1)DBサーバ側のOracleを chkconfigによりサービス管理するように設定する。
|
mv oradb /etc/init.d ※dboraは起動スクリプト
vi /etc/init.d/dbora
#!/bin/sh
#
# chkconfig: - 98 11 ※この行を追加
!wq ※保存
chkconfig --add dbora
chkconfig --level 345 dbora on
|
(2)DBサーバ側で ssh秘密鍵、公開鍵を作成する。※自動運転用の鍵なのでパスフレーズはなしで作成。
|
ssh-keygen -t rsa
enerating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/restart_key [Enter] ※適当な名前にリネーム
Enter passphrase (empty for no passphrase): [Enter] ※自動運転用なのでパスフレーズはなし
Enter same passphrase again: [Enter]
Your identification has been saved in /root/.ssh/restart_key.
Your public key has been saved in /root/.ssh/restart_key.pub.
The key fingerprint is:
69:81:44:c0:7b:cf:87:77:97:4e:12:13:7a:24:33:34 root@test0-server.honsya-old.kk-sankyo.local
|
(3)作成した公開鍵に、実行を許可するコマンドを登録する。 ※あらかじめ決められたコマンドしか実行できないような鍵にしておく。
(ここで は ”実行を許可するコマンド” は 「WEBサーバの再起動コマンド」( "/etc/init.d/httpd restart" とか ) となる。)
|
vi /root/.ssh/restart_key.pub
from="192.168.0.100",
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,
no-pty,command="/etc/init.d/httpd restart"
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAxJtrmN7ruURZEdBdZpjT4UlfClKbOqn9kGEQNykLmi7B
888sl4XxenoGqqWe3i3eKx3IOBO/+ybOiy9aRXwCH+Ct7RFTQsDo4NOiIA5mXbq//QSA0/dR5lt
JDfH9y7bl2ur3SBmIboTlmXW60goq8VIp/v3bI2FXTI1FSrCiC0M= root@oraserver
|
※赤字部分を追加(実際には1行で記述)
from="DBサーバのIPアドレス" ・・・ この鍵を使用して接続できるホスト
no-port-forwarding ・・・
no-X11-forwarding ・・・
no-agent-forwarding ・・・
no-pty-forwarding ・・・ 仮想端末を取得させない
command="SSH接続時に自動実行されるコマンド"
※以上をカンマ区切りで記述
|
(4)公開鍵の内容を、WEBサーバ側PCの認証済み公開鍵として ( authorized_keys )に登録する。
DBサーバ側で
|
mv /root/.ssh/restart_key.pub /mnt/flopy ※公開鍵をフロッピーに移動
|
WEBサーバ側で
|
cat /mnt/flopy/restart_key.pub >> /root/.ssh/authorized_keys ※認証済み鍵として登録
|
(5)DBサーバに Oracleより後に起動するような別サービスを作る。
・SSH接続用スクリプトを作る( /etc/init.d/svr_restart )
|
#!/bin/bash
#
# chkconfig: 345 99 1
# description: Web Server Restart
#############################################
# WEBサーバ ※スペース区切りで複数のサーバを指定可能
WEB_SERVERS="192.168.0.50"
# 再起動用の秘密鍵
RESTART_KEY="/root/.ssh/svr_restart_key"
#############################################
## WEBサーバ再起動処理
function websvr_restart(){
while [ $# -gt 0 ]
do
ssh -i $RESTART_KEY $1 <<_EOSSH_ 1>/dev/null 2>>/tmp/restart_err.log
exit
_EOSSH_
shift
done
}
## メイン処理
ERROR=0
ARGV="$@"
case $ARGV in
start)
websvr_restart $WEB_SERVERS
ERROR=$?
;;
stop)
ERROR=0
;;
esac
exit $ERROR
|
|
・作成したスクリプトをサービス登録
|
chmod 755 /etc/init.d/svr_restart
chkconfig --svr_restart
chkconfig --level 345 svr_restart on
|
|