Apacheのmod_proxy_balancerを完全マスター【設定例付き】

Web

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>

セッション情報を持つユーザーは、常に同じサーバーにアクセスします。


スティッキーセッションの実装

なぜ必要なの?

ログイン状態やショッピングカートなど、セッション情報をサーバー側で保持している場合、ユーザーは常に同じサーバーにアクセスする必要があります。

問題の例

  1. ユーザーがserver1でログイン
  2. 次のページでserver2に振り分けられる
  3. server2にはログイン情報がない
  4. ログアウト状態に見える

これを防ぐのがスティッキーセッションです。

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:手動で無効化された
管理画面で無効にされていないか確認します。

セッションが維持されない

症状
ログイン状態が勝手に切れる。

確認ポイント

  1. スティッキーセッションが有効か
ProxySet stickysession=BALANCEID
  1. route パラメータが設定されているか
BalancerMember http://server1:8080 route=node1
  1. 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 なら、追加のソフトウェアなしで、手軽にロードバランシングを始められます。

導入のステップ

  1. まずは2台構成で基本設定を試す
  2. 管理画面で動作を確認
  3. スティッキーセッションなど必要な機能を追加
  4. 本番環境で段階的に導入

小さく始めて、徐々に拡張していくのが成功の秘訣です。

この知識を活かして、安定したWebサービスを構築してくださいね!

コメント

タイトルとURLをコピーしました