Apacheでmod_proxy_balancerを使ったロードバランサー構築方法を徹底解説

Apacheのmod_proxy_balancerは、複数のWebサーバーにトラフィックを分散するための強力なツールです。大規模なWebサイトでは、一台のサーバーだけではアクセス集中に耐えられず、パフォーマンスが低下する可能性があります。こうした状況を回避するために、ロードバランサーを導入することが一般的です。

mod_proxy_balancerはApacheのモジュールの一つで、シンプルにロードバランサーを構築できるため、多くの企業やプロジェクトで利用されています。Apacheを使用している環境であれば、追加のソフトウェアを導入する必要がなく、設定ファイルを編集するだけで負荷分散が実現できます。

本記事では、mod_proxy_balancerを使ってロードバランサーを構築する方法をステップバイステップで解説します。基本的なインストール方法から、複数のバックエンドサーバーの設定、負荷分散アルゴリズムの選択、障害時のフェイルオーバー対応まで、実践的な内容を網羅します。これにより、高可用性で効率的なWebサイト運用が可能になります。

目次

mod_proxy_balancerとは?


mod_proxy_balancerは、Apache HTTP Serverに組み込まれているモジュールで、複数のバックエンドサーバーにトラフィックを分散する役割を担います。これにより、高い可用性とスケーラビリティを実現できます。

主な役割と特徴


mod_proxy_balancerは以下の機能を提供します。

  • 負荷分散:複数のサーバーにリクエストを振り分けて負荷を分散します。
  • 障害時のフェイルオーバー:バックエンドサーバーがダウンした場合、自動的に他のサーバーにリクエストを切り替えます。
  • セッション維持(スティッキーセッション):ユーザーのセッションが切れないよう、同じサーバーにリクエストをルーティングします。
  • 柔軟な設定:Apacheの設定ファイルで簡単に設定可能で、複雑な構成にも対応できます。

mod_proxy_balancerが選ばれる理由

  1. Apacheに標準搭載:追加のソフトウェアをインストールせずに利用可能です。
  2. 拡張性が高い:Apacheの他のモジュール(mod_ssl、mod_rewriteなど)と連携してセキュリティやルーティングを強化できます。
  3. コスト削減:オープンソースであり、追加費用なしで高機能なロードバランサーを構築できます。

mod_proxy_balancerはシンプルかつ強力なソリューションで、リソースを効率的に活用しながら、Webアプリケーションの安定稼働を支えます。次のセクションでは、必要な環境とインストール方法について詳しく解説します。

必要な環境とインストール方法

mod_proxy_balancerを使用するには、Apache HTTP Serverがインストールされている必要があります。以下に、環境の準備からmod_proxy_balancerのインストールまでの手順を詳しく説明します。

必要な環境

  • OS:Linux (CentOS, Ubuntu, Debianなど) または Windows
  • Apacheバージョン:2.4以降推奨(mod_proxy_balancerはApache 2.1以降で利用可能)
  • 権限:rootまたはsudo権限が必要

インストール手順

1. Apacheのインストール(未インストールの場合)


CentOS/RHEL:

sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl start httpd


Ubuntu/Debian:

sudo apt update
sudo apt install apache2
sudo systemctl enable apache2
sudo systemctl start apache2

2. mod_proxy_balancerモジュールのインストールと有効化


mod_proxy_balancerはApacheの標準モジュールの一部ですが、デフォルトで無効になっていることがあります。有効化するには以下のコマンドを実行します。

CentOS/RHEL:

sudo yum install mod_proxy_html mod_proxy_balancer


Ubuntu/Debian:

sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2

3. モジュールの確認


以下のコマンドで、mod_proxy_balancerが有効になっているか確認します。

apachectl -M | grep proxy_balancer


proxy_balancer_module (shared)と表示されていれば、インストールと有効化は完了です。

インストール後の確認


Apacheが正しく動作しているかを確認するには、以下のURLにアクセスしてください。

http://<サーバーのIPアドレスまたはドメイン>/  


Apacheのデフォルトページが表示されれば、環境の準備は完了です。次に、ロードバランサーの基本的な設定方法について解説します。

基本的な設定方法

mod_proxy_balancerを使ったロードバランサーの設定は、Apacheの設定ファイル(httpd.confまたはサイトごとの設定ファイル)を編集して行います。ここでは、シンプルなロードバランサーの設定例を紹介します。

設定ファイルの場所

  • CentOS/RHEL: /etc/httpd/conf/httpd.conf
  • Ubuntu/Debian: /etc/apache2/sites-available/000-default.conf

設定例:シンプルなロードバランサー


以下の設定では、2台のバックエンドサーバー(192.168.1.10と192.168.1.11)にトラフィックを分散します。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080
    BalancerMember http://192.168.1.11:8080
    ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
    ServerName example.com

    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"

    ErrorLog ${APACHE_LOG_DIR}/balancer_error.log
    CustomLog ${APACHE_LOG_DIR}/balancer_access.log combined
</VirtualHost>

設定内容の解説

1. バランサークラスタの定義

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080
    BalancerMember http://192.168.1.11:8080
    ProxySet lbmethod=byrequests
</Proxy>
  • BalancerMember:ロードバランサーがリクエストを振り分けるバックエンドサーバーを指定します。
  • ProxySet lbmethod:負荷分散の方法を指定します。byrequestsはリクエスト数が均等になるように分散します。

2. バーチャルホストの設定

<VirtualHost *:80>
    ServerName example.com
    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"
</VirtualHost>
  • ProxyPass:クライアントからのリクエストをバランサークラスタ(balancer://mycluster)に転送します。
  • ProxyPassReverse:バックエンドからのレスポンスをクライアントに正しく転送します。

設定の反映と確認


設定ファイルを保存したら、Apacheを再起動して設定を反映します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL


以下のコマンドで、設定が正しいかを確認します。

apachectl configtest


「Syntax OK」と表示されれば問題ありません。

ロードバランサーが正しく動作しているかは、ブラウザでhttp://example.comにアクセスして確認します。次に、複数のバックエンドサーバーの詳細な設定方法について説明します。

複数のバックエンドサーバーを設定する方法

複数のバックエンドサーバーをmod_proxy_balancerで管理することで、トラフィックの分散や冗長性を強化できます。このセクションでは、複数のバックエンドサーバーをバランサークラスタに追加する方法を解説します。

設定例:3台のバックエンドサーバーを構成


以下は、3台のバックエンドサーバー(192.168.1.10, 192.168.1.11, 192.168.1.12)を使用したロードバランサー設定例です。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080 loadfactor=1
    BalancerMember http://192.168.1.11:8080 loadfactor=2
    BalancerMember http://192.168.1.12:8080 loadfactor=1
    ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
    ServerName example.com

    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"

    ErrorLog ${APACHE_LOG_DIR}/balancer_error.log
    CustomLog ${APACHE_LOG_DIR}/balancer_access.log combined
</VirtualHost>

設定内容の解説

1. バランサーメンバーの追加

BalancerMember http://192.168.1.12:8080 loadfactor=1
  • BalancerMemberを追加することで、簡単にバックエンドサーバーを増やせます。

2. 負荷の比重(loadfactor)の設定

loadfactor=2
  • loadfactorを使って、特定のサーバーに多くのリクエストを振り分けることができます。
  • この例では、192.168.1.11に他のサーバーの2倍の負荷を与えています。

3. 負荷分散方法の選択

ProxySet lbmethod=byrequests
  • lbmethod=byrequests:リクエスト数が均等になるように分散します。
  • 他のオプション
  • bytraffic:転送するデータ量に応じて分散します。
  • bybusyness:最も処理が少ないサーバーにリクエストを振り分けます。

フェイルオーバーの設定


サーバーの障害時に自動で他のサーバーにリクエストを振り分けるための設定を追加できます。

BalancerMember http://192.168.1.12:8080 loadfactor=1 status=+H
  • status=+H:サーバーが一時的に利用不可の状態(Hot Standby)になります。障害発生時にのみ有効化されます。

設定の反映


設定ファイルを保存後、Apacheを再起動して設定を適用します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL


これで複数のバックエンドサーバーを使用したロードバランサーが構築されます。次は、負荷分散アルゴリズムの詳細な設定方法について解説します。

負荷分散アルゴリズムの選択肢と設定方法

mod_proxy_balancerでは、複数の負荷分散アルゴリズム(lbmethod)を使用して、トラフィックを効率的にバックエンドサーバーに振り分けることができます。最適なアルゴリズムを選択することで、Webアプリケーションの応答速度や安定性が向上します。

主な負荷分散アルゴリズム

1. byrequests(リクエスト数ベース)

  • 概要:リクエストを順番に各サーバーへ均等に振り分けます。
  • 特長:最もシンプルで、サーバーごとの処理速度差が少ない場合に最適です。
  • 設定例
ProxySet lbmethod=byrequests

2. bytraffic(データ転送量ベース)

  • 概要:データの転送量を基準に、各サーバーにリクエストを振り分けます。
  • 特長:リクエストごとのデータサイズが大きく異なる場合に効果的です。
  • 設定例
ProxySet lbmethod=bytraffic

3. bybusyness(サーバー負荷ベース)

  • 概要:処理が少ないサーバーに優先してリクエストを振り分けます。
  • 特長:サーバーのリソース使用率が均等になるように調整されます。高負荷時に最適です。
  • 設定例
ProxySet lbmethod=bybusyness

4. heartbeat(ヘルスチェック連動)

  • 概要:Apacheのmod_heartbeatと連携し、サーバーの健康状態に応じてリクエストを分散します。
  • 特長:サーバーが正常でない場合は自動でリクエストを回避します。
  • 設定例
ProxySet lbmethod=heartbeat

設定ファイル例:アルゴリズムの変更


以下の例では、bybusynessを使用したロードバランサーを設定します。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080
    BalancerMember http://192.168.1.11:8080
    BalancerMember http://192.168.1.12:8080
    ProxySet lbmethod=bybusyness
</Proxy>

<VirtualHost *:80>
    ServerName example.com
    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"
</VirtualHost>

アルゴリズムの選び方

  • 大量の小さなリクエストがある場合byrequestsが適しています。
  • 大きなファイルのダウンロードやストリーミングが多い場合bytrafficが最適です。
  • サーバーの処理能力に差がある場合bybusynessが効果的です。
  • サーバーの健全性を重視する場合heartbeatを利用します。

設定の反映


設定ファイルを保存後、Apacheを再起動して変更を適用します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

次は、セッション維持(スティッキーセッション)を設定して、ユーザーセッションが途切れないようにする方法を解説します。

セッション維持(スティッキーセッション)の設定

スティッキーセッション(セッションアフィニティ)は、ユーザーが同じサーバーに継続的に接続されるようにする仕組みです。これにより、セッション情報が特定のサーバーに保持され、ユーザーが途中で異なるサーバーに切り替わることでセッションが失われるのを防ぎます。mod_proxy_balancerでは、JSESSIONIDやカスタムクッキーを使用してこの機能を実現します。

スティッキーセッションの仕組み

  • クッキー方式:ロードバランサーが特定のクッキーを付与し、リクエストごとに同じサーバーを選択します。
  • パラメータ方式:URLやクエリストリングのパラメータにセッション情報を含める方法です。
  • IPアドレス方式:クライアントのIPアドレスを基にサーバーを振り分けます。

設定例:JSESSIONIDを使用したスティッキーセッション


以下の設定例では、JSESSIONIDクッキーを使って同一ユーザーが同じサーバーに接続されるように設定します。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080 route=web1
    BalancerMember http://192.168.1.11:8080 route=web2
    BalancerMember http://192.168.1.12:8080 route=web3
    ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
    ServerName example.com

    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"
</VirtualHost>

設定内容の解説

1. routeの設定

BalancerMember http://192.168.1.10:8080 route=web1
  • route:サーバーごとに一意の識別子(web1, web2, web3)を割り当てます。
  • ユーザーが一度接続したサーバーに再度ルーティングされます。

2. stickysessionの設定

ProxySet stickysession=JSESSIONID|jsessionid
  • stickysessionJSESSIONIDクッキーまたはjsessionidパラメータを基にセッションを維持します。
  • Javaアプリケーションなどで一般的に使用されるセッション管理方式です。

3. 負荷分散アルゴリズムの設定

ProxySet lbmethod=byrequests
  • スティッキーセッションは負荷分散アルゴリズムと併用できます。

スティッキーセッションの確認方法

  1. ブラウザでhttp://example.comにアクセスし、セッションがサーバー間で切り替わらないことを確認します。
  2. Apacheのアクセスログを確認し、リクエストが同じサーバーに継続して送信されているかを確認します。
tail -f /var/log/apache2/balancer_access.log

セッション維持が必要なシーン

  • ECサイト:ショッピングカートのセッションが切れないようにする。
  • 認証システム:ログイン状態を維持する。
  • フォーム送信:途中でセッションが切れないようにする。

設定の反映


設定ファイルを保存後、Apacheを再起動して設定を適用します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

次は、障害発生時のフェイルオーバー設定について解説します。

障害発生時のフェイルオーバー設定

フェイルオーバーは、バックエンドサーバーの障害時に自動的に他のサーバーにリクエストを切り替える仕組みです。mod_proxy_balancerは、サーバーの状態を監視し、異常が検知された場合に正常なサーバーへトラフィックを振り分けます。これにより、高可用性のシステムを実現できます。

フェイルオーバーの仕組み

  • 正常サーバー優先:障害が発生したサーバーは自動的にロードバランサーの対象から外れます。
  • 自動復旧:サーバーが復旧すると、自動的に再度ロードバランサーの対象になります。
  • ホットスタンバイ(Hot Standby):予備のサーバーを待機状態にし、障害時のみ稼働させます。

設定例:フェイルオーバー構成


以下の例では、3台のサーバーをロードバランシングし、1台(192.168.1.12)をホットスタンバイとして設定します。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080 route=web1
    BalancerMember http://192.168.1.11:8080 route=web2
    BalancerMember http://192.168.1.12:8080 status=+H
    ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
    ServerName example.com

    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"

    ErrorLog ${APACHE_LOG_DIR}/balancer_error.log
    CustomLog ${APACHE_LOG_DIR}/balancer_access.log combined
</VirtualHost>

設定内容の解説

1. ホットスタンバイの設定

BalancerMember http://192.168.1.12:8080 status=+H
  • status=+H+Hはホットスタンバイを意味します。通常はリクエストを処理せず、障害発生時のみ稼働します。

2. 自動復旧の設定


Apacheはデフォルトでバックエンドサーバーを定期的に監視し、復旧後は自動的に再度負荷分散に参加させます。

ProxySet retry=60
  • retry=60:障害が検知されてから60秒後に再試行します。

3. サーバー障害の検知方法


mod_proxy_balancerは、HTTPレスポンスコード(503, 500など)を検知してサーバー障害を判断します。

BalancerMember http://192.168.1.11:8080 timeout=10
  • timeout=10:10秒間サーバーが応答しない場合、そのサーバーは障害とみなされます。

ログで障害の確認


障害が発生した場合、エラーログに記録されます。

tail -f /var/log/apache2/balancer_error.log


障害が検知されると、以下のようなログが記録されます。

[proxy:error] (111)Connection refused: AH01114: HTTP: failed to make connection to backend

フェイルオーバーが必要なシーン

  • 重要なWebアプリケーション:ECサイト、金融系システムなど、ダウンタイムが許容されないサービス。
  • APIサーバー:リアルタイムでのデータ処理を求められる環境。
  • ストリーミングサービス:接続が途切れるとユーザー体験に影響が出る場合。

設定の反映


設定ファイルを保存後、Apacheを再起動して設定を適用します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

次は、ロードバランサーのセキュリティ対策とアクセス制御について解説します。

セキュリティ対策とアクセス制御

ロードバランサーはWebアプリケーションの前面に配置されるため、不正アクセスや攻撃の対象になりやすいです。mod_proxy_balancerで構築したロードバランサーを安全に運用するには、適切なアクセス制御とセキュリティ設定が不可欠です。

主なセキュリティ対策

1. 管理インターフェースへのアクセス制限


mod_proxy_balancerには管理インターフェース(バランサーマネージャー)があり、リアルタイムでサーバーの状態を監視・制御できます。このインターフェースを保護し、特定のIPアドレスのみアクセス可能にします。

設定例:管理画面へのアクセス制限

<Location "/balancer-manager">
    SetHandler balancer-manager
    Require ip 192.168.1.0/24
    Require all denied
</Location>
  • SetHandler balancer-manager:バランサーマネージャーを有効化します。
  • Require ip 192.168.1.0/24:特定のIPレンジ(社内ネットワークなど)からのみアクセスを許可します。
  • Require all denied:その他のIPアドレスからのアクセスを拒否します。

2. HTTPSによる通信の暗号化


ロードバランサーとクライアント間の通信をHTTPSで暗号化し、データの盗聴や改ざんを防ぎます。

SSLの基本設定例

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.crt
    SSLCertificateKeyFile /etc/ssl/private/example.key

    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"
</VirtualHost>
  • SSLEngine on:SSLを有効化します。
  • SSLCertificateFile/KeyFile:SSL証明書を指定します。

3. IP制限によるアクセス制御


特定のバックエンドサーバーやロードバランサーに対して、外部からの直接アクセスを防ぐためにファイアウォールやApacheの設定でIP制限を行います。

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.10:8080
    BalancerMember http://192.168.1.11:8080
    Require ip 192.168.1.0/24
</Proxy>
  • Require ip:許可されたIPアドレスからのみアクセスを許可します。

4. DDoS対策とリクエスト制限


大量のリクエストによるDDoS攻撃を防ぐために、mod_evasiveを使用してリクエスト数を制限します。

mod_evasiveの設定例

<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 5
    DOSSiteCount 100
    DOSBlockingPeriod 10
</IfModule>
  • DOSPageCount 5:同じページに5回以上アクセスした場合、一時的にブロックします。
  • DOSBlockingPeriod 10:ブロック期間は10秒間です。

5. 不正リクエストのフィルタリング


不正なクエリストリングや脆弱性を狙ったリクエストを防ぐために、mod_rewriteを使って特定のリクエストをフィルタリングします。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} .*sql.*
    RewriteRule .* - [F]
</IfModule>
  • sqlが含まれるリクエストを拒否します。SQLインジェクション対策として有効です。

セキュリティ対策のポイント

  • 最小権限の原則:必要最小限のアクセスのみ許可し、管理者以外のアクセスを制限します。
  • ログの監視:エラーログやアクセスログを定期的に確認し、不審なアクセスを監視します。
  • 定期的なアップデート:Apacheやモジュールのアップデートを定期的に行い、既知の脆弱性を防ぎます。

設定の反映


設定ファイルを保存後、Apacheを再起動して変更を適用します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

次は、記事のまとめを行います。

まとめ

本記事では、Apacheのmod_proxy_balancerを活用したロードバランサーの構築方法について詳しく解説しました。mod_proxy_balancerは、Apacheに標準で搭載されている強力なツールであり、追加のソフトウェアを必要とせず、柔軟かつ効率的にトラフィックを分散できます。

ロードバランサーを構築することで、システムの可用性が向上し、障害時のフェイルオーバーやスティッキーセッションなどの高度な機能も容易に実装可能です。また、セキュリティ対策やアクセス制御を適切に設定することで、不正アクセスやDDoS攻撃からシステムを保護できます。

ポイントの振り返り

  • mod_proxy_balancerの基本的な役割と特徴
  • バックエンドサーバーの設定方法と負荷分散アルゴリズムの選択
  • スティッキーセッションとフェイルオーバーの実装方法
  • セキュリティ強化のためのアクセス制限やSSLの導入

これらの設定を活用することで、高性能で堅牢なWebアプリケーション環境を構築し、ユーザーに安定したサービスを提供できます。Apacheの持つ柔軟性と拡張性を最大限に活かし、自社の環境に最適なロードバランサーを構築してみてください。

コメント

コメントする

目次