Node.js (Express) で forever restart 後に bind EADDRINUSE エラーが頻発する障害が発生しました。
Error: bind EADDRINUSE はそのポートが既に使われてる場合に発生するエラーでして、同じ障害に悩まされた人のために解決方法をメモしておきます。
エラーメッセージ
Error: bind EADDRINUSE
at errnoException (net.js:904:11)
at net.js:1084:30
at Object.12:1 (cluster.js:592:5)
at handleResponse (cluster.js:171:41)
at respond (cluster.js:192:5)
at handleMessage (cluster.js:202:5)
at process.EventEmitter.emit (events.js:117:20)
at handleMessage (child_process.js:318:10)
at child_process.js:392:7
at process.handleConversion.net.Native.got (child_process.js:91:7)
at process. (child_process.js:391:13)
at process.EventEmitter.emit (events.js:117:20)
at handleMessage (child_process.js:318:10)
at Pipe.channel.onread (child_process.js:343:11)
まず netstat コマンドで node.js サーバーのプロセスで使うポートが他のプロセスに使われていないか確認します。
$ netstat -nltp | grep 3000
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 6653/phantomjs
今回は phantom.js が 3000 番ポートで起動していたようでした。phantom.js は利用しているものの他のポート番号を指定して起動させるようにしていたので 3000 番ポートを使っていた理由は不明です。プロセスを停止させて問題ない場合、 ps aux | grep phantomjs で phantom.js の PID (プロセス番号) を特定して kill コマンドでプロセスを終了させます。
最後に forever や pm2 もしくは node コマンドなどで node サーバーを起動させて、エラーログに Error: bind EADDRINUSE が出力されていないことを確認すれば完了です。
・Node.jsの開発で warn - error raised: Error: listen EADDRINUSE
って怒られるときの対応 - Qiita
・node.js - Nodejs application Error: bind EADDRINUSE when use pm2 deploy - Stack Overflow