目次
- ロードバランサーとは何か
- ロードバランサーがない場合の問題
- ロードバランサー導入のメリット
- L4とL7ロードバランサーの違い
- L4ロードバランサー(トランスポート層)
- L7ロードバランサー(アプリケーション層)
- 負荷分散アルゴリズムの種類
- ラウンドロビン
- 重み付きラウンドロビン
- 最小接続数(Least Connections)
- IPハッシュ
- ヘルスチェックの仕組み
- ヘルスチェックの種類
- アプリケーション側のヘルスチェックエンドポイント
- セッション管理とスティッキーセッション
- スティッキーセッション
- 外部セッションストアの活用(推奨)
- 主要なロードバランサーの設定例
- Nginxでのロードバランシング
- AWS ALB(Application Load Balancer)
- まとめ:適切なロードバランサー構成を選ぼう
「サーバーが1台だけだと不安」「アクセスが集中するとサイトが落ちる」——サービスが成長するにつれて、多くのエンジニアがこうした課題に直面します。
ロードバランサー(負荷分散装置)は、複数のサーバーにトラフィックを分散することで、可用性とパフォーマンスを向上させる仕組みです。本記事では、ロードバランサーの基本概念から具体的な設定方法まで、初心者にもわかりやすく解説します。
ロードバランサーとは何か
ロードバランサーは、クライアントからのリクエストを複数のバックエンドサーバーに振り分ける役割を持つコンポーネントです。
ロードバランサーがない場合の問題
サーバーが1台だけの構成では、以下の問題が発生します。
単一障害点(SPOF)
そのサーバーが停止すると、サービス全体が利用不能になります。ハードウェア故障、ソフトウェアのバグ、メンテナンスなど、停止の原因は多岐にわたります。
スケーラビリティの限界
1台のサーバーで処理できるリクエスト数には上限があります。アクセスが増加すると、レスポンス時間が悪化し、最終的にはサーバーダウンにつながります。
メンテナンスの困難さ
サーバーのアップデートやアプリケーションのデプロイ時に、サービスを一時停止する必要があります。
ロードバランサー導入のメリット
高可用性
バックエンドサーバーの1台が停止しても、他のサーバーがリクエストを処理し続けるため、サービスは継続します。
水平スケーリング
サーバーを追加するだけで処理能力を増強できます。1台のサーバーを高性能にする「垂直スケーリング」にはコスト的な限界がありますが、水平スケーリングは柔軟に対応できます。
ゼロダウンタイムデプロイ
ローリングデプロイ(サーバーを1台ずつ更新)により、サービスを停止せずにアプリケーションを更新できます。
L4とL7ロードバランサーの違い
ロードバランサーは、OSI参照モデルのどのレイヤーで動作するかによって、L4(レイヤー4)とL7(レイヤー7)に分類されます。
L4ロードバランサー(トランスポート層)
IPアドレスとポート番号に基づいてトラフィックを振り分けます。パケットの中身(HTTPヘッダーやURL)は確認しません。
特徴
・高速な処理(パケット内容を解析しないため)
・プロトコルに依存しない(HTTP以外の通信にも対応)
・URLやCookieによる振り分けは不可
・TCP/UDP レベルでの分散
用途:データベースの負荷分散、TCPベースのサービス、高スループットが求められる場面。
L7ロードバランサー(アプリケーション層)
HTTPヘッダー、URL、Cookie、リクエストボディなどの情報に基づいて、より高度な振り分けが可能です。
特徴
・URLパスやホスト名による振り分け(パスベースルーティング)
・HTTPヘッダーやCookieによるセッション維持
・SSL/TLS終端処理(SSLオフロード)
・コンテンツに応じたキャッシュやレスポンスの書き換え
用途:Webアプリケーション、API、マイクロサービスのルーティング。
# L7ロードバランサーによるパスベースルーティングの例
/api/* → APIサーバー群
/static/* → 静的ファイルサーバー群
/admin/* → 管理画面サーバー
/ → Webアプリサーバー群
負荷分散アルゴリズムの種類
ロードバランサーがどのサーバーにリクエストを振り分けるかは、分散アルゴリズムによって決まります。
ラウンドロビン
リクエストを順番に各サーバーへ振り分けます。最もシンプルなアルゴリズムです。
// ラウンドロビンのイメージ
リクエスト1 → サーバーA
リクエスト2 → サーバーB
リクエスト3 → サーバーC
リクエスト4 → サーバーA // 最初に戻る
リクエスト5 → サーバーB
...
すべてのサーバーが同等の性能を持つ場合に適しています。性能差がある場合は、重み付きラウンドロビンを使用します。
重み付きラウンドロビン
各サーバーに重み(Weight)を設定し、性能に応じてリクエストの比率を変えます。
// 重み付きラウンドロビン(A:3, B:2, C:1の場合)
リクエスト1 → サーバーA
リクエスト2 → サーバーA
リクエスト3 → サーバーA
リクエスト4 → サーバーB
リクエスト5 → サーバーB
リクエスト6 → サーバーC
// サーバーAが50%、Bが33%、Cが17%のリクエストを処理
最小接続数(Least Connections)
現在の接続数が最も少ないサーバーにリクエストを振り分けます。処理時間にばらつきがある場合に効果的です。
// 最小接続数のイメージ
サーバーA: 現在の接続数 5
サーバーB: 現在の接続数 2 ← 次のリクエストはここに振り分け
サーバーC: 現在の接続数 8
IPハッシュ
クライアントのIPアドレスからハッシュ値を計算し、常に同じサーバーに振り分けます。セッション維持が必要な場合に使用しますが、セッションのサーバー側管理(後述)が推奨されます。
ヘルスチェックの仕組み
ロードバランサーは、バックエンドサーバーの状態を定期的に確認(ヘルスチェック)し、正常なサーバーにのみリクエストを振り分けます。
ヘルスチェックの種類
アクティブヘルスチェック
ロードバランサーが定期的にバックエンドサーバーにリクエストを送信し、応答を確認します。
# Nginxでのアクティブヘルスチェック設定
upstream backend {
zone backend 64k;
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
}
server {
location /api/ {
proxy_pass http://backend;
# ヘルスチェック関連の設定
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 3;
}
}
パッシブヘルスチェック
実際のリクエストの結果に基づいてサーバーの状態を判定します。エラーが連続した場合にサーバーを異常と判断します。
# Nginxでのパッシブヘルスチェック設定
upstream backend {
server 192.168.1.10:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:3000 max_fails=3 fail_timeout=30s;
# 3回連続で失敗すると30秒間そのサーバーを除外
}
アプリケーション側のヘルスチェックエンドポイント
// Node.js(Express)でのヘルスチェックエンドポイント
app.get('/health', async (req, res) => {
try {
// データベース接続の確認
await db.query('SELECT 1');
// Redisの接続確認
await redis.ping();
res.status(200).json({
status: 'healthy',
timestamp: new Date().toISOString(),
checks: {
database: 'ok',
redis: 'ok',
},
});
} catch (error) {
res.status(503).json({
status: 'unhealthy',
timestamp: new Date().toISOString(),
error: error.message,
});
}
});
セッション管理とスティッキーセッション
ロードバランサーを導入すると、同じユーザーのリクエストが異なるサーバーに振り分けられる可能性があります。セッション管理の方法を検討する必要があります。
スティッキーセッション
同じユーザーのリクエストを常に同じサーバーに振り分ける方式です。
# NginxでのCookieベーススティッキーセッション
upstream backend {
ip_hash; # IPアドレスベースのスティッキーセッション
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
}
スティッキーセッションの問題点
・サーバーが停止するとそのサーバーのセッションが失われる
・負荷が均等に分散されない可能性がある
・サーバーの追加・削除時にセッションが再配置される
外部セッションストアの活用(推奨)
セッション情報をサーバーのメモリではなく、外部のデータストア(Redis、Memcached等)に保存する方式です。
// Node.js(Express)でのRedisセッションストア
const session = require('express-session');
const RedisStore = require('connect-redis').default;
const redis = require('redis');
const redisClient = redis.createClient({
host: 'redis.example.com',
port: 6379,
});
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
httpOnly: true,
maxAge: 3600000, // 1時間
},
}));
// どのサーバーにリクエストが振り分けられても
// 同じセッション情報にアクセスできる
外部セッションストアを使えば、スティッキーセッションが不要になり、負荷を均等に分散できます。
主要なロードバランサーの設定例
実際に使用される主要なロードバランサーの設定方法を紹介します。
Nginxでのロードバランシング
# /etc/nginx/nginx.conf
http {
upstream api_servers {
least_conn; # 最小接続数アルゴリズム
server 192.168.1.10:3000 weight=3;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 weight=1;
server 192.168.1.13:3000 backup; # バックアップサーバー
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/ssl/certs/api.example.com.pem;
ssl_certificate_key /etc/ssl/private/api.example.com.key;
location / {
proxy_pass http://api_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_send_timeout 60s;
proxy_read_timeout 60s;
}
}
}
AWS ALB(Application Load Balancer)
// AWS CDK(TypeScript)でのALB設定例
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
// ALBの作成
const alb = new elbv2.ApplicationLoadBalancer(this, 'ALB', {
vpc,
internetFacing: true,
});
// ターゲットグループの作成
const targetGroup = new elbv2.ApplicationTargetGroup(this, 'TargetGroup', {
vpc,
port: 3000,
protocol: elbv2.ApplicationProtocol.HTTP,
targetType: elbv2.TargetType.INSTANCE,
healthCheck: {
path: '/health',
interval: cdk.Duration.seconds(30),
timeout: cdk.Duration.seconds(5),
healthyThresholdCount: 2,
unhealthyThresholdCount: 3,
},
});
// リスナーの追加
const listener = alb.addListener('Listener', {
port: 443,
certificates: [certificate],
});
listener.addTargetGroups('DefaultTarget', {
targetGroups: [targetGroup],
});
// パスベースルーティング
listener.addAction('APIRoute', {
priority: 10,
conditions: [elbv2.ListenerCondition.pathPatterns(['/api/*'])],
action: elbv2.ListenerAction.forward([apiTargetGroup]),
});
まとめ:適切なロードバランサー構成を選ぼう
ロードバランサーは、サービスの信頼性とスケーラビリティを確保するために不可欠なコンポーネントです。
本記事のポイントを整理します。
基本概念
・ロードバランサーは複数サーバーにトラフィックを分散する
・単一障害点の排除、水平スケーリング、ゼロダウンタイムデプロイを実現する
L4とL7の使い分け
・L4は高速で汎用的、L7は高度なルーティングが可能
・WebアプリケーションではL7(HTTP)ロードバランサーが一般的
分散アルゴリズム
・ラウンドロビン:シンプルで均等な分散
・最小接続数:処理時間にばらつきがある場合に有効
・IPハッシュ:セッション維持に使えるが、外部セッションストアが推奨
運用のポイント
・ヘルスチェックを必ず設定し、異常なサーバーを自動排除する
・セッション管理はRedisなどの外部ストアを活用する
・X-Forwarded-Forなどのヘッダーでクライアントの実IPを保持する
小規模なサービスでも、ロードバランサーの導入は可用性の向上に大きく貢献します。サービスの成長に備えて、早い段階からロードバランサーを見据えたアーキテクチャを設計しておくことを推奨します。
先行モニター企業 募集中|先着5社・2026年11月末まで 生成AIの利用費、「誰が・何のために・いくら」まで見えていますか?
株式会社カイダンと共同開発したAI利用ガバナンスSaaS「ManageAI」は、OpenAI・Azure OpenAI・Claude・AWS Bedrock・Google Vertex AIの費用と利用状況を、部署・利用者・プロジェクト別に可視化します。導入は読み取り専用キーの登録だけ。初期費用0円・月額5万円(税別)で先行モニター企業を募集しています。
ニュースリリースを読む関連記事
Related / 9 articles
Notes & Insights
- プログラミング
DDoS攻撃の仕組みと対策入門|レイヤー別の防御とCDN・クラウドの活用
DDoS攻撃をボリューム型・プロトコル型・アプリ層に分けて仕組みを解説し、自前サーバーで防げない理由、CloudflareやAWS Shieldの標準防御、オリジンIPの隠し方、レートリミットとBot対策、攻撃を受けたときの初動、費用が跳ね上がるDenial of Walletへの備えまでわかります。
- プログラミング
WAFとは?仕組み・導入パターン・誤検知対策|Webアプリを攻撃から守る実践ガイド
WAFがファイアウォールやIDSと何が違うのか、シグネチャとマネージドルールの仕組み、Cloudflare WAF・AWS WAF・ModSecurityの比較、フォーム送信がブロックされる誤検知の調査と例外設定、ログ監視、WAFが代替できないことまで実践的に解説します。
- プログラミング
セキュリティヘッダー入門|CSP・HSTS・X-Frame-Optionsの設定と効果を実践解説
CSP・HSTS・X-Frame-Options・X-Content-Type-Optionsなど主要セキュリティヘッダーが防ぐ攻撃と、CSPのReport-Onlyからの段階導入、nonce/hash、HSTS preloadの不可逆リスク、Nginx・Next.js・Astroでの設定例、確認方法を解説します。
- プログラミング
クラウドの通信費(Egress)入門|データ転送量課金の仕組みと転送コストを抑える設計
クラウドの「受信無料・送信有料」の原則、AZ間・リージョン間・インターネット向けの単価差、NATゲートウェイ処理料の罠、CDNで転送量を減らす方法、バックアップやログ転送の見落とし、請求書で転送料を特定する手順を解説。想定外の請求を防げます。
- プログラミング
秘密情報をGitに入れない仕組み|.gitignore・git-secrets・履歴から漏れた鍵の削除
APIキーや.envをGitにコミットしてしまう典型経路と、.gitignore・.env.exampleの運用、pre-commitでのgitleaks検知、GitHub secret scanningの活用、漏れた鍵の無効化と履歴書き換え(git filter-repo)の手順を解説。仕組みで再発を防げます。
- プログラミング
開発・ステージング・本番環境の分離設計|環境差分をなくす構成とアクセス制御
開発・ステージング・本番それぞれの目的と、構成をコードで揃える方法、環境別の設定注入、本番データを使わないテストデータ戦略、ステージングの保護(Basic認証・IP制限・noindex)、コストを抑える運用までを解説。環境差分による本番障害を防げます。
- プログラミング
ngrok・Cloudflare Tunnelでローカルを公開|Webhook開発とデモ環境の作り方
NAT内のローカル環境にStripeやLINEのWebhookを届けるトンネリングの仕組みを解説。ngrok・Cloudflare Tunnel・localtunnelの比較、固定ドメインと認証、リクエスト検査、公開時のセキュリティ、自宅サーバー公開への応用までわかります。
- プログラミング
ローカル開発環境のHTTPS化|mkcert・hostsファイル・自己署名証明書の正しい使い方
ローカル開発をHTTPS前提にすべき理由(Secure Cookie・Service Worker・OAuth)と、mkcertでローカルCAを作りhostsで独自ドメインを割り当ててVite・Next.js・Dockerで使う手順を解説。証明書警告を無視する癖の危険も理解できます。
- プログラミング
localhost・0.0.0.0・127.0.0.1の違い|ポートとUnixソケットを理解して「つながらない」を解決
localhost・127.0.0.1・0.0.0.0の意味の違い、Dockerで外から接続できない原因、host.docker.internal、ポート競合の調べ方、Unixソケットの利点と権限、1024未満ポートの制約を解説。「つながらない」を仕組みから解決できます。
先行モニター企業 募集中
生成AIのコストを「部署別」に、請求書より先に。
先着5社限定・2026年11月末まで。初期費用0円・月額5万円(税別)で、正式版と同等の機能に加え、開発者と伴走者による導入支援を追加費用なしで提供します。プロンプト原文は一切取得しません。
株式会社カイダン × Harmonic Society株式会社の共同事業|読み取り専用キーの登録だけで導入できます