1. 概要
サービス化します。
2. サービス化
「root」ユーザ権限で。
sudo vi /etc/systemd/system/node-server.service
下記を記述します。
[Unit]
Description=Node.js App
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/server.js
WorkingDirectory=/path/to
Restart=always
RestartSec=5
User=www-data
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
上記で、「/usr/bin/node」の場所は、実際に動作させる「node」のパスを記述します。
「/path/to」の箇所は、プロジェクトディレクトリのパスを記述します。
作成したものを、読み直し・有効化・起動します。
systemctl daemon-reload
systemctl enable node-server
systemctl start node-server
起動を確認します。
systemctl status node-server
およそ下記のように表示されれば、サービスは起動しています。
● node-server.service - Node.js App
Loaded: loaded (/etc/systemd/system/node-server.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-11-18 00:38:41 UTC; 5s ago
Main PID: 1183 (MainThread)
Tasks: 7 (limit: 4558)
Memory: 19.7M
CPU: 583ms
CGroup: /system.slice/node-server.service
mq1183 /usr/bin/node /path/to/server.js
Nov 18 00:38:41 ubuntu2204 systemd[1]: Started Node.js App.
これで、システムが再起動しても、「node」サーバが起動するようになります。
3. ログ出力
「server.js」内に。
console.log()
で出力しているものが、デーモン化してしまうと、出力先がないため見えなくて困ります。
ログファイルに出力するには。
sudo vi /etc/systemd/system/node-server.service
「Service」セクションに、下記の形式で記述します。
StandardOutput=file:/path/to/myapp.log
StandardError=file:/path/to/myapp-error.log
これで、ログ、エラーログが、それぞれ。
/path/to/myapp.log
/path/to/myapp-error.log
に出力されます。
2つを同じファイルを指定してもよいです。
サービスの所有者が「root」でない場合は、下記の要領で、ファイルの作成と所有権の設定を行っておきます。
sudo touch /var/log/myapp.log
sudo chown ubuntu:ubuntu /var/log/myapp.log
その上で。
sudo systemctl daemon-reload
sudo systemctl start node-server
すれば、ログが指定したファイルへ出力されるようになります。
これは、日付がつかなくて、不満だったので、別解を次ページに記述することにします。
4. 参考サイト
本ページは、「ChatGPT」軍曹を参考にさせていただきました。