Node.js Expressサービス

Node.js Expressアプリケーション用のプロダクション対応systemdサービスを作成します。環境変数、ワーキングディレクトリ、journalへのログ出力、適切なプロセス管理について解説します。

Application Services

詳細な説明

systemdでNode.jsをプロダクション運用する

Node.jsアプリケーションはデフォルトでフォアグラウンドで実行されるため、Type=simpleに最適です。適切に設定されたsystemdユニットは、PM2のようなプロセスマネージャーを置き換え、Linuxシステムとのより良い統合を提供します。

[Unit]
Description=Node.js Express API
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=5
User=nodeapp
Group=nodeapp
WorkingDirectory=/opt/myapp
Environment="NODE_ENV=production"
Environment="PORT=3000"
StandardOutput=journal
StandardError=journal
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

環境設定

Node.jsアプリケーションでは、環境変数が標準的な設定方法です。2つのオプションがあります:

インライン変数(機密でない値の場合):

Environment="NODE_ENV=production"
Environment="PORT=3000"

環境ファイル(シークレットや多数の変数の場合):

EnvironmentFile=/opt/myapp/.env

ファイルディスクリプタ制限

多数の同時接続を処理するNode.jsアプリケーションは、ファイルディスクリプタ制限の引き上げが必要です。Linuxのデフォルト制限(1024)はプロダクションサーバーには低すぎます。

PM2ではなくsystemdを使う理由

PM2はNode.jsエコシステムで人気がありますが、systemdは以下を提供します:

  • 統一された管理: 他のすべてのシステムサービスと同じインターフェース
  • 起動統合: システム起動時の自動起動
  • Journalログ: ローテーション付きの一元ログ
  • リソース制御: cgroupsによるメモリ/CPU制限
  • 依存関係の順序付け: データベース、ネットワークなどの後に起動

ユースケース

クラッシュ時の自動再起動、環境ベースの設定、一元ログ、システム起動プロセスとの統合が必要なNode.js Express APIサーバーをプロダクションにデプロイする場合に使用します。

試してみる — Systemd Unit File Generator

フルツールを開く