Webサイトのアクセスが増えてくると、1台のサーバーでは処理しきれなくなることがありますよね。
ページの表示が遅くなったり、最悪の場合はサーバーがダウンしたり。せっかく人気が出てきたのに、これではもったいない。
そんなとき活躍するのが「ロードバランサー」です。複数のサーバーに負荷を分散させる仕組みですね。
この記事では、Apache HTTP Serverに標準搭載されている「mod_proxy_balancer」というモジュールを使った、ロードバランシングの実装方法を解説していきます。
初心者の方でも設定できるよう、丁寧に説明しますよ。
mod_proxy_balancerとは
基本的な役割
mod_proxy_balancer は、Apacheでロードバランシング(負荷分散)を実現するためのモジュールです。
主な機能
- 複数のバックエンドサーバーへの振り分け
- サーバーの健全性チェック
- セッションの維持(スティッキーセッション)
- 複数の振り分けアルゴリズムに対応
無料で使えて、Apacheに標準で含まれているのが大きなメリットです。
どんな構成で使うの?
典型的な構成は、こんな感じです。
構成例
インターネット
↓
Apache(ロードバランサー)
↓
├─ Webサーバー1
├─ Webサーバー2
└─ Webサーバー3
ユーザーからのリクエストをApacheが受けて、複数のWebサーバーに振り分けます。
ユーザーから見ると1つのサイトですが、裏では複数のサーバーが協力して動いているわけです。
必要なモジュール
mod_proxy_balancer を使うには、関連するモジュールも有効にする必要があります。
必須モジュール
- mod_proxy(プロキシの基本機能)
- mod_proxy_balancer(負荷分散機能)
- mod_proxy_http(HTTPプロキシ)
- mod_lbmethod_byrequests(振り分けアルゴリズム)
これらがセットで動作します。
基本的な設定方法
モジュールの有効化
まず、必要なモジュールを有効にしましょう。
Ubuntu/Debianの場合
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2
CentOS/RHELの場合
httpd.conf で以下の行のコメントを外します。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
その後、Apacheを再起動します。
sudo systemctl restart httpd
最もシンプルな設定
2台のサーバーに負荷分散する基本的な設定です。
設定例
<VirtualHost *:80>
ServerName example.com
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.10:8080
BalancerMember http://192.168.1.11:8080
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
設定の説明
<Proxy "balancer://mycluster">
バランサーのグループを定義します。名前は自由に付けられます。
BalancerMember
バックエンドサーバーのアドレスを指定。この例では2台のサーバーを登録しています。
ProxyPass
どのパスをバランサーに転送するか指定。/
なら全てのリクエストを転送します。
ProxyPassReverse
レスポンスヘッダーを書き換えて、クライアントから見て自然な動作にします。
設定ファイルの配置場所
設定をどこに書くかは、環境によって異なります。
Ubuntu/Debian
/etc/apache2/sites-available/000-default.conf
または
/etc/apache2/sites-available/example.com.conf
CentOS/RHEL
/etc/httpd/conf.d/balancer.conf
新しいファイルを作成する場合は、.conf
という拡張子を付けてください。
負荷分散アルゴリズムの種類
byrequests(リクエスト数ベース)
リクエスト数が最も少ないサーバーに振り分けます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080
BalancerMember http://server2:8080
ProxySet lbmethod=byrequests
</Proxy>
デフォルトのアルゴリズムで、最もバランスよく分散できます。
bytraffic(トラフィック量ベース)
転送したバイト数が最も少ないサーバーに振り分けます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080
BalancerMember http://server2:8080
ProxySet lbmethod=bytraffic
</Proxy>
画像や動画など、データサイズが大きいコンテンツを扱う場合に適しています。
bybusyness(負荷ベース)
現在の処理中リクエスト数が最も少ないサーバーに振り分けます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080
BalancerMember http://server2:8080
ProxySet lbmethod=bybusyness
</Proxy>
注意点
このアルゴリズムを使うには、追加モジュールが必要です。
# Ubuntu/Debian
sudo a2enmod lbmethod_bybusyness
# CentOS/RHEL(httpd.confで有効化)
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
heartbeat(ハートビートベース)
外部のハートビートサーバーからの情報に基づいて振り分けます。
高度な運用で使われる方法ですが、設定が複雑なため、小規模なシステムでは通常使いません。
重み付けとサーバーの優先度
loadfactor(負荷係数)
各サーバーへの振り分け比率を調整できます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 loadfactor=3
BalancerMember http://server2:8080 loadfactor=1
</Proxy>
この例では、server1に75%、server2に25%のリクエストが振り分けられます。
使い道
- 性能の高いサーバーに多くのリクエストを振り分ける
- 新しいサーバーを徐々に投入するとき
- メンテナンス前にトラフィックを減らすとき
route(ルート指定)
スティッキーセッションで使うサーバー識別子です。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 route=node1
BalancerMember http://server2:8080 route=node2
ProxySet stickysession=JSESSIONID
</Proxy>
セッション情報を持つユーザーは、常に同じサーバーにアクセスします。
スティッキーセッションの実装
なぜ必要なの?
ログイン状態やショッピングカートなど、セッション情報をサーバー側で保持している場合、ユーザーは常に同じサーバーにアクセスする必要があります。
問題の例
- ユーザーがserver1でログイン
- 次のページでserver2に振り分けられる
- server2にはログイン情報がない
- ログアウト状態に見える
これを防ぐのがスティッキーセッションです。
Cookieベースの実装
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 route=node1
BalancerMember http://server2:8080 route=node2
ProxySet stickysession=BALANCEID
</Proxy>
BALANCEID
という名前のCookieを使って、サーバーを識別します。
セッションIDベースの実装
JavaのセッションIDなど、アプリケーション側のセッション管理と連携できます。
設定例(Tomcatの場合)
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 route=node1
BalancerMember http://server2:8080 route=node2
ProxySet stickysession=JSESSIONID|jsessionid
</Proxy>
パイプ(|)で区切ると、複数のセッションID名に対応できます。
フェイルオーバー時の動作
スティッキーセッションを使っているサーバーが故障した場合、自動的に別のサーバーに振り分けられます。
ただし、セッション情報は失われるため、ログアウト状態になります。
これを防ぐには、セッション情報を共有する仕組み(Redisなど)が別途必要です。
ヘルスチェックの設定
自動的な故障検知
mod_proxy_balancer は、バックエンドサーバーの状態を自動的に監視します。
応答がないサーバーは、自動的に振り分け対象から除外されます。
retry パラメータ
一度故障と判定されたサーバーを、いつ再試行するか設定できます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 retry=60
BalancerMember http://server2:8080 retry=60
</Proxy>
retry=60
は、60秒後に再度試すという意味です。
timeout パラメータ
バックエンドサーバーへの接続タイムアウト時間を設定します。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 timeout=5
BalancerMember http://server2:8080 timeout=5
</Proxy>
5秒以内に応答がなければ、次のサーバーに切り替わります。
管理画面の有効化
Balancer Managerとは
mod_proxy_balancer には、Web上で設定を確認・変更できる管理画面があります。
できること
- 各サーバーの状態確認
- リアルタイムでの負荷係数変更
- サーバーの有効/無効切り替え
- アクセス統計の確認
とても便利な機能です。
管理画面の設定
設定例
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24
</Location>
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080
BalancerMember http://server2:8080
</Proxy>
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
設定の説明
<Location "/balancer-manager">
管理画面のURLを設定します。
SetHandler balancer-manager
このパスを管理画面として扱います。
Require ip
アクセスを許可するIPアドレスを指定。セキュリティのため、必ず制限してください。
ProxyPass /balancer-manager !
管理画面のパスは転送しないように除外します。
アクセス方法
設定後、ブラウザで以下のURLにアクセスします。
http://example.com/balancer-manager
各サーバーの状態や統計情報が表示され、その場で設定を変更できます。
実践的な設定例
3台構成のWebサーバー
完全な設定例
<VirtualHost *:80>
ServerName www.example.com
ServerAdmin admin@example.com
ErrorLog ${APACHE_LOG_DIR}/balancer_error.log
CustomLog ${APACHE_LOG_DIR}/balancer_access.log combined
# 管理画面の設定
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24
</Location>
# バランサーの設定
<Proxy "balancer://webcluster">
# メインサーバー(高性能)
BalancerMember http://192.168.1.10:8080 route=web1 loadfactor=3
# サブサーバー1
BalancerMember http://192.168.1.11:8080 route=web2 loadfactor=2
# サブサーバー2
BalancerMember http://192.168.1.12:8080 route=web3 loadfactor=1
# バランサーの設定
ProxySet lbmethod=byrequests
ProxySet stickysession=BALANCEID
</Proxy>
# プロキシ設定
ProxyPass /balancer-manager !
ProxyPass / balancer://webcluster/
ProxyPassReverse / balancer://webcluster/
# プロキシヘッダーの設定
ProxyPreserveHost On
</VirtualHost>
HTTPSに対応した設定
SSL/TLSを使った安全な通信の設定です。
設定例
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
<Proxy "balancer://webcluster">
BalancerMember https://server1:8443
BalancerMember https://server2:8443
</Proxy>
ProxyPass / balancer://webcluster/
ProxyPassReverse / balancer://webcluster/
# SSLプロキシの設定
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
</VirtualHost>
トラブルシューティング
サーバーが振り分け対象から外れる
症状
特定のサーバーにリクエストが行かなくなる。
原因と対策
原因1:サーバーがダウンしている
バックエンドサーバーの状態を確認してください。
原因2:ヘルスチェックが厳しすぎる
timeout 値を長くしてみましょう。
BalancerMember http://server1:8080 timeout=30
原因3:手動で無効化された
管理画面で無効にされていないか確認します。
セッションが維持されない
症状
ログイン状態が勝手に切れる。
確認ポイント
- スティッキーセッションが有効か
ProxySet stickysession=BALANCEID
- route パラメータが設定されているか
BalancerMember http://server1:8080 route=node1
- Cookieが正しく送信されているか
ブラウザの開発者ツールでCookieを確認してください。
503エラーが頻発する
症状
「Service Unavailable」エラーが出る。
原因と対策
原因1:全てのサーバーがダウン
最低1台は稼働している必要があります。
原因2:接続数の上限
ProxyPass に max パラメータを追加します。
ProxyPass / balancer://mycluster/ max=100
原因3:ファイアウォール
バックエンドサーバーへの通信が許可されているか確認してください。
パフォーマンスが悪い
改善策
KeepAlive を有効にする
ProxySet keepalive=On
ProxySet timeout=60
接続数を増やす
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 max=200
BalancerMember http://server2:8080 max=200
</Proxy>
圧縮を有効にする
mod_deflate を使って、転送量を減らせます。
セキュリティ対策
管理画面へのアクセス制限
管理画面は必ずアクセス制限してください。
IP制限
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24
Require ip 10.0.0.0/8
</Location>
パスワード認証
<Location "/balancer-manager">
SetHandler balancer-manager
AuthType Basic
AuthName "Balancer Manager"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>
ヘッダーの適切な処理
クライアントのIPアドレスなど、重要な情報を正しく伝えます。
設定例
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080
BalancerMember http://server2:8080
# クライアントIPを転送
ProxySet proxy-initial-not-pooled=On
</Proxy>
ProxyPreserveHost On
# X-Forwarded-Forヘッダーの設定
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"
タイムアウトの適切な設定
DoS攻撃を防ぐため、適切なタイムアウトを設定しましょう。
Timeout 60
ProxyTimeout 60
<Proxy "balancer://mycluster">
BalancerMember http://server1:8080 timeout=30
BalancerMember http://server2:8080 timeout=30
</Proxy>
まとめ:mod_proxy_balancerで安定したサービスを
Apacheのmod_proxy_balancerについて、基礎から実践まで解説してきました。
この記事のポイント
- mod_proxy_balancerはApache標準のロードバランサー
- 複数の振り分けアルゴリズムから選択可能
- スティッキーセッションでセッションを維持
- 重み付けでサーバーの能力差に対応
- 管理画面で簡単に運用管理
- ヘルスチェックで自動的に故障を検知
ロードバランシングは、Webサービスのスケーラビリティと可用性を高める重要な技術です。
mod_proxy_balancer なら、追加のソフトウェアなしで、手軽にロードバランシングを始められます。
導入のステップ
- まずは2台構成で基本設定を試す
- 管理画面で動作を確認
- スティッキーセッションなど必要な機能を追加
- 本番環境で段階的に導入
小さく始めて、徐々に拡張していくのが成功の秘訣です。
この知識を活かして、安定したWebサービスを構築してくださいね!
コメント