晩酌しながらサーバ管理。 こんな「てきとー管理者」にサーバ預けて、大丈夫?
Categories
Archives
Recent Entries
Search
Powered by
Movable Type 4.23-ja
■■■■■免 責■■■■■
このサイトを参考にしたために発生した一切の損害に「てきとー管理者」は一切関知しませんし、補償もしません。 また、本サイトの記述が正しいことも保証しません。
自己責任にてお願いします。
-------------------------
京都の鍵トラブルなら鍵レスキュー 鍵師が、家・金庫・バイク・車等の解錠を始め鍵に関する全般、また防犯設備士からみた防犯診断の上の工事等、安心しておまかせ下さい。24時間対応致します。
岩塩ならクリスタルキンガ 野菜、肉、魚など素材本来の味を引き出します。上質でクセがなく西洋料理はもちろん中華、日本料理にも幅広くお使い頂けます。
OpenVZのCTでSSHログイン出来ず・・・
OpenVZで構築したCTにSSHで接続できなくなった。
そこで、ホストから vzctl enter CTID(CTの番号)でログインを試みるがエラーが出る。
Unable to open pty: No such file or directory
ファイルまたは、ディレクトリが無いだと!!
この「Unable to open pty: No such file or directory」でGoogle先生に聞いてみると、以外に多くのページがHITした。
説明によると、udevとの相性がわるいらしい・・・
では、何故今までログインできて、突然ログインできなくなったのか?
サーバの設定も変えた覚えもないし・・・ 意味が分からない。
とにかく、ログイン出来るように対処方法が出ていたので、実行してみた。
エラーの内容では「Unable to open pty」となっていたので
/usr/sbin/vzctl exec CTID(CTの番号) /sbin/MAKEDEV pty
とだけ実行したがだめ。
念のため、
/usr/sbin/vzctl exec CTID(CTの番号) /sbin/MAKEDEV tty
も実行してみた。
この2つを実行することで、ログイン出来るようになった。
しかし、サーバを再起動すると、同じ現象になってしまう。
では、継続して利用出来るようにするためには、どの様にすれば良いのか、再度Google先生に聞いてみた。
サーバ起動時に、udevを利かないように設定すればいいらしい。
って事で、早速やってみた。
先ず、
/usr/sbin/vzctl exec CTID(CTの番号) /sbin/MAKEDEV pty
/usr/sbin/vzctl exec CTID(CTの番号) /sbin/MAKEDEV tty
を打って、
vzctl enter CTID(CTの番号)
で、対象CTにログインする。
そして
/etc/rc.sysinit の
#/sbin/start_udev ← コメントアウトする
そして
/sbin/start_udev を実行
念のため
/sbin/MAKEDEV tty
/sbin/MAKEDEV pty
も実行して〜 再起動!!
起動後に
vzctl enter CTID(CTの番号)
でログインできることを確認。
そして
ssh root@CTのIPアドレス
にて、SSH接続を確認。
これで、何度再起動してもOKになったが、何故udevとの相性問題が出たのか、意味が分からない・・・・
■参考サイト
http://www.eukhost.com/forums/f29/vps-unable-open-pty-no-such-file-directory-2666/
Linuxの起動スクリプト
ここ最近、オリジナルのデーモンを動かすことが多くなってきた。
サーバの再起動は行わないが、念のため起動スクリプトを作ってみた。
今までも、起動スクリプトは作成していたが、都度作成していたので、応用の利きそうなものを作成してみた。
++++++++++++++++++++++++++++++++++++++++++++++++
#!/bin/sh
#
# デーモン名
#
# chkconfig: 345 99 01 ← 用途や依存関係に気をつけて値を決める
# processname: デーモンName
# description: 適当に・・・w
PROG=/usr/local/bin/XXXXXXXX
PROGNAME=XXXXXXXX
LOCKFILE=/var/lock/subsys/$PROGNAME
# Source function library.
. /etc/rc.d/init.d/functions
RETVAL=0
# Get config.
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = "no" ]
then
exit 0
fi
start() {
echo -n "Starting $PROGNAME services: "
daemon $PROG -p 1022 &
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch $LOCKFILE
return $RETVAL
}
stop() {
echo -n "Stopping $PROGNAME services: "
killproc $PROGNAME
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $LOCKFILE
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $PROGNAME
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $PROGNAME {start|stop|status|restart}"
exit 1
esac
exit $RETVAL
++++++++++++++++++++++++++++++++++++++++++++++++
これをフォーマットにすれば、余計な時間を取られずに済むな・・・・
コマンドでSSLのバインドを構成する
またまたWindowsのSSL証明書ネタw
最近15サイト分のワイルドカード形式のSSL証明書を申請した。
枯渇しているIPを消費させない一つの方法です。
申請は*.hogehoge.jp等の様に、1つのドメインに対してのワイルドカードで有って、異なるドメインで使えるものではありません。(※念のため・・・)
しかし、良い面だけでは有りません。
古めのブラウザ(IE6)や携帯端末では認識しない場合も有るようです。
IISの場合、非常に簡単で、1つ目のサイトは普通にバインドさせる。
2つ目以降のサイトに関してはコマンドにて設定していくのだが、覚えてしまえば非常に簡単。
でも、覚えの悪い俺はメモることにしたw
参考サイト
http://cspssl.jp/support/install_iis7_bind_cui.html
上記サイトの例ではIPを指定していないが、実際にはIPを入れて設定することになる。
先ず、現在の設定を確認
c:\Windows\System32\inetsrv>appcmd list site
SITE "Default Web Site" (id:1,bindings:http/192.168.0.11:80:www.hogehoge.jp,https/192.168.0.11:443:cspssl.com,state
:Started)
SITE "www2" (id:2,bindings:http/192.168.0.11:80:www2hogehoge.jp,state:Started) ← ここ(www2)にはSSL証明書が割当たっていない。
コマンドで、強制的にバインドさせる
c:\Windows\System32\inetsrv>appcmd set site /site.name:"www2" /+bindings.[protoco
l='https',bindingInformation='192.168.0.11:443:www2.hogehoge.jp']
SITE オブジェクト "contact" は変更されました
再度バインドの状態を確認
c:\Windows\System32\inetsrv>appcmd list site
SITE "Default Web Site" (id:1,bindings:http/192.168.0.11:80:www.hogehoge.jp,https/192.168.0.11:443:www.hogehoge.jp,state
:Started)
SITE "www2" (id:2,bindings:http/192.168.0.11:80:www2.hogehoge.jp,https/192.168.0.11:443:www2.hogehoge.jp,state:Started)
これで出来上がり!
同一ドメインで複数サイトがある場合は、これを繰り返すだけ。
SSL証明書の4階層クロスルート方式
最近Windowsを触る機会が多いのだが、覚える気が全くない俺はやったことを直ぐに忘れてしまうので、メモって置くことにした。
お客様でSSL証明書にVeriSignやCybertrustを利用していたが、コスト削減のため、安い証明書を好むような傾向が有る。
しかし、スマートフォンの普及によりダメダメな証明書では使い物にならない。
最近はRapidSSLを申請する機会が置いのだが、古い携帯端末でも新しい携帯端末でも利用出来るような複数の証明書(中間証明書)を入れることが出来るようだ。
やり方は簡単で、2つの中間証明書を1つのファイルでまとめてサーバに読み込ませるだけ!
方法は割愛するが、下記のサイトに詳細が出ている。
http://valuessl.net/support/etc/rapidsslre_cross/index.php
設定したら、正常に動作しているかをチェッカーでチェックすることをオススメする!
http://valuessl.net/support/checker.php
EC-CUBEのエラー
先日、EC-CUBEをインストールした際にエラーが出た!
Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /var/www /html/eccube/data/class/util/GC_Utils.php on line 221
こんな感じのエラーだったが、Google先生に確認すると、直ぐに対策が解った。
今回のサーバでは、CentOS5.7+PHP5.3.8の構成でエラーが出た。
php.iniに細工をすると直るらしい。
修正箇所は以下のとおり。
php.ini の [Date] セクションにtimezoneを設定するだけ。
[Date]
date.timezone = Asia/Tokyo
そしてApache再起動!
php5.1とかではこんな設定したことなかったけど、EC-CUBE側の仕様変更なのかな???
OpenSSL(Linux)で作成したSSL証明書を変換してIISへ
Linux(Apache)からWindows(IIS)に乗り換えたお客様が居る。
今時Windowsなんて使ってもね〜〜っと思いながらも、お客様の依頼なので仕方がない。
コンテンツ(Linuxで動いていたPHP+PostgreSQLをWindows版PHP+MSSQLに焼き直し)を再構築して、やっと動くようになった。
無理にWindows版PHPに焼かずに.netで再構築すれば良いと思うのだが、俺の周りには.netに詳しいプログラマーがいないw
やってやれないことは無いが、PHP同士の移植の方が簡単で工数も少なく、トラブルも少ないとの結論に至った。
ま〜 ここまでは、俺の担当では無いので詳細は割愛!!
本題のSSL証明書の変換だが、Google先生に聞いてみると意外に情報が少ない。
しかし、方法は一発のコマンドで変換できてしまう。
忘れないように、また同じような事はあった時の為にメモ!
Linuxの場合は、keyとcrtの2段構えで構成されている。
Windowsの場合はPKCS#12 形式。
コマンドでサクッと変換してみましょ。
OpenSSLがインストールされたLinuxで下記を実行
# openssl pkcs12 -export -in DOMAIN.crt -inkey DOMAIN.key -out DOMAIN.p12
これだけで変換完了。
出来たPKCS#12 形式をWindowsへ転送して、読みこませれば完了!
■参考にしたサイト
http://support.citrix.com/article/CTX108031
Apacheのエラー6
本日連続してsignal Bus error (7)の為Apacheが再起動された。
コンテンツは問題無く表示(稼働)しているが、なんか気持ち悪い・・・・
バーチャルドメインのログを見ても、それらしきものは残っていない〜
coreが吐かれていたので、内容を確認したが以前と同じ・・・
(gdb) where
#0 0xb7bca697 in memset () from /lib/libc.so.6
#1 0xb7e987ab in apr_password_validate () from /usr/lib/libaprutil-1.so.0
#2 0xb7843bda in __cxa_finalize () from /etc/httpd/modules/mod_authn_file.so
#3 0xb7f11c6e in __cxa_finalize () from /etc/httpd/modules/mod_auth_basic.so
#4 0xb7f52a0d in ap_run_check_user_id ()
#5 0xb7f53d17 in ap_process_request_internal ()
#6 0xb7f6763b in ap_process_request ()
#7 0xb7f643ef in ?? ()
#8 0xb7f5fa0d in ap_run_process_connection ()
#9 0xb7f5fb0c in ap_process_connection ()
#10 0xb7f6c694 in ?? ()
#11 0xb7f6c9a1 in ?? ()
#12 0xb7f6d3a3 in ap_mpm_run ()
#13 0xb7f43157 in main ()
怪しいのは
mod_auth_basic.so
mod_authn_file.so
ここのところ、phpMyAdminに対しもログが残っている。
phpMyAdminのディレクトリにはベーシック認証を施している。
もしかすると、ベーシック認証を破る攻撃がなされば場合にApacheに不具合が出るのかもしれない。
しかし、ググッてもそれらしき情報が無いため、対策が打てない!
地道に攻撃元IPをブラック化(iptablesで破棄)するしか無いだろうな〜〜
Apacheのエラー5
昨晩、下記のログを吐いていた。
[Tue Nov 08 02:08:31 2011] [notice] child pid 27500 exit signal Segmentation fault (11)
しかし、swatchで感知しないw
設定ファイルには watchfor /signal Bus error (7)|signal Segmentation fault (11)/ のように記述しているが。。。。
何か、問題でも??
って事で、watchfor /signal Bus error|signal Segmentation fault/ こんな感じにしてみた。
それと、昔NICが死んでしまう現象があり、その時にお対策を行った事が有ったが、logrotateする際に、古いLogDATAを読み続けてしまう現象が有った。
今回のLogはApacheのログなので、logrotateした後にswatchを再起動するようにして、logrotateした後の新しいLogを参照するように追記してみた。
------------------------------------------------------------------------------------------
/var/log/httpd/*log {
weekly
rotate 13
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
------------------------------------------------------------------------------------------
↓ ↓ ↓
------------------------------------------------------------------------------------------
/var/log/httpd/*log {
weekly
rotate 13
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
/etc/rc.d/init.d/swatch restart ← ここ
endscript
}
------------------------------------------------------------------------------------------
これで、再度様子みてみようか・・・
Apacheのエラー4
その後、何故かわからないが不具合が出ない・・・w
良いことではあるが、せっかくswatchを仕掛けたのに〜〜
ちょっと時間が有ったので、ここ最近追加したドメインの配下を見てみたら、htdocsの下にcoreが吐かれてる。
findで検索すると、他のドメインでもcoreが吐かれてるドメインが有る。
今度、エラーが出てSwatchでApacheが再起動すればメールが飛んでくる。
そのタイミングで、各ドメイン配下にcoreが有るか確認すれば、追求出来るかも!!
※ドメイン配下に有ったcoreは調査する前に削除していたので、次回発生しないと調べられないw
Apacheのエラー3
その後、何度かcoreを吐くが、全く原因が掴めず。
このままでは、相当やばい!
って事で、
child pid XXXX exit signal Segmentation fault (11)
とか
child pid XXXX exit signal Bus error (7)
を吐いたら、Apacheを再起動するようにしてみた。
早速、swatchを導入。
通常 /root/.swatchrc に記述するようになっているが、これでは管理しにくいので、 /etc/swatch に設定ファイルを置いて動くようにしてみた。
# mkdir /etc/swatch
# cd /etc/swatch
# vi error_log.conf
----------------------------------------------------------------------------------------
#logfile: /var/log/httpd/error_log
watchfor /signal Bus error (7)|signal Segmentation fault (11)/
echo
mail admin@hogehoge.jp,subject=[Alert] Apache Restart!!
exec /etc/rc.d/init.d/httpd restart
----------------------------------------------------------------------------------------
こんな感じで設定。
swatchは標準で起動スクリプトが用意されていないので、色々調べてこんな感じで作ってみた。
----------------------------------------------------------------------------------------
#!/bin/sh
#
# Swatch
#
# chkconfig: 345 90 35
# description: swatch log monitoring
#
SWATCH=/usr/bin/swatch
LOCKFILE=/var/lock/subsys/swatch
CONFPATH=/etc/swatch
PROCFILE_PATH=/var/run
CONFFILE=*.conf
WORKPATH=/tmp
LOGFILE=/var/log/swatch/swatch.log
. /etc/rc.d/init.d/functions
start()
{
RESULT_CODE=0
if [ -f ${LOCKFILE} ]; then
echo "Swatch is already running."
exit 1
else
touch ${LOCKFILE}
fi
PROCCOUNT=0
for CONFIGFILE in ${CONFPATH}/${CONFFILE}
do
if [ -f ${CONFIGFILE} ]; then
PROCCOUNT=`expr ${PROCCOUNT} + 1`
TARGET_LOG=`head -1 ${CONFIGFILE} | awk 'BEGIN { FS = ":" }; { sub(/([ \t]+$|^[ \t]+)/, "", $2); print $2 }'`
echo -n "Starting swatch: ${TARGET_LOG}: "
daemon ${SWATCH} \
--config-file ${CONFIGFILE} \
--tail-file ${TARGET_LOG} \
--script-dir=${WORKPATH} \
--awk-field-syntax \
--daemon \
--pid-file ${PROCFILE_PATH}/swatch.${PROCCOUNT}.pid \
2>> ${LOGFILE}
RETVAL=$?
echo
if [ ${RETVAL} != 0 ]; then
RESULT_CODE=${RETVAL};
fi
else
RESULT_CODE=7
fi
done
return ${RESULT_CODE}
}
stop()
{
if [ -f ${LOCKFILE} ]; then
for PID in ${PROCFILE_PATH}/swatch.*.pid
do
if [ -f ${PID} ]; then
PID_NUMBER=`cat ${PID}`
echo -n "Shutting down swatch (pid ${PID_NUMBER}): "
killproc -p ${PID}
RETVAL=$?
rm -f ${PID}
echo
else
RETVAL=7
fi
done
fi
rm -f ${LOCKFILE}
rm -f ${WORKPATH}/.swatch_script.*
return ${RETVAL}
}
status()
{
if [ -f ${LOCKFILE} ]; then
echo -n "Swatch (pid :"
for PID in ${PROCFILE_PATH}/swatch.*.pid
do
if [ -f ${PID} ]; then
echo -n " `cat ${PID}`"
fi
done
echo ") is running."
else
echo "Swatch is stopped."
fi
return 0
}
case "$1" in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
start
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
*)
echo "Usage: swatch {start|stop|restart|status}"
exit 1
esac
exit ${RETVAL}
----------------------------------------------------------------------------------------
これを
chkconfig --add swatch
して
service swatch start
して
chkconfig swatch on
こんな感じ!
これで、ちょっと様子見だな。