【保存版】Node.jsアプリケーションを独自プロセスで実行する方法:child_process、PM2、systemd徹底比較
Node.jsアプリケーションを独自のプロセスとして実行する方法
child_processモジュールを使用する
child_process
モジュールは、Node.jsアプリケーションから他のプロセスを生成および管理するためのツールを提供します。この方法は、次のような場合に役立ちます。
- 外部コマンドを実行したい場合
- 長時間実行されるタスクを非同期に実行したい場合
- アプリケーションをワーカープロセスに分割したい場合
以下のコード例は、child_process
モジュールを使用して子プロセスでchild.js
スクリプトを実行する方法を示しています。
const child_process = require('child_process');
const child = child_process.fork('./child.js');
child.on('message', (message) => {
console.log(`子プロセスから受信: ${message}`);
});
child.send('親プロセスから送信');
PM2を使用する
PM2は、Node.jsアプリケーションを管理するためのプロセスマネージャーです。PM2を使用すると、アプリケーションを起動、停止、再起動、監視することができます。また、クラスタリング、ログ記録、ロードバランシングなどの機能も提供します。
PM2を使用してNode.jsアプリケーションを独自のプロセスとして実行するには、以下のコマンドを実行します。
pm2 start index.js --name my-app
このコマンドは、index.js
スクリプトをmy-app
という名前のプロセスとして起動します。
systemdを使用する
systemdは、Linuxシステム用のサービス管理ツールです。systemdを使用すると、Node.jsアプリケーションをサービスとして定義し、ブート時に自動的に起動および停止することができます。
systemdを使用してNode.jsアプリケーションを独自のプロセスとして実行するには、systemdサービスファイルを作成する必要があります。以下の例は、my-app.service
という名前のsystemdサービスファイルを示しています。
[Unit]
Description=My Node.js Application
After=network.target
[Service]
User=your-user
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node index.js
[Install]
WantedBy=multi-user.target
このファイルを作成したら、以下のコマンドを実行してサービスを有効化および起動します。
sudo systemctl enable my-app.service
sudo systemctl start my-app.service
どの方法を選択するべきですか?
使用する方法は、要件によって異なります。
- アプリケーションをシステムサービスとして実行したい場合は、systemdを使用します。
- アプリケーションを簡単に管理およびスケーリングしたい場合は、PM2を使用します。
- アプリケーションをワーカープロセスに分割したい場合は、
child_process
モジュールを使用します。
上記の方法に加えて、Dockerを使用してNode.jsアプリケーションを独自のプロセスとして実行することもできます。Dockerは、アプリケーションとその依存関係を単一のコンテナーにパッケージ化するためのプラットフォームです。これにより、アプリケーションを移植性と再現性のある方法で実行することができます。
const child_process = require('child_process');
const child = child_process.fork('./child.js');
child.on('message', (message) => {
console.log(`子プロセスから受信: ${message}`);
});
child.send('親プロセスから送信');
子プロセス (child.js)
const process = require('process');
process.on('message', (message) => {
console.log(`親プロセスから受信: ${message}`);
process.send('子プロセスから送信');
});
このコードを実行するには、まずparent.js
とchild.js
という2つのファイルを保存する必要があります。次に、以下のコマンドを実行して親プロセスを起動します。
node parent.js
このコマンドを実行すると、次の出力がコンソールに表示されます。
子プロセスから受信: 親プロセスから送信
次に、以下のコマンドを実行して子プロセスにメッセージを送信します。
child.send('親プロセスから送信 2');
子プロセスから受信: 親プロセスから送信 2
pm2-clusterは、PM2のアドオンモジュールであり、Node.jsアプリケーションをマルチプロセスモードで実行できるようにします。このモードでは、PM2はアプリケーションのマスタープロセスを起動し、ワーカープロセスを複数生成します。ワーカープロセスはそれぞれ独自のプロセスとして実行され、負荷を分散し、パフォーマンスを向上させることができます。
pm2 start index.js --name my-app --cluster
このコマンドは、index.js
スクリプトをmy-app
という名前のプロセスとして起動し、CPUコアの数に応じてワーカープロセスを生成します。
Node.jsの組み込みのclusterモジュールを使用する
Node.jsには、cluster
という組み込みモジュールがあり、マルチプロセスアプリケーションを構築するためのツールを提供しています。このモジュールは、pm2-clusterと同様に、マスタープロセスとワーカープロセスを生成し、負荷を分散することができます。
const cluster = require('cluster');
if (cluster.isMaster) {
const numWorkers = require('os').cpus().length;
for (let i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`ワーカープロセス ${worker.process.pid} が終了しました (コード: ${code}, シグナル: ${signal})`);
});
} else {
// ワーカープロセスのコードを実行
require('./worker.js');
}
このコードは、マスタープロセスとワーカープロセスを生成し、ワーカープロセスが終了したときにログメッセージを出力します。
Foreverを使用する
Foreverは、Node.jsアプリケーションを監視し、クラッシュした場合に自動的に再起動するツールです。Foreverは、アプリケーションを独自のプロセスとして実行することもできます。
forever start index.js
このコマンドは、index.js
スクリプトを独自のプロセスとして起動し、アプリケーションがクラッシュした場合に自動的に再起動します。
Node.jsアプリケーションを独自のプロセスとして実行するには、さまざまな方法があります。それぞれの方法には、長所と短所があり、要件に応じて最適な方法を選択する必要があります。
要約
- Forever: アプリケーションを監視し、クラッシュした場合に自動的に再起動したい場合に適しています。
- Node.jsの
cluster
モジュール: 低レベルの制御が必要なマルチプロセスアプリケーションを構築する場合に適しています。 - pm2-cluster: アプリケーションをマルチプロセスモードで実行し、負荷を分散したい場合に適しています。
- systemd: アプリケーションをシステムサービスとして実行したい場合に適しています。
- PM2: アプリケーションを簡単に管理およびスケーリングしたい場合に適しています。
child_process
モジュール: アプリケーションをワーカープロセスに分割する場合、または外部コマンドを実行する場合に適しています。
node.js service deployment