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:8000Step 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終端 + レート制限でセキュリティ確保