XserverにNestJSで構築したAPIをデプロイする方法

はじめに

Xserverは日本国内で人気の高いレンタルサーバーですが、標準ではNode.jsをサポートしていません。

しかし、適切な設定を行えばNestJSで構築したAPIを動作させることが可能です。

本記事では、XserverにNestJSのAPIをデプロイする方法を詳しく解説します。

デプロイ手順

筆者の作業環境

本記事では、以下の条件を前提としています。

  • APIエンドポイントはサブドメインに公開する。
    • 例:test.example.com/
    • ちなみにルートドメインは、WordPressで使用しています。
  • NestJSの開発は、Xserver対応のNode.js v16.20.2で行っています。

1. Xserverへの Node.js インストール

まず、XserverにNode.jsをインストールする必要があります。詳細な手順については、XserverにNode.jsをインストールする方法を参照してください。

2. ソースコードの準備

APIエンドポイントにグローバルプレフィックスを追加します。

これにより、APIエンドポイントとフロントエンド(静的ファイルのルート)へのアクセスを明確に分けることができます。

main.tsファイルを以下のように修正します。

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // グローバルプレフィックスを設定
  app.setGlobalPrefix('api');
  await app.listen(3000);
}

この設定により、「localhost/api/」配下がAPIエンドポイントとなります。

3. ローカルでのビルド

  1. 依存関係をインストールします。
    npm install
  2. プロジェクトをコンパイルします。
    npm run build

これにより、node_modulesディレクトリとdistディレクトリが生成されます。

4. Xserverへのファイルアップロード

  1. Xserverのルートドメインディレクトリ(/example.com)にアクセスし、バックエンドモジュールのアップロード先となるディレクトリを作成します(ここでは「test-api」)。
  2. ビルドしたnode_modulesとdistディレクトリを「/example.com/test-api」直下にアップロードします。

注意点として、サーバーサイドのモジュールは公開ディレクトリ(/public_html/*)には配置しないようにしてください。

公開ディレクトリに配置されたファイルは、Webブラウザから直接アクセス可能となり、機密情報や重要なロジックが外部に露出するリスクがあります。

本記事で説明するように、サーバーサイドのコードは非公開のディレクトリに配置し、適切なアクセス制御を行うことが必要です。

5. リバースプロキシの設定

  1. 公開ディレクトリ(/example.com/public_html/test)にアクセスします。
  2. .htaccessファイルを作成し、以下の内容を記述してリバースプロキシを設定します。
    RewriteEngine On
    # APIリクエストをバックエンドサーバーにプロキシ
    RewriteRule ^api/(.*)$ <http://localhost:3000/api/$1> [P,L]
    

    この設定により、「https://test.example.com/api/」へのアクセスが「localhost:3000」に転送されます。

6. NestJSサーバーの起動

  1. モジュールをアップロードしたディレクトリ(/example.com/test-api)にssh接続します。
  2. 以下のコマンドでNestJSサーバーを「localhost:3000」で起動します。
    node dist/main
  3. APIエンドポイント(https://test.example.com/api/)にアクセスして、正常に動作していることを確認します。
    • 以下のようにAPIレスポンスが表示されます。

7. サーバーの永続化(オプション)

サーバーを永続的に実行させたい場合は、pm2を使用します。

NestJSサーバーを単に「node dist/main」コマンドで起動した場合、SSHセッションが終了すると同時にサーバーも停止してしまいます。

サーバーを24時間365日稼働させ、予期せぬ停止や再起動時にも自動的に復旧させるためには、プロセスマネージャーを使用した永続化が必要です。

  1. pm2をインストールします。
    npm install pm2
  2. pm2を使用してサーバーを起動します。
    pm2 start dist/main.js

pm2導入のメリット

  1. サーバーの常時稼働:SSHセッションが終了しても、サーバーは継続して動作します。
  2. 自動再起動:クラッシュや予期せぬエラーが発生した場合、自動的にサーバーを再起動します。
  3. ログ管理:アプリケーションのログを効率的に管理できます。
  4. パフォーマンスモニタリング:CPU使用率やメモリ消費などのメトリクスを監視できます。