nginx

nginx負荷分散入門!ロードバランサーの設定方法

nginx

nginx負荷分散入門!
ロードバランサーの設定方法

nginxでロードバランシングを設定し、複数サーバーに負荷を分散する方法を解説します。

こんな人向けの記事です

  • Webサーバーの負荷分散を設定したい人
  • nginxをロードバランサーとして使いたい人
  • 高可用性システムを構築したい人

Step 1ロードバランシングとは

ロードバランシングは、複数のサーバーにリクエストを分散し、1台あたりの負荷を軽減する手法です。

ロードバランシングのメリット
# 1. 負荷分散: リクエストを複数サーバーに分配
# 2. 高可用性: 1台が障害でも他のサーバーが処理を継続
# 3. スケーラビリティ: サーバーを追加するだけで処理能力UP
# 4. メンテナンス: ローリングアップデートが可能

# 構成イメージ:
#
# クライアント → nginx(ロードバランサー)
#                   ├→ app-server-1:8000
#                   ├→ app-server-2:8000
#                   └→ app-server-3:8000

Step 2基本設定(ラウンドロビン)

/etc/nginx/conf.d/loadbalancer.conf
# upstream: バックエンドサーバーのグループを定義
upstream app_servers {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://app_servers;
        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_connect_timeout 5s;
        proxy_read_timeout 30s;
        proxy_send_timeout 30s;
    }
}
デフォルトはラウンドロビン
何も指定しない場合、リクエストは順番に各サーバーに振り分けられます。

Step 3分散アルゴリズム

/etc/nginx/conf.d/loadbalancer.conf
# 1. ラウンドロビン(デフォルト)
upstream app_round_robin {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000;
}

# 2. 重み付けラウンドロビン
upstream app_weighted {
    server 192.168.1.10:8000 weight=3;  # 3倍のリクエスト
    server 192.168.1.11:8000 weight=2;  # 2倍のリクエスト
    server 192.168.1.12:8000 weight=1;  # 基準
}

# 3. 最少接続数(least_conn)
upstream app_least_conn {
    least_conn;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000;
}

# 4. IPハッシュ(同じIPは同じサーバーへ)
upstream app_ip_hash {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000;
}

Step 4ヘルスチェック

/etc/nginx/conf.d/loadbalancer.conf
upstream app_servers {
    server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;

    # バックアップサーバー(他が全滅したら使う)
    server 192.168.1.20:8000 backup;
}

# max_fails=3: 3回失敗したらダウンとみなす
# fail_timeout=30s: 30秒後に再度チェック

# サーバーを一時的に外す
# server 192.168.1.12:8000 down;  # メンテナンス時
パッシブヘルスチェック
nginx OSSはパッシブ(リクエスト失敗を検知)のみ。アクティブヘルスチェック(定期的にping)はnginx Plus(有料版)の機能です。

Step 5セッション維持(スティッキーセッション)

/etc/nginx/conf.d/loadbalancer.conf
# 方法1: ip_hash(同じIPを同じサーバーに)
upstream app_sticky {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

# 方法2: Cookieベース(ハッシュ)
upstream app_cookie {
    hash $cookie_sessionid consistent;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

# 推奨: セッションを外部ストレージ(Redis等)に保存
# → どのサーバーに振り分けられてもセッション維持可能
# → サーバー追加・削除が容易
ベストプラクティス
スティッキーセッションよりも、Redis等の外部セッションストアを使う方がスケーラブルです。

Step 6SSL終端とセキュリティ

/etc/nginx/conf.d/loadbalancer.conf
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    # レート制限
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

    location / {
        proxy_pass http://app_servers;
        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 https;
    }

    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://app_servers;
    }
}

# HTTPからHTTPSへリダイレクト
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

まとめ

  • upstreamディレクティブでサーバーグループを定義
  • ラウンドロビン、重み付け、最少接続、IPハッシュから選択
  • max_fails + fail_timeoutでパッシブヘルスチェック
  • セッション維持はRedis外部ストアが推奨
  • SSL終端 + レート制限でセキュリティ確保