Node.jsサーバーをデーモンプロセス化する3つの方法:それぞれのメリットとデメリット
Node.jsサーバーをデーモンプロセスとして起動する方法
foreverモジュールを使う
foreverモジュールは、Node.jsアプリケーションを永続的に実行するためのツールです。インストール方法は以下の通りです。
npm install -g forever
インストール後、以下のコマンドを実行することで、Node.jsサーバーをデーモンプロセスとして起動できます。
forever start <your-script.js>
このコマンドを実行すると、foreverはNode.jsサーバーをバックグラウンドで起動し、クラッシュした場合でも自動的に再起動します。また、ログファイルや出力ファイルも生成することができます。
PM2を使う
PM2は、Node.jsプロセスを管理するためのプロセスマネージャーです。foreverと同様に、Node.jsサーバーをデーモンプロセスとして起動することができます。インストール方法は以下の通りです。
npm install -g pm2
pm2 start <your-script.js>
PM2は、foreverよりも多くの機能を提供しています。例えば、複数のNode.jsサーバーを同時に管理したり、負荷状況に応じてプロセスの数を増減したりすることができます。
どちらのツールを使うべきか
ツール | 特徴 | メリット | デメリット |
---|---|---|---|
forever | シンプルで使いやすい | インストールと使い方が簡単 | 機能がPM2に比べて少ない |
PM2 | 機能が豊富 | 複数のプロセスを管理できる、負荷状況に応じてプロセスの数を増減できる | foreverに比べてインストールと使い方が複雑 |
上記以外にも、Node.jsサーバーをデーモンプロセスとして起動する方法があります。例えば、systemdやUpstartを使用する方法があります。これらの方法は、より高度な知識が必要となりますので、ここでは説明しません。
// app.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
To run this code as a daemon process, save it as app.js
and then run the following command:
forever start app.js
This will start the Node.js server in the background and log any output to the console. You can check that the server is running by opening a web browser and going to http://localhost:3000/.
To stop the server, you can run the following command:
forever stop app.js
This will stop the server and remove it from the forever process list.
Here is an example of how to start a Node.js server as a daemon process using the PM2
process manager:
// app.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
pm2 start app.js
This will start the Node.js server in the background and create a process file for it. You can check that the server is running by running the following command:
pm2 list
This will list all of the processes that are being managed by PM2. You can stop the server by running the following command:
pm2 stop app.js
systemdは、Linuxで使用されるシステムサービスマネージャーです。systemdを使用してNode.jsサーバーをデーモンプロセスとして起動するには、以下の手順が必要です。
- Node.jsサーバー用のsystemdサービスファイルを作成する。
- サービスファイルを
/etc/systemd/system/
ディレクトリに配置する。 systemctl enable
コマンドを使用してサービスを有効にする。
systemdサービスファイルの例を以下に示します。
[Unit]
Description=My Node.js Server
After=network.target
[Service]
User=your-user
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node /path/to/your/app/app.js
[Install]
WantedBy=multi-user.target
この例では、my-node-js-server.service
という名前のサービスファイルが作成されています。このサービスファイルは、ネットワークが起動した後、/path/to/your/app
ディレクトリでapp.js
ファイルを実行するようになっています。
サービスファイルを/etc/systemd/system/
ディレクトリに配置したら、以下のコマンドを実行してサービスを有効にする必要があります。
sudo systemctl enable my-node-js-server.service
これで、以下のコマンドを実行してサービスを起動することができます。
sudo systemctl start my-node-js-server.service
Upstartを使う
- ジョブファイルを
/etc/init/
ディレクトリに配置する。 initctl reload
コマンドを実行してジョブファイルを再読み込みする。start my-node-js-server
コマンドを使用してジョブを起動する。
Upstartジョブファイルの例を以下に示します。
start on runlevel [235]
respawn
stop on runlevel [016]
exec /usr/bin/node /path/to/your/app/app.js
この例では、my-node-js-server
という名前のジョブファイルが作成されています。このジョブファイルは、ランレベルが2、3、5のときに実行されるようになっています。
ジョブファイルを/etc/init/
ディレクトリに配置したら、以下のコマンドを実行してジョブファイルを再読み込みする必要があります。
sudo initctl reload
sudo start my-node-js-server
node.js