👩

pm2 でいっしょにかんりしよ

2022/01/27に公開

バックグラウンドで実行

よーしnodejs起動しちゃうぞ!...あれこれコンソール立ち上げっぱなしにするの?
そんなふうに誰にでもはじめてがあります。

&でコマンドを実行したり、nohupなんてのもあります。

昔nodejsを起動させとくためにforeverってのを使ったんですがpm2がとってもいい訳です。
もうこれ以上のものは必要ないんじゃないかってくらいに。いいのあったら教えてください。

pm2のいいところ

たけぞうさんは言いました。

  • マシンのコア数に応じて複数のプロセスを起動し、バランシングを行うことができる
  • CPU使用率、メモリ使用量、再起動回数などの項目を監視することができる
  • Gitリポジトリからのデプロイ機能を備えている

https://takezoe.hatenablog.com/entry/20140722/p1

管理は名前をつけると多分良い

私個人の一例を加工しているけど公開します。

$ 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