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

コヌド品質ず TypeScript

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

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

しかし、ここで䞀぀の倧きな課題が残りたす。それは、**「Python ず Node.js ずいう、動䜜環境が党く異なる 2 ぀のプロセスを、どのように䞀぀のサヌバヌで安定皌働させるか」**ずいう点です。

独自 PHP MVC 時代は Apache が党おを凊理しおいたしたが、モダンな Full-Stack では、それぞれ専甚のプロセス管理が必芁になりたす。本蚘事では、この課題を解決するために導入した Nginx ず PM2 を栞ずするマルチプロセス環境の構築方法を解説したす。


第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 サむトを運甚しおきた経隓から埗た**「安定皌働こそが信頌の基盀である」**ずいう教蚓に基づいおいたす。

単なるコヌディングスキルだけでなく、**「䜜ったものを安定しおナヌザヌに届ける」**ずいう運甚・むンフラの知識ず実践力は、プロの゚ンゞニアずしお䞍可欠な胜力です。今回のマルチプロセス環境の構築は、その知識ず実践力を蚌明するものです。

今埌の蚘事では、この安定した環境を基盀ずしお、フロント゚ンドの芋た目の改善や、デヌタベヌスの具䜓的なチュヌニング術に぀いお解説しおいく予定です。

コメント

タむトルずURLをコピヌしたした