はじめに
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. ローカルでのビルド
- 依存関係をインストールします。
npm install
- プロジェクトをコンパイルします。
npm run build
これにより、node_modulesディレクトリとdistディレクトリが生成されます。
4. Xserverへのファイルアップロード
- Xserverのルートドメインディレクトリ(/example.com)にアクセスし、バックエンドモジュールのアップロード先となるディレクトリを作成します(ここでは「test-api」)。
- ビルドしたnode_modulesとdistディレクトリを「/example.com/test-api」直下にアップロードします。
注意点として、サーバーサイドのモジュールは公開ディレクトリ(/public_html/*)には配置しないようにしてください。
公開ディレクトリに配置されたファイルは、Webブラウザから直接アクセス可能となり、機密情報や重要なロジックが外部に露出するリスクがあります。
本記事で説明するように、サーバーサイドのコードは非公開のディレクトリに配置し、適切なアクセス制御を行うことが必要です。
5. リバースプロキシの設定
- 公開ディレクトリ(/example.com/public_html/test)にアクセスします。
- .htaccessファイルを作成し、以下の内容を記述してリバースプロキシを設定します。
RewriteEngine On # APIリクエストをバックエンドサーバーにプロキシ RewriteRule ^api/(.*)$ <http://localhost:3000/api/$1> [P,L]
この設定により、「https://test.example.com/api/」へのアクセスが「localhost:3000」に転送されます。
6. NestJSサーバーの起動
- モジュールをアップロードしたディレクトリ(/example.com/test-api)にssh接続します。
- 以下のコマンドでNestJSサーバーを「localhost:3000」で起動します。
node dist/main
- APIエンドポイント(https://test.example.com/api/)にアクセスして、正常に動作していることを確認します。
- 以下のようにAPIレスポンスが表示されます。
- 以下のようにAPIレスポンスが表示されます。
7. サーバーの永続化(オプション)
サーバーを永続的に実行させたい場合は、pm2を使用します。
NestJSサーバーを単に「node dist/main」コマンドで起動した場合、SSHセッションが終了すると同時にサーバーも停止してしまいます。
サーバーを24時間365日稼働させ、予期せぬ停止や再起動時にも自動的に復旧させるためには、プロセスマネージャーを使用した永続化が必要です。
- pm2をインストールします。
npm install pm2
- pm2を使用してサーバーを起動します。
pm2 start dist/main.js
pm2導入のメリット
- サーバーの常時稼働:SSHセッションが終了しても、サーバーは継続して動作します。
- 自動再起動:クラッシュや予期せぬエラーが発生した場合、自動的にサーバーを再起動します。
- ログ管理:アプリケーションのログを効率的に管理できます。
- パフォーマンスモニタリング:CPU使用率やメモリ消費などのメトリクスを監視できます。