Apacheでリクエストベースの負荷分散を導入することは、Webサービスのパフォーマンス向上と安定運用に不可欠です。大量のアクセスが集中する場合、1台のサーバーでは処理能力に限界があり、応答速度の低下や障害のリスクが高まります。
Apacheは「mod_proxy_balancer」などのモジュールを活用することで、複数のサーバーへリクエストを分散し、負荷を軽減することが可能です。特に、WebアプリケーションやAPIサーバーを運用する環境では、リクエストの均等分散がサーバーの健全な運用を支える重要な要素となります。
本記事では、Apacheを用いたリクエストベースの負荷分散の仕組みとその設定方法を、初心者にも分かりやすく解説します。さらに、実際の設定例や障害時のフェイルオーバー設定、SSL環境での注意点など、実践的な内容を網羅します。
負荷分散に関する知識を深め、効率的なWebサービス運用の第一歩を踏み出しましょう。
負荷分散の概要とApacheの役割
負荷分散とは、複数のサーバーにリクエストを振り分けることで、1台のサーバーに過度な負荷が集中するのを防ぐ技術です。Webサービスの利用者が増加するにつれ、単一のサーバーでは処理能力が限界を迎える可能性があります。このような状況を回避するために、複数のサーバーを用意し、リクエストを均等に分散させることで、全体の処理効率を向上させます。
Apacheは、世界中で広く使用されているWebサーバーソフトウェアであり、負荷分散の役割を担う「リバースプロキシ」としても機能します。リバースプロキシとしてのApacheは、ユーザーからのリクエストを受け取り、適切なサーバーへ振り分ける役割を果たします。これにより、サーバー間の負荷を均等にし、サービスの安定性を確保します。
Apacheによる負荷分散のメリット
Apacheで負荷分散を構成することには、以下のようなメリットがあります。
- コスト削減:既存のApache環境を利用して、追加のソフトウェア導入なしで負荷分散が可能です。
- 拡張性:サーバーの増減が柔軟に行えるため、サービス規模の拡大に対応しやすいです。
- 高可用性:障害が発生したサーバーを自動的に除外することで、サービス停止を防ぎます。
負荷分散が必要な場面
- アクセス数が急増するキャンペーンサイトの運用
- APIサーバーが多数のリクエストを処理する必要がある場面
- 動的なコンテンツ生成が多く、サーバーの負荷が高いサービス
Apacheを使った負荷分散は、これらの場面で大きな効果を発揮します。次章では、Apacheで実際に負荷分散を構成する際に必要なモジュールについて解説します。
Apacheで利用可能な負荷分散モジュール
Apacheには負荷分散を実現するための複数のモジュールが用意されており、用途に応じて使い分けることが可能です。これらのモジュールを適切に組み合わせることで、高度なリクエスト分散が実現できます。
主要な負荷分散モジュール
1. mod_proxy
mod_proxyはApacheをリバースプロキシとして動作させるための基本モジュールです。これにより、クライアントからのリクエストをバックエンドのサーバーに転送することが可能になります。単独でも利用できますが、負荷分散を行う場合はmod_proxy_balancerと組み合わせて使用します。
2. mod_proxy_balancer
mod_proxy_balancerは、Apacheに負荷分散機能を追加するモジュールです。複数のバックエンドサーバーをプールとして管理し、ラウンドロビンや加重分散方式でリクエストを振り分けます。サーバーの状態に応じた動的な分散が可能です。
特徴:
- 複数のサーバーへのリクエスト分散
- サーバーの稼働状況に応じた自動調整
- セッション維持(スティッキーセッション)も可能
3. mod_proxy_http
mod_proxy_httpは、HTTPリクエストのプロキシ処理を行うモジュールです。バックエンドサーバーがHTTPプロトコルを利用する場合に必要となります。
特徴:
- HTTP通信のプロキシ処理
- HTTPSにも対応可能(mod_sslと組み合わせ)
4. mod_ssl
SSL/TLS通信を可能にするモジュールです。セキュアな負荷分散を行う際にはmod_proxyとmod_sslを併用することで、暗号化された通信でも負荷分散が可能になります。
モジュールの連携
負荷分散環境を構築する際は、以下のようなモジュールの連携が基本となります。
- mod_proxy + mod_proxy_balancer:標準的なリクエスト分散構成
- mod_proxy_http + mod_ssl:SSL対応のバックエンドサーバーへのリクエスト分散
- mod_proxy_balancer + mod_status:サーバー状態のモニタリングを追加
次章では、これらのモジュールを用いた具体的なリクエスト分散の仕組みについて詳しく解説します。
リクエストベースの負荷分散の仕組み
Apacheにおけるリクエストベースの負荷分散は、ユーザーからのリクエストを複数のバックエンドサーバーに振り分けることで、システム全体の処理効率を向上させる仕組みです。特定のサーバーに負荷が集中することを防ぎ、均等にリソースを使用することで応答速度や耐障害性を高めます。
リクエスト分散の基本フロー
- クライアントのリクエストがApacheに到達
ユーザーからのリクエストはまずApacheサーバーが受け取ります。 - Apacheが適切なバックエンドサーバーを選択
mod_proxy_balancerがラウンドロビンや加重分散方式でリクエストを割り振ります。 - リクエストが選ばれたサーバーへ転送される
選択されたバックエンドサーバーがリクエストを処理し、レスポンスをApacheに返します。 - Apacheがクライアントにレスポンスを返却
Apacheは受け取ったレスポンスをクライアントに返し、一連の処理が完了します。
主な負荷分散方式
1. ラウンドロビン方式
各サーバーに順番にリクエストを振り分ける方法です。シンプルで均等に分散できるのが特徴です。
例:
BalancerMember http://192.168.1.101
BalancerMember http://192.168.1.102
BalancerMember http://192.168.1.103
ProxyPass / balancer://mycluster/
2. 加重ラウンドロビン方式
サーバーごとに負荷の重み(weight)を設定し、スペックの高いサーバーに多くのリクエストを割り振る方式です。
例:
BalancerMember http://192.168.1.101 loadfactor=2
BalancerMember http://192.168.1.102 loadfactor=1
この例では、192.168.1.101に倍のリクエストが送られます。
3. スティッキーセッション
同じユーザーのリクエストを常に同じサーバーに送る方法です。セッション情報が一貫して保持されます。
例:
BalancerMember http://192.168.1.101 route=server1
BalancerMember http://192.168.1.102 route=server2
ProxySet stickysession=JSESSIONID
仕組みのメリット
- 負荷の均等化:リクエストが均等に分散されるため、サーバーのオーバーロードを防ぎます。
- 耐障害性の向上:サーバー障害時は他のサーバーが代替処理を行うため、ダウンタイムが最小限に抑えられます。
- スケーラビリティ:サーバーを追加することで簡単に処理能力を向上させられます。
次章では、Apacheのインストールから基本設定まで、実際のセットアップ手順について詳しく解説します。
Apacheのインストールと基本設定
Apacheを利用して負荷分散を行うには、まずApacheのインストールと基本的な設定を行う必要があります。本章では、Apacheのインストール方法と、リバースプロキシとして動作させるための初期設定を解説します。
Apacheのインストール
以下は、主要なLinuxディストリビューションにおけるApacheのインストール手順です。
1. Ubuntu / Debianの場合
sudo apt update
sudo apt install apache2
インストール後、Apacheを起動します。
sudo systemctl start apache2
sudo systemctl enable apache2
2. CentOS / RHELの場合
sudo yum install httpd
インストールが完了したら、Apacheを起動して自動起動を有効にします。
sudo systemctl start httpd
sudo systemctl enable httpd
基本的なApache設定
Apacheの設定ファイルは通常、以下の場所にあります。
- Ubuntu/Debian:
/etc/apache2/apache2.conf
- CentOS/RHEL:
/etc/httpd/conf/httpd.conf
リバースプロキシモジュールの有効化
負荷分散を行うには、リバースプロキシ関連のモジュールを有効にします。
Ubuntu/Debianの場合:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
CentOS/RHELの場合:
httpd.confを編集し、以下の行のコメントを外します。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
基本的なリバースプロキシ設定
Apacheをリバースプロキシとして動作させるための基本設定を行います。
設定例(/etc/apache2/sites-available/000-default.conf または httpd.conf):
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ProxyRequests Off
ProxyPass / http://backend-server1/
ProxyPassReverse / http://backend-server1/
</VirtualHost>
この例では、リクエストがすべてbackend-server1
に転送されます。
設定の反映と確認
設定を反映するため、Apacheを再起動します。
sudo systemctl restart apache2 (Ubuntu/Debian)
sudo systemctl restart httpd (CentOS/RHEL)
以下のコマンドでApacheの状態を確認します。
sudo systemctl status apache2 (Ubuntu/Debian)
sudo systemctl status httpd (CentOS/RHEL)
これでApacheがリバースプロキシとして動作する基本的な準備が整いました。次章では、mod_proxy_balancerを使った具体的な負荷分散の設定手順について解説します。
mod_proxy_balancerの設定手順
mod_proxy_balancerを使ってApacheでリクエストベースの負荷分散を構成する方法を解説します。複数のバックエンドサーバーにリクエストを振り分けることで、サーバーの負荷を均等化し、効率的な運用が可能になります。
mod_proxy_balancerの基本構成
Apacheでmod_proxy_balancerを使用する際は、以下の3つの設定が必要です。
- BalancerMember でバックエンドサーバーを指定する
- ProxyPass でリクエストを負荷分散プールに転送する
- ProxySet で負荷分散方法やパラメータを設定する
設定例:シンプルなラウンドロビン方式
以下の設定は、3台のバックエンドサーバーに対してラウンドロビン方式でリクエストを分散する例です。
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101
BalancerMember http://192.168.1.102
BalancerMember http://192.168.1.103
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerAdmin admin@example.com
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
設定のポイント
- BalancerMember:負荷分散の対象となるサーバーを指定します。
- lbmethod=byrequests:リクエスト数に基づいて分散する方式です(デフォルトはラウンドロビン)。
- ProxyPass:クライアントからのリクエストをBalancerプールに転送します。
加重ラウンドロビン方式の設定
バックエンドサーバーごとに処理能力が異なる場合は、加重(loadfactor)を設定してリクエストの割り振りを調整できます。
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101 loadfactor=2
BalancerMember http://192.168.1.102 loadfactor=1
</Proxy>
この例では、192.168.1.101が192.168.1.102の2倍のリクエストを処理します。
スティッキーセッションの設定
セッション情報が必要なアプリケーションでは、スティッキーセッションを有効にして同じユーザーのリクエストを常に同じサーバーに送ります。
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101 route=server1
BalancerMember http://192.168.1.102 route=server2
ProxySet stickysession=JSESSIONID
</Proxy>
ポイント
- クライアントのクッキー情報(JSESSIONIDなど)に基づいてサーバーが固定されます。
- アプリケーションのセッションデータが一貫して処理されます。
設定の反映と確認
設定を完了したら、Apacheを再起動して反映します。
sudo systemctl restart apache2 (Ubuntu/Debian)
sudo systemctl restart httpd (CentOS/RHEL)
設定が正しく動作しているかを確認するには、ブラウザでApacheにアクセスし、ログでリクエストが複数のサーバーに振り分けられていることを確認します。
次章では、障害発生時に自動でサーバーを切り離すヘルスチェックや障害対応設定について解説します。
ヘルスチェックと障害対応設定
Apacheで負荷分散を構成する際、バックエンドサーバーが正常に稼働しているかを確認し、障害が発生したサーバーを自動的に切り離す「ヘルスチェック」機能が重要です。これにより、障害時でもサービスの継続性が確保され、ユーザーへの影響を最小限に抑えることができます。
ヘルスチェックの基本構成
Apacheでは、mod_proxy_hcheckモジュールを使ってバックエンドサーバーのヘルスチェックを行います。このモジュールはmod_proxy_balancerと連携し、障害が検出されたサーバーを自動でBalancerから除外します。
mod_proxy_hcheckの有効化
Ubuntu/Debianの場合:
sudo a2enmod proxy_hcheck
sudo systemctl restart apache2
CentOS/RHELの場合:
httpd.confに以下を追加してモジュールを有効にします。
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
ヘルスチェックの設定例
以下の設定例では、3台のバックエンドサーバーに対してヘルスチェックを行い、サーバーが応答しない場合に自動で切り離します。
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101 loadfactor=1
BalancerMember http://192.168.1.102 loadfactor=1
BalancerMember http://192.168.1.103 loadfactor=1
ProxySet lbmethod=byrequests
ProxyHCExpr ok200 {%{REQUEST_STATUS} =~ /^[23]/}
BalancerMember http://192.168.1.101 hcmethod=GET hcexpr=ok200
BalancerMember http://192.168.1.102 hcmethod=GET hcexpr=ok200
BalancerMember http://192.168.1.103 hcmethod=GET hcexpr=ok200
</Proxy>
<VirtualHost *:80>
ServerAdmin admin@example.com
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
設定のポイント
- ProxyHCExpr ok200:HTTPステータスコードが200番台や300番台であれば「正常」と判定します。
- hcmethod=GET:GETリクエストでヘルスチェックを行います。
- hcexpr=ok200:レスポンスが200または300番台の場合にサーバーを「正常」と判断します。
障害発生時の自動フェイルオーバー設定
障害が発生したサーバーが復旧した際に自動で再参加させる設定も可能です。以下のオプションを追加します。
ProxySet failontimeout=on
ProxySet retry=5
- failontimeout=on:サーバーが応答しなかった場合に自動でフェイルオーバーします。
- retry=5:障害サーバーを5秒ごとに再試行します。
障害状況の確認
障害時のサーバーステータスは、Apacheの専用ステータスモジュールmod_statusで確認できます。mod_statusを有効にし、管理者がアクセスできるように設定します。
<Location /server-status>
SetHandler server-status
Require ip 192.168.1.0/24
</Location>
ブラウザでhttp://your-server-ip/server-status
にアクセスし、Balancerのステータスを確認します。
テストと検証
- 一部のバックエンドサーバーを意図的に停止して、リクエストが自動的に他のサーバーに振り分けられることを確認します。
- 障害復旧後、自動的にサーバーがBalancerに復帰することをテストします。
次章では、SSL環境下での負荷分散設定について解説します。
SSL対応の負荷分散設定
SSL/TLSを導入することで、通信のセキュリティを強化し、安全なデータのやり取りが可能になります。Apacheで負荷分散を行う場合でも、SSL通信に対応することでエンドユーザーとのセキュアな接続を維持しながら、バックエンドサーバーへのリクエストを安全に分散できます。
本章では、ApacheでSSL対応のリクエスト分散を構成する方法を解説します。
必要なモジュールの有効化
SSL対応の負荷分散を行うためには、以下のモジュールが必要です。
- mod_ssl:SSL/TLS通信を処理
- mod_proxy:リバースプロキシ機能
- mod_proxy_http:HTTPリクエストの転送
- mod_proxy_balancer:負荷分散の設定
Ubuntu/Debianの場合:
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2
CentOS/RHELの場合:
httpd.confに以下を追加します。
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
SSL証明書のインストール
Let’s Encryptを利用した無料SSL証明書の取得例を紹介します。
sudo apt install certbot python3-certbot-apache
sudo certbot --apache
手順に従い、ドメインを選択して証明書をインストールします。
CentOS/RHELでは以下のようにインストールします。
sudo yum install certbot python3-certbot-apache
sudo certbot --apache
SSL対応のVirtualHost設定
以下は、SSLを有効にした状態で負荷分散を構成するVirtualHostの例です。
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin admin@example.com
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101
BalancerMember http://192.168.1.102
BalancerMember http://192.168.1.103
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
</IfModule>
設定のポイント
- SSLEngine on:SSL通信を有効にします。
- SSLCertificateFile/SSLCertificateKeyFile:証明書と秘密鍵のパスを指定します。
- ProxyPass:リクエストをBalancerへ転送し、SSL通信をバックエンドに引き継ぎます。
バックエンドサーバーへのSSL通信設定
バックエンドサーバーでもSSL通信を行う場合は、BalancerMemberのURLをhttps://
に変更します。
<Proxy balancer://mycluster>
BalancerMember https://192.168.1.101
BalancerMember https://192.168.1.102
BalancerMember https://192.168.1.103
ProxySet lbmethod=byrequests
</Proxy>
SSLリダイレクトの設定
HTTPからHTTPSへのリダイレクトを設定することで、すべての通信をSSL/TLS経由に強制できます。
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>
設定の反映と確認
設定後、Apacheを再起動して変更を反映します。
sudo systemctl restart apache2 (Ubuntu/Debian)
sudo systemctl restart httpd (CentOS/RHEL)
ブラウザでhttps://www.example.com
にアクセスし、証明書が適切に適用されていることを確認します。
次章では、複数のアプリケーションサーバーへの分散構成の応用例について解説します。
応用例:複数のアプリケーションサーバーへの分散構成
Apacheの負荷分散は、複数のアプリケーションサーバーを効果的に活用することで、サービスの安定性と拡張性を向上させます。本章では、異なるアプリケーションサーバーへリクエストを分散し、リソースを最適に利用する構成例を紹介します。
構成の概要
複数のアプリケーションサーバー(Tomcat、Node.js、Nginxなど)をApacheのリバースプロキシとして組み合わせることで、特定のURLパスやサブドメインごとにリクエストを振り分けることが可能です。
構成例
- Tomcat:
/app1
へのリクエストを処理 - Node.js:
/app2
へのリクエストを処理 - 静的ファイル:Apacheが直接提供
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName www.example.com
ProxyRequests Off
# Tomcatへの転送
<Location /app1>
ProxyPass http://192.168.1.101:8080/app1
ProxyPassReverse http://192.168.1.101:8080/app1
</Location>
# Node.jsへの転送
<Location /app2>
ProxyPass http://192.168.1.102:3000/
ProxyPassReverse http://192.168.1.102:3000/
</Location>
# 静的ファイルの提供
DocumentRoot /var/www/html/
<Directory /var/www/html/>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
設定の解説
- /app1へのリクエストはTomcatサーバーが処理します。
- /app2はNode.jsサーバーに転送されます。
- 静的ファイルはApacheが直接提供し、負荷の分散が可能です。
動作確認とテスト
http://www.example.com/app1
にアクセスしてTomcatのアプリケーションが表示されるか確認します。http://www.example.com/app2
でNode.jsのアプリケーションが動作するかテストします。- Apacheのエラーログとアクセスログを確認し、リクエストが適切にルーティングされているかを検証します。
メリットと活用シーン
- 多様なアプリケーション環境を同時に運用可能
- 柔軟なスケーリング:特定のサーバーだけ増強し、ボトルネックを解消
- シンプルなメンテナンス:1つのApacheがフロントエンドとして機能し、バックエンドの管理が容易
この構成は、マイクロサービス環境や異なるフレームワークで構築されたアプリケーションを統合する際に効果を発揮します。次章では、記事のまとめと負荷分散を最適化するためのポイントを解説します。
まとめ
本記事では、Apacheを利用したリクエストベースの負荷分散の構成方法について解説しました。
負荷分散の概要から始まり、Apacheで利用可能な主要モジュール(mod_proxy、mod_proxy_balancer、mod_ssl)を活用した構成例を示しました。SSL対応やヘルスチェックの設定、さらに複数のアプリケーションサーバーへのリクエスト分散など、実践的な内容を網羅しています。
ポイントのおさらい:
- mod_proxy_balancerを使用して簡単に複数のサーバーへリクエストを分散可能
- SSL/TLS通信でセキュアな負荷分散を実現
- ヘルスチェックで障害サーバーを自動的に切り離し、高可用性を維持
- 異なるアプリケーションサーバーへの柔軟なリクエスト振り分けが可能
Apacheを活用した負荷分散の構成は、サービスの安定性を高め、システム全体のパフォーマンス向上に大きく寄与します。適切な設定を行い、安全で効率的なWebサービス運用を目指しましょう。
コメント