pm2 でいっしょにかんりしよ
バックグラウンドで実行
よーしnodejs起動しちゃうぞ!...あれこれコンソール立ち上げっぱなしにするの?
そんなふうに誰にでもはじめてがあります。
&でコマンドを実行したり、nohupなんてのもあります。
昔nodejsを起動させとくためにforeverってのを使ったんですがpm2がとってもいい訳です。
もうこれ以上のものは必要ないんじゃないかってくらいに。いいのあったら教えてください。
pm2のいいところ
たけぞうさんは言いました。
- マシンのコア数に応じて複数のプロセスを起動し、バランシングを行うことができる
- CPU使用率、メモリ使用量、再起動回数などの項目を監視することができる
- Gitリポジトリからのデプロイ機能を備えている
管理は名前をつけると多分良い
私個人の一例を加工しているけど公開します。
$ pm2 list
-----------------------------------------------------------------------------------------------------------------------------------------------------------
x id x name x namespace x version x mode x pid x uptime x ? x status x cpu x mem x user x watching x
-----------------------------------------------------------------------------------------------------------------------------------------------------------
x 0 x ********_co_jp3000 x default x N/A x fork x 623356 x 4D x 261 x online x 0% x 19.0mb x ***… x disabled x
x 1 x ****************_net3001 x default x N/A x fork x 389907 x 31D x 20 x online x 0% x 17.1mb x ***… x disabled x
x 2 x ************_com3002 x default x 1.0.0 x fork x 178385 x 58D x 0 x online x 0% x 31.3mb x ***… x disabled x
x 3 x *********_io3003 x default x 1.0.0 x fork x 178490 x 58D x 0 x online x 0% x 27.2mb x ***… x disabled x
x 4 x ******************_pw3004 x default x N/A x fork x 178442 x 58D x 0 x online x 0% x 51.8mb x ***… x disabled x
x 5 x api_*******_cloud3007 x default x N/A x fork x 178511 x 58D x 0 x online x 0% x 48.2mb x ***… x disabled x
-----------------------------------------------------------------------------------------------------------------------------------------------------------
こんな感じで、ポートとドメイン、用途とかを分かる様に名前を付けて管理してます。
pm2 の環境構築
インスコして自動起動設定をします。ここら辺はうる覚えです。
$ npm install pm2 -g
$ pm2 startup
$ pm2 save --force
nodejs直接叩く場合
$ pm2 start server.js --name nodejs_co_jp3000 <-こんな感じ
$ pm2 show nodejs_co_jp3000 <-こんな感じで名前つけないと分からなくなります
nextjsをpm2で叩く場合(nextjsのbuildはしておく必要がある)
$ pm2 start app.json --env production --name react_nextjs_net_mitaina_3001
$ pm2 show react_nextjs_net_mitaina_3001 <-これでなんだっけ?を見れます
$ pm2 info 2 <-こういうんもあります。2はpm2 listで表示されるIDです。
app.jsonとは?ですよね。ちな golang でも同じです。golangの例です。
{
"name" : "golang_demo_onaji1999",
"script" : "go run main.go",
"env" : {
"NODE_ENV" : "development"
},
"env_production" : {
"NODE_ENV" : "production"
}
}
このapp.jsonをproduction用と、development用をつくっておいて、pm2で立ち上げるときに読み込むファイルを分けておくと楽です。上のケースだとenv,nameを引数に入れていますが、本チャンをapp.production.jsonとかにして、json内に記載しておくと、そっちが優先して適応されます。
で、一度動いてしまえば、止めたい時、リスタートしたい時も簡単です。
$ pm2 start 4
$ pm2 stop 4
$ pm2 restart 4
4は上のpm2 listのIDね。例でいうと「******************_pw3004」の処理です。
楽ですよね。
nextjsの豆知識
本記事と趣旨がそれますが、react/nextjsの場合はビルド後の
"script" : "./node_modules/next/dist/bin/next -p 3000",
こんな感じでパスを指定します。
ね。
セーブ機能で再起動後も安心
自動起動はあくまでpm2だけで、プロセス立ち上げは自分でやらないといけない?
$ pm2 save
なので、セーブしておきます。で、うわ、プロセス急いで立ち上げなきゃ、何だっけ?問題をこれで復元できます。
$ pm2 resurrect
ログが見たいとき
pm2 logs -h
で、なんとなくわかると思いますが、
pm2 logs --raw
で、走っているログがリアルタイムで観測できます。
Discussion