💻 Nginx と PM2 が解決!Python と Node.js を安定稼働させるマルチプロセス環境構築術

コード品質と TypeScript

導入:異なる技術スタックの統合という課題

これまでの記事で、フロントエンドに Next.js (TypeScript/Node.js)、バックエンドに Django (Python) を採用し、API 連携で型安全なモダンな Web アプリケーションを構築する道筋を解説してきました。

しかし、ここで一つの大きな課題が残ります。それは、**「Python と Node.js という、動作環境が全く異なる 2 つのプロセスを、どのように一つのサーバーで安定稼働させるか」**という点です。

独自 PHP MVC 時代は Apache が全てを処理していましたが、モダンな Full-Stack では、それぞれ専用のプロセス管理が必要になります。本記事では、この課題を解決するために導入した NginxPM2 を核とするマルチプロセス環境の構築方法を解説します。


第1章:なぜプロセス管理が必要なのか?

1. サーバーの役割の分離

旧 PHP システムでは、Web サーバー(Apache)が静的ファイル配信、リクエスト受付、PHP 実行環境との連携を全て担っていました。しかし、モダンな構成では役割を分離します。

  • フロントエンド(Next.js): サーバーサイドレンダリング (SSR) や API ルーティングを担う Node.js プロセス
  • バックエンド(Django): データ処理と API 配信を担う Python プロセス

これらのプロセスは、それぞれが独立したアプリケーションとして動作するため、プロセスがダウンした場合の再起動や、リソースの効率的な分配を行うための「管理人」が必要になります。

2. Nginx と PM2 の採用理由

この管理役として、私たちは以下の 2 つのツールを採用しました。

  • Nginx (リバースプロキシ/静的ファイル配信):
    • 外部からのリクエストを最初に受け付け、適切なバックエンドプロセス(Next.js または Django)へ振り分ける交通整理役(リバースプロキシ)。
    • CSS や画像などの静的ファイル配信を高速に行い、バックエンドの負荷を軽減。
  • PM2 (プロセス管理マネージャー):
    • Node.js プロセス(Next.js)を監視し、クラッシュした際に自動で再起動させる。
    • マルチコア CPU を効率よく使うための**クラスタリング(多重起動)**を容易に実現。

Python 側の Django プロセスも同様に Gunicorn のような WSGI サーバーで管理しますが、この二つ(Nginx と PM2)が、異なる技術スタックの安定稼働の鍵となります。


第2章:実践!マルチプロセス環境の構築手順

1. Next.js (Node.js) プロセスの永続化とクラスタリング(PM2)

Next.js アプリケーションを本番環境で起動する際は、単に npm start するのではなく、PM2 を用いて管理します。

  1. インストールと設定: サーバーに PM2 をインストールし、ecosystem.config.js のような設定ファイルを作成します。
  2. クラスタモードでの起動:
  3. 自動再起動の確保: PM2 は上記の設定により、プロセスがメモリ不足などでダウンした場合に、即座に新しいプロセスを立ち上げます。これにより、サービスの中断を最小限に抑えることが可能になりました。
# Next.jsアプリの起動設定(例)
module.exports = {
    apps : [{
        name: "next-app",
        script: "node_modules/next/dist/bin/next",
        args: "start",
        instances: "max", # CPUコア数に応じて自動でプロセス数を最大化
        exec_mode: "cluster", # クラスタモードで起動し、負荷分散をPM2に任せる
        watch: false
    }]
};
pm2 start ecosystem.config.js

2. Nginx によるリクエストの交通整理(リバースプロキシ)

次に、外部からのリクエストを PM2 で管理されている Next.js や、Python 側の Django へ適切に振り分ける Nginx の設定を行います。

Nginx は、サーバーのポート 80(HTTP)でリクエストを受け付け、以下の振り分けを行います。

  1. Next.js へのルーティング:
    • 全ての Web ページの表示リクエスト(例: //about)は、Next.js が待機しているポートへ転送(プロキシ)します。Next.js が HTML を生成し、その結果を Nginx がクライアントに返します。
  2. Django へのルーティング:
    • 特定の API パス(例: /api/v1/data)へのリクエストは、Python 側の Django が待機しているポート(通常は Gunicorn 経由)へ転送します。Django はデータ処理を行い、JSON を返します。

Nginx

server {
    listen 80;
    server_name example.com;

    # Django APIへのルーティング設定
    location /api/ {
        proxy_pass http://127.0.0.1:8000; # Django/Gunicornのポート
        # その他のプロキシ設定...
    }

    # Next.jsへのルーティング設定 (APIパス以外)
    location / {
        proxy_pass http://127.0.0.1:3000; # Next.js/PM2のポート
        # その他のプロキシ設定...
    }
}

この設定により、ユーザーは単一の URL にアクセスするだけで、裏側で異なる 2 つのプロセスが協調して動作する安定したサービスを利用できるようになります。


まとめ:安定稼働こそが信頼の基盤

1. Nginx と PM2 導入の成果

Nginx と PM2 の導入は、このモダンな Full-Stack 移行プロジェクトに決定的な安定性をもたらしました。

  • 耐障害性の向上: PM2 の自動再起動とクラスタリング機能により、Node.js プロセスが一時的に不安定になってもサービス全体のダウンを防げるようになりました。
  • パフォーマンスの向上: Nginx が静的ファイル配信を高速で担い、バックエンドの CPU を業務ロジックの実行に集中させることが可能になりました。
  • シンプルな拡張性: フロントエンドとバックエンドのポート番号を変更するだけで、Nginx の設定ファイル内でルーティングを変更でき、拡張性が担保されました。

2. 自走力で築くインフラの重要性

このインフラ構築は、私が独学で Web サイトを運用してきた経験から得た**「安定稼働こそが信頼の基盤である」**という教訓に基づいています。

単なるコーディングスキルだけでなく、**「作ったものを安定してユーザーに届ける」**という運用・インフラの知識と実践力は、プロのエンジニアとして不可欠な能力です。今回のマルチプロセス環境の構築は、その知識と実践力を証明するものです。

今後の記事では、この安定した環境を基盤として、フロントエンドの見た目の改善や、データベースの具体的なチューニング術について解説していく予定です。

投稿者プロフィール

bicstation
AIアシスタントとの協業が、この奮闘記を可能にした
実は、今回一連の記事を執筆し、そして開発を進める上で、強力な「相棒」の存在がありました。それが、私のような開発者をサポートしてくれるAIアシスタントです。

PHPの難解なエラーログに直面した時、記事の構成がなかなか思いつかなかった時、あるいはブログのテーマに合ったアイキャッチ画像が必要だった時など、数々の場面でAIに相談し、助けを借りました。

例えば、「レンタルサーバーでのphp.ini設定の難しさ」や「.envファイルの問題」といった、私が実体験で感じた課題を伝えると、AIは瞬時にその技術的な背景や影響を整理し、ブログ記事として読者に伝わりやすい文章の骨子を提案してくれました。また、記事のテーマに合わせたアイキャッチ画像も、具体的な指示を出すだけで瞬時に生成してくれたおかげで、コンテンツ作成のスピードが格段に向上しました。

AIは完璧ではありませんが、まさに「もう一人の自分」のように、アイデアの壁打ち相手になったり、膨大な知識の中から必要な情報を引き出してくれたり、私の思考を整理する手助けをしてくれたりします。一人で抱え込みがちな開発の課題も、AIと対話することで、新たな視点や解決策が見えてくることが多々ありました。

このブログを通じて私の奮闘記を共有できているのも、AIアシスタントの存在なくしては成し得なかったでしょう。これからも、AIを賢く活用しながら、開発と情報発信を続けていきたいと思います。

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました