WindowsサーバーでNode.jsを複数ユーザー実行する!PM2の競合を避けてWindows認証を成功させる解決策

Windows環境で、複数のNode.jsアプリを異なるユーザー権限で動かしたいのに、PM2の競合でエラーが出て進まない……。そんな経験はありませんか?

実は、PM2はWindows上でのマルチユーザー運用が少し苦手です。この記事では、PM2を使わずにNode.jsを「Windowsサービス」として登録し、セキュリティと安定性を両立させるプロの解決策を解説します。

PM2がWindowsのマルチユーザー環境で苦戦する理由

PM2は、実行ユーザーごとに「デーモン」という管理プロセスを1つ作ります。そのため、User1でPM2を動かしている状態でUser2が別のPM2を立ち上げようとすると、リソースの奪い合いが発生して起動に失敗することがあります。

実際の運用現場では、PM2が予期せず停止した後の自動再起動に失敗し、深夜のトラブル対応に追われるケースも少なくありません。特に msnodesqlv8 などを使ったSQL ServerのWindows認証(統合認証)が必要な場合、Node.jsプロセス自体が特定のドメインユーザー権限で動いている必要があるため、PM2の仕組みが壁になるのです。

解決策:node-windowsで「サービス化」するメリット

PM2に頼らず、ライブラリ node-windows を使ってOS標準のサービスとして登録することで、以下のメリットが得られます。

  • 権限の完全分離: 各アプリを個別のユーザー権限で、完全に独立して実行できます。
  • リソースの節約: PM2のデーモン(1つあたり50MB〜100MB程度)が不要になり、メモリ消費を抑えられます。
  • 高い可用性: Windowsのサービス管理(SCM)に任せることで、OS再起動時の自動復旧が非常に安定します。

現場でハマる3つの注意点

Windowsサービスとして運用する際、私の経験上、特に以下の3点に気をつけるとうまくいきます。

  • サービスとしてログオン: 実行ユーザーに「サービスとしてログオン」の権限をローカルポリシーで付与してください。
  • フルパス指定: サービス実行時は環境変数が読み込まれないことがあるため、Node.jsの実行ファイルやスクリプトの場所は必ず フルパス で書きましょう。
  • ネイティブモジュールの再ビルド: Node.jsのバージョンを変えた際は npm rebuild を忘れずに。

サービス登録のコード例

const Service = require('node-windows').Service;

// サービスの設定
const svc = new Service({
  name: 'Backend_App_User1',
  description: 'ユーザー1用 Windows認証対応バックエンド',
  script: 'C:\\inetpub\\apps\\backend1\\index.js',
  env: [{ name: 'PORT', value: 3001 }]
});

// インストール完了時の処理
svc.on('install', function() {
  console.log('サービスが正常にインストールされました');
  svc.start();
});

svc.install();

まとめ:OS標準機能を使い倒すのが近道

無理にPM2で管理しようとするよりも、Windowsの 標準機能(サービス) を活用するほうが、セキュリティ面でも運用面でもシンプルで堅牢になります。特にドメイン環境での業務アプリ運用では、この「ネイティブな構成」こそが最適解と言えるでしょう。

タイトルとURLをコピーしました