Linux上のNodeJSサーバを実運用に使ってて
環境依存などあって、ローカルではなく
どうしてもサーバを直接デバッグしたいという場合に使える方法です。
(デバッガでブレークポイントかけると他の人のアクセスをブロックしちゃうのでチームで使う場合は注意です。)
説明のため、Mac OSXからAWS EC2上(Linux)のNodeJSサーバをデバッグすると仮定します。
ローカルからssh経由でリモート上にあるnode-inspectorデバッガー(サーバ)に
sshポートフォワーディングという方法でアクセスします。
サーバ上のdebug_webservice.shでnode-inspectorを起動し、
ローカルからsshポートフォワーディングでリモートサーバのnode-inspectorにアクセスします。
ついでにshellコマンドでChromeを開きます。
サーバ側にnode-inspectorのインストールとNodeJSは当然--debugモードで起動しておく必要があります。
ローカル側:
user、ip、keyは適宜書き換えてください
debug.sh
#!/bin/sh
user="ec2-user"
# サーバIPアドレス
ip="(ipアドレス)"
# ec2のログインssh key(pem)、カレントディレクトリに存在する想定
key="amazonEC2.pem"
account="${user}@${ip}"
# カレントディレクトリに移動
cwd=`dirname "${0}"`
expr "${0}" : "/.*" > /dev/null || cwd=`(cd "${cwd}" && pwd)`
cd $cwd
command="cd ./shell;./debug_webservice.sh > /dev/null ; exit "
remote_command ()
{
expect -c "
# timeoutをセット
set timeout -1
# sshコマンド
spawn ssh -i $key $account
# 期待されるserverからの応答メッセージ(一部が一致すればOK)
expect \"\$\"
# 以下,ログイン後のお決まりコマンドを列記した例
send \"$command\n\"
# 最後にinteract
interact
"
}
remote_command
local_command ()
{
kill `lsof -t -i:8080`
ssh -f -N -L 8080:127.0.0.1:8080 -i $key $account
open -a "/Applications/Google Chrome.app" http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858
}
local_command
サーバ側:
debug_webservice.sh
#!/bin/sh
T=$(pgrep -f node-inspector)
kill -9 $T
node-inspector &
使い方
$./debug.sh
自分の場合、コマンドたたくのもめんどくさいのでdebug.commandファイルにしちゃってます。