PM2を使用してNode.jsのExpressアプリケーションを管理する方法

Node.jsのExpressフレームワークを使用したアプリケーションは、その効率と拡張性で知られていますが、運用環境ではアプリケーションの管理と維持が不可欠です。ここでは、プロセスマネージャーであるPM2を用いてExpressアプリケーションを管理する方法について詳しく説明します。PM2はアプリケーションの自動再起動、ログ管理、負荷分散などを簡単に行うことができるツールです。Ubuntu環境でのログローテーション設定も合わせて解説します。

## 前提条件

- Node.jsがインストールされていること
- Expressプロジェクトが作成済みで、プロジェクトのルートディレクトリで作業が行えること
- Ubuntuシステムで作業すること

## 1. PM2のインストール

PM2はnpmを通じて簡単にインストールできます。グローバルにインストールすることで、どのプロジェクトからもPM2コマンドを利用できるようになります。

```bash
npm install pm2@latest -g
```

## 2. ExpressアプリケーションのPM2での起動

PM2を使用してExpressアプリケーションを起動するには、プロジェクトのルートディレクトリで以下のコマンドを実行します。

```bash
pm2 start app.js --name "my-express-app"
```

ここで、`app.js`はあなたのExpressアプリケーションのエントリーポイントです。`--name`オプションでPM2プロセスに名前を付けることができます。

PM2の設定を保存:
PM2に現在のプロセスリストとそれらの設定を保存させ、システム再起動後もそれらが再開されるようにします。
```bash
pm2 save
```

## 3. ログの管理

PM2では、アプリケーションの標準出力とエラー出力を自動的にログファイルにリダイレクトします。デフォルトでは、これらのログファイルは`~/.pm2/logs`に保存されます。ログファイルの場所をカスタマイズするには、以下のように`--output`および`--error`オプションを使用します。

```bash
pm2 start app.js --name "my-express-app" --output ~/logs/app-out.log --error ~/logs/app-err.log
```

## 4. Ubuntuでのログローテーション

長期間運用する場合、ログファイルが大きくなりすぎると問題が発生することがあります。Ubuntuでは`logrotate`を用いてログローテーションを設定することができます。

1. `logrotate`の設定ファイルを作成します。

```bash
sudo nano /etc/logrotate.d/my-express-app
```

2. 以下の内容をファイルに追加します。

```
/home/username/logs/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 username username
    sharedscripts
    postrotate
        pm2 reloadLogs
    endscript
}
```

この設定により、ログファイルは毎日ローテーションされ、14世代分が保存されます。`pm2 reloadLogs`コマンドは、ログローテーション後にPM2にログファイルを新しくさせるために使用されます。

## 5. PM2のその他の便利なコマンド

- **アプリケーショ

ンのリスト表示**: `pm2 list`
- **アプリケーションのモニタリング**: `pm2 monit`
- **アプリケーションの停止**: `pm2 stop my-express-app`
- **アプリケーションの削除**: `pm2 delete my-express-app`

PM2はExpressアプリケーションの運用を効率的にする強力なツールです。適切に設定することで、アプリケーションの可用性を高め、運用の手間を大きく削減することが可能です。

## package.jsonにPM2スクリプトを追加

`package.json`に関しては、PM2を利用するための直接的な記述は必要ありませんが、PM2をプロジェクト依存のツールとして扱いたい場合や、特定のスクリプトを設定してPM2で簡単に実行可能にしたい場合は、`package.json`に関連するスクリプトを追加することが有効です。

例えば、`package.json`にPM2を用いてアプリケーションを起動するためのスクリプトを追加することで、開発者がコマンドを覚える必要がなく、コンソールから簡単にプロジェクトを起動できます。以下はその一例です。

1. **スクリプトの追加**: PM2でアプリケーションを起動するためのスクリプトを`package.json`の`scripts`セクションに追加します。

```json
{
  "name": "your-express-app",
  "version": "1.0.0",
  "scripts": {
    "start": "pm2 start app.js --name 'my-express-app'",
    "stop": "pm2 stop my-express-app",
    "delete": "pm2 delete my-express-app",
    "logs": "pm2 logs"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}
```

この設定により、以下のようにnpmスクリプトを通じてPM2の操作が可能になります。

- **起動**: `npm run start`
- **停止**: `npm run stop`
- **削除**: `npm run delete`
- **ログの確認**: `npm run logs`

2. **PM2のローカルインストール**: グローバルではなくプロジェクト依存性としてPM2をインストールする場合は、以下のコマンドでPM2をプロジェクトの`devDependencies`に追加します。

```bash
npm install pm2 --save-dev
```

これにより、PM2のバージョンがプロジェクトに固定され、異なる環境間での互換性が保たれます。また、プロジェクトを他の開発者と共有する際に、PM2が必要であることが明確になり、セットアップが容易になります。

## TypeScript アプリケーションの PM2 での起動する場合

PM2を使ってapp.tsを直接起動する設定を行います。以下のコマンドを使用して、PM2にts-nodeをインタープリタとして指定し、アプリケーションを起動します。

   ```bash
   pm2 start app.ts --interpreter="./node_modules/.bin/ts-node" --name "my-express-app"
   ```

`--interpreter` オプションはPM2にどのインタープリタを使用してスクリプトを実行するかを指示します。ここではts-nodeを指定しています。--name オプションはこのプロセスに名前を付け、後から簡単に参照できるようにします。