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

