ウェブアプリケーションを開発・運用していると、「本番環境」「ステージング環境」「開発環境」といった複数の動作環境が必要になることが多くあります。
それぞれを独立したサーバーに分けて運用することも可能ですが、今回は一つのドメインでそれぞれを「サブディレクトリ」として切り分け、Apacheのリバースプロキシを用いてNode.jsアプリケーションに振り分ける方法を解説します。
想定する構成
たとえば、以下のようにURLを分けて、それぞれ別のNode.jsアプリケーションを実行します。
/→ 本番用アプリケーション(ポート番号:3000)/stg/→ ステージング用アプリケーション(ポート番号:3001)/dev/→ 開発用アプリケーション(ポート番号:3002)
このような構成にすることで、ひとつのIPアドレスや証明書、ドメイン名で環境ごとに挙動を切り分けることができます。
Apacheの設定
まず前提として、Node.jsとApacheはすでにインストール済みであるとします。
次に、Apacheで必要なモジュールを有効化します。
sudo a2enmod proxy
sudo a2enmod proxy_http
これにより、Apacheが外部の通信先に処理を渡すことができるようになります。
続いて、/etc/apache2/mods-enabled/proxy.conf に設定内容を記述します。
<VirtualHost *:80>
ServerName 例のドメイン名
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
ProxyPass /stg/ http://localhost:3001/
ProxyPassReverse /stg/ http://localhost:3001/
ProxyPass /dev/ http://localhost:3002/
ProxyPassReverse /dev/ http://localhost:3002/
</VirtualHost>
上記の例では、Apacheが受け取ったリクエストを、指定されたポート番号で待機している各Node.jsアプリケーションへ転送しています。
Apacheの再起動
設定ファイルを保存したら、以下のようにApacheを再起動して変更を反映させます。
sudo systemctl restart apache2
これで、Apacheはそれぞれのサブディレクトリに応じてリクエストを振り分ける準備が整いました。
Node.jsのアプリケーション設定
各環境のNode.jsアプリケーションで使用するポート番号は、アプリケーションのコード内で指定します。
以下は一般的な書き方の一例です。
const express = require('express');
const app = express();
const port = 3000; // 本番用、ステージング用は3001、開発用は3002など
app.get('/', (req, res) => {
res.send('表示内容');
});
app.listen(port, () => {
console.log(ポート${port}で待機中);
});
この例では、3000番のポートを使って待ち受けています。
ステージングや開発用には、それぞれ別のポート番号を指定してください。
アプリケーションの起動方法
それぞれの環境でアプリケーションを起動するには、各プロジェクトのディレクトリに移動してから以下のように実行します。
cd /path/to/対象の環境のディレクトリ
node アプリのファイル名.js
たとえば、本番環境のアプリは3000番、ステージングは3001番、開発は3002番のように、ポート番号を分けることで、同時に複数のアプリケーションを動かせます。
アクセスの確認
設定が完了すると、以下のように同じドメインで異なる環境にアクセスできるようになります。
http://例のドメイン名/→ 本番環境http://例のドメイン名/stg/→ ステージング環境http://例のドメイン名/dev/→ 開発環境
それぞれの環境は異なるソースコードで運用可能です。
動作確認にはブラウザでアクセスするほか、curlなどのコマンドも活用できます。
まとめ
この記事では、リバースプロキシを利用して、同一のドメインでサブディレクトリごとに異なるNode.jsアプリケーションを運用する方法を解説しました。
実際の現場では、これに加えてアクセス制御や認証の仕組み、自動起動の仕組み(たとえばPM2など)を組み合わせることで、より安定した運用が可能になります。
この構成は、開発効率の向上やテストの明確化にもつながるため、同一のサーバー内で環境を分けて管理したい場合には非常に有効です。
今後は、HTTPS対応やファイアウォールの設定についても段階的に見直すことで、より安全で信頼性の高い構成が実現できます。


コメント