Nginx Node.jsプロキシ設定
NginxをNode.jsアプリケーションの本番リバースプロキシとして設定する方法を解説。PM2クラスターモード統合、静的アセットのオフロード、エラーページに対応。
詳細な説明
Node.jsをNginxの背後で実行することは、本番環境のベストプラクティスとして広く推奨されています。NginxがSSL終端、静的ファイル配信、接続バッファリングを担い、Node.jsプロセスはアプリケーションロジックに専念できます。
基本的なNode.jsプロキシ
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
静的アセットの直接配信
静的ファイルをNode.jsを経由させずにNginxから直接配信します。Nginxはカーネルレベルのファイル転送を使用し、Node.jsのイベントループのオーバーヘッドを回避するため、大幅に高速です:
location /static/ {
alias /var/www/app/public/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location / {
proxy_pass http://127.0.0.1:3000;
}
PM2クラスターモード統合
PM2でNode.jsプロセスをクラスターモードで管理する場合、異なるポートで実行する全ワーカーインスタンスにロードバランスするupstreamブロックを定義します:
upstream node_app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
keepalive 64;
}
keepalive 64 ディレクティブはバックエンドへの永続的な接続プールを維持し、各プロキシリクエストのTCPハンドシェイクオーバーヘッドを排除します。
大きなリクエストボディの処理
Node.js APIは大きなJSONペイロードやファイルアップロードを受け取ることがよくあります。client_max_body_size ディレクティブを増やして対応します:
client_max_body_size 50m;
カスタムエラーページ
Node.jsアプリケーションがダウンまたは再起動中の際に、ブランドエラーページを配信して専門的なユーザー体験を提供します:
proxy_intercept_errors on;
error_page 502 503 504 /maintenance.html;
location = /maintenance.html {
root /var/www/errors;
internal;
}
Trust Proxy設定
Expressなどのフレームワークを使用する場合、app.set('trust proxy', true) を設定して、Nginxが設定した X-Forwarded-* ヘッダーをフレームワークが正しく読み取れるようにします。これにより req.ip が実際のクライアントIPを返し、req.protocol が内部HTTPプロキシ接続ではなく元のHTTPS接続を反映します。
ユースケース
Express.js、Next.js、Fastifyアプリケーションを本番環境にデプロイし、NginxでSSL処理、静的アセット配信、グレースフルなエラーハンドリングを行います。