Apacheで実現する負荷分散とリバースプロキシ設定完全ガイド

Apacheは、Webサーバーとして広く利用されているソフトウェアですが、単なる静的コンテンツの配信だけでなく、負荷分散リバースプロキシの役割も果たすことができます。これにより、大規模なアクセスにも対応でき、システム全体のパフォーマンスと安定性を向上させることが可能です。

特に、高トラフィックのサイトでは、一台のサーバーに負荷が集中することでレスポンスの遅延やダウンタイムが発生することがあります。Apacheのリバースプロキシ機能を利用して複数のサーバーにリクエストを振り分けることで、これらの問題を回避できます。さらに、SSL/TLSによるセキュアな通信や、セッション維持のためのスティッキーセッションの設定なども可能です。

本記事では、Apacheを用いた負荷分散とリバースプロキシの基本から応用までを詳しく解説し、具体的な設定例やトラブルシューティング方法を紹介します。これにより、Webサーバーの運用において必要不可欠なスキルを身につけることができるでしょう。

目次

負荷分散とリバースプロキシの概要


Webシステムにおいて、負荷分散リバースプロキシは、パフォーマンスと安定性を維持するために重要な役割を果たします。それぞれの役割や仕組みを理解することで、より効率的なシステム構築が可能になります。

負荷分散とは


負荷分散は、複数のサーバーにリクエストを分散させることで、一台のサーバーに集中する負荷を軽減する仕組みです。これにより、以下のような利点が得られます。

  • 高可用性の実現:サーバー障害時でも他のサーバーが処理を継続します。
  • パフォーマンス向上:複数のサーバーでリクエストを処理するため、応答速度が向上します。
  • 拡張性:アクセス増加に伴いサーバーを追加することで、システムのスケールアウトが可能になります。

リバースプロキシとは


リバースプロキシは、クライアントからのリクエストを受け取り、内部の複数のWebサーバーに振り分ける役割を担います。クライアントは直接バックエンドサーバーにアクセスすることなく、リバースプロキシを経由することで、安全性やパフォーマンスが向上します。

  • セキュリティ向上:バックエンドサーバーが直接インターネットに公開されないため、セキュリティリスクが低減します。
  • キャッシュ機能:リバースプロキシがコンテンツをキャッシュし、クライアントに迅速に応答します。
  • SSLオフロード:SSL/TLS処理をリバースプロキシが担うことで、バックエンドサーバーの負荷が軽減されます。

負荷分散とリバースプロキシの違い

項目負荷分散リバースプロキシ
主な目的負荷の分散と冗長性セキュリティ強化とバックエンド保護
処理対象複数のバックエンドサーバークライアントリクエスト
代表的な技術ラウンドロビン、IPハッシュなどSSLオフロード、キャッシュ

Apacheを使うことで、この負荷分散とリバースプロキシの機能を一元的に実装することができ、シンプルかつ強力なWebインフラを構築することが可能です。

Apacheを使う理由とメリット


Apacheは世界中で広く使われているWebサーバーソフトウェアであり、負荷分散リバースプロキシの機能も標準で提供されています。シンプルな設定で導入可能な点が魅力で、多くのWebサービスで採用されています。ここでは、Apacheを使用する理由とそのメリットについて解説します。

Apacheを選ぶ理由

  1. 高い信頼性と実績
    Apacheは長年にわたり安定して運用されており、豊富な導入事例があります。頻繁にアップデートが行われ、セキュリティホールへの対応も迅速です。
  2. 豊富なモジュールと拡張性
    Apacheはmod_proxymod_proxy_balancerといったモジュールを利用することで、負荷分散やリバースプロキシの機能を簡単に追加できます。必要な機能だけを選択して使える柔軟性が特徴です。
  3. 設定の容易さ
    Apacheの設定ファイル(httpd.confvhost.conf)を編集するだけで、負荷分散やリバースプロキシの機能を導入できます。設定がシンプルで、初心者にも扱いやすい点が魅力です。
  4. オープンソースでコスト削減
    Apacheはオープンソースであり、ライセンス費用が発生しません。そのため、低コストでシステムを構築でき、商用製品と同等の機能を得られます。

Apacheを使用するメリット

  1. 統合されたシステム管理
    Apacheを使用することで、Webサーバー、リバースプロキシ、負荷分散機能を一元管理できます。これにより、複雑なインフラを簡単に運用可能です。
  2. スケールアウトが容易
    アクセスが増加した際に、新しいバックエンドサーバーを追加して簡単にスケールアウトできます。Apacheの負荷分散機能を利用すれば、ラウンドロビンや最小接続方式で効率的にリクエストを分散可能です。
  3. SSLオフロードの実現
    Apacheはリバースプロキシとして動作しながら、SSL/TLSの処理を担当することでバックエンドサーバーの負荷を軽減します。これにより、パフォーマンスの向上が期待できます。
  4. アクセス制御とセキュリティ
    Apacheは、IP制限やBasic認証、ファイアウォール連携など多様なセキュリティ機能を備えており、外部からの不正アクセスを防止できます。

Apacheは、Webサーバー機能に加え、負荷分散やリバースプロキシの機能をシンプルに導入できるツールとして、信頼性が高くコストパフォーマンスに優れた選択肢です。

必要なモジュールと事前準備


Apacheで負荷分散とリバースプロキシを実装するには、適切なモジュールのインストールと設定が必要です。本項では、必要なモジュールと事前準備について詳しく説明します。

必要なモジュール一覧


Apacheをリバースプロキシや負荷分散に対応させるためには、以下のモジュールが必要になります。

  1. mod_proxy
    リバースプロキシの基本モジュールで、Apacheがクライアントからのリクエストを他のサーバーへ転送する役割を果たします。
  2. mod_proxy_http
    HTTP通信を処理するためのモジュールです。HTTPベースのプロキシリクエストを処理します。
  3. mod_proxy_balancer
    負荷分散機能を提供するモジュールで、複数のバックエンドサーバーにリクエストを分散します。
  4. mod_lbmethod_byrequests
    リクエスト数に基づいて負荷を分散するモジュールです。一般的なラウンドロビン方式を実装します。
  5. mod_ssl(オプション)
    SSL/TLS通信を可能にするモジュールで、セキュアな通信を確保します。

モジュールのインストール方法


多くのLinuxディストリビューションでは、Apacheのモジュールはパッケージとして提供されています。以下は、主要な環境でのモジュールインストール例です。

CentOS/RHEL

sudo yum install httpd mod_ssl
sudo yum install mod_proxy mod_proxy_http mod_proxy_balancer

Ubuntu/Debian

sudo apt update
sudo apt install apache2 libapache2-mod-proxy-html
sudo a2enmod proxy proxy_http proxy_balancer ssl
sudo systemctl restart apache2

事前準備

  1. Apacheのインストールと起動
    Apacheがインストールされていない場合は、以下のコマンドでインストールします。
sudo apt install apache2  # Ubuntu/Debian
sudo yum install httpd    # CentOS/RHEL


インストール後、Apacheを起動し自動起動を有効にします。

sudo systemctl start apache2  # Ubuntu/Debian
sudo systemctl start httpd    # CentOS/RHEL
sudo systemctl enable apache2
  1. ファイアウォールの設定
    必要なポート(80/443)を開放して、外部からのリクエストを受け付けます。
sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload
  1. バックエンドサーバーの準備
    リバースプロキシや負荷分散のターゲットとなるバックエンドサーバーが稼働している必要があります。事前にアプリケーションサーバーを用意し、動作確認を行ってください。

これで、Apacheを用いた負荷分散とリバースプロキシの設定に向けた準備が整います。次に、具体的な設定方法について説明します。

基本的なリバースプロキシ設定方法


Apacheでリバースプロキシを設定することで、クライアントのリクエストを複数のバックエンドサーバーに転送できます。これにより、バックエンドのサーバー構成を隠蔽しつつ、柔軟な負荷分散が可能になります。

以下では、リバースプロキシの基本的な設定方法について具体的な手順を示します。

1. Apacheのモジュール有効化


リバースプロキシ機能を使うには、必要なモジュールを有効にします。

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2


これにより、リバースプロキシ関連のモジュールが有効化されます。

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


次に、Apacheのバーチャルホスト設定ファイルを作成・編集します。以下は、/etc/apache2/sites-available/reverseproxy.confの例です。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com

    ProxyRequests Off
    ProxyPass / http://192.168.1.10/
    ProxyPassReverse / http://192.168.1.10/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

設定の解説

  • ProxyRequests Off: フォワードプロキシとして機能しないようにします(リバースプロキシ専用)。
  • ProxyPass: クライアントのリクエストを192.168.1.10のサーバーに転送します。
  • ProxyPassReverse: リバースプロキシがレスポンスを受け取った際に、ヘッダー内のLocation情報を修正し、クライアントが正しいURLを取得できるようにします。

3. 設定の有効化と反映


作成した設定ファイルを有効化し、Apacheを再起動します。

sudo a2ensite reverseproxy.conf
sudo systemctl reload apache2

4. 動作確認


ブラウザでhttp://www.example.comにアクセスし、バックエンドサーバーからのレスポンスが表示されれば設定完了です。

curl -I http://www.example.com


ステータスコード200 OKが返ってくることを確認します。

5. トラブルシューティング

  • 503 Service Unavailable: バックエンドサーバーが停止しているか、Apacheがバックエンドサーバーに接続できていません。バックエンドサーバーの状態とApacheのログを確認してください。
  • 403 Forbidden: SELinuxやファイアウォールの設定が影響している可能性があります。setenforce 0でSELinuxを一時的に無効化して確認します。
  • 404 Not Found: ProxyPassのパス設定が誤っている可能性があります。URLと設定を再度確認してください。

これで基本的なリバースプロキシの設定が完了です。次は、負荷分散の設定方法について説明します。

負荷分散の設定例(ラウンドロビン方式)


Apacheを使用した負荷分散では、複数のバックエンドサーバーにリクエストを均等に分配する方法として、ラウンドロビン方式が最も一般的です。この方法では、各リクエストが順番に異なるサーバーへ送信され、シンプルかつ効果的に負荷を分散できます。

以下では、Apacheでラウンドロビン方式の負荷分散を設定する具体的な方法を説明します。

1. モジュールの有効化


負荷分散に必要なモジュールを有効化します。

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

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


/etc/apache2/sites-available/loadbalancer.confに以下の内容で設定を記述します。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com

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

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

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

設定の解説

  • BalancerMember: 負荷分散するバックエンドサーバーを指定します。loadfactorで各サーバーへのリクエスト比率を調整できます。
  • ProxySet lbmethod=byrequests: リクエスト数に基づいてリクエストを均等に分配します(ラウンドロビン方式)。
  • ProxyPass/ProxyPassReverse: クライアントからのリクエストをバックエンドサーバー群に転送します。

3. 設定の有効化と反映


作成した設定ファイルを有効化し、Apacheを再起動します。

sudo a2ensite loadbalancer.conf
sudo systemctl reload apache2

4. 動作確認


ブラウザでhttp://www.example.comにアクセスし、リクエストが順番に異なるサーバーへ振り分けられていることを確認します。以下のコマンドでバックエンドサーバーのアクセスログを監視し、リクエストの分散状況を確認できます。

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

5. トラブルシューティング

  • 503 Service Unavailable: バックエンドサーバーのいずれかが停止している可能性があります。すべてのサーバーが稼働していることを確認してください。
  • BalancerMemberに偏りがある: loadfactorの値を調整して各サーバーへのリクエスト比率を変更します。例えば、特定のサーバーのloadfactorを2に設定すると、そのサーバーへのリクエスト数が他の2倍になります。

これで、Apacheを使用したラウンドロビン方式の負荷分散設定が完了です。次は、セッション維持を目的としたスティッキーセッションの設定方法について解説します。

スティッキーセッションの設定方法


負荷分散環境では、ユーザーのリクエストが毎回異なるサーバーに振り分けられるため、セッションが保持されない問題が発生することがあります。これを防ぐために、スティッキーセッション(セッションの固定化)を設定し、特定のユーザーが常に同じサーバーに接続されるようにします。

Apacheでは、mod_proxy_balancermod_headersを使用してスティッキーセッションを実装できます。以下では、具体的な設定手順を説明します。

1. モジュールの有効化


スティッキーセッションに必要なモジュールを有効化します。

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

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


/etc/apache2/sites-available/sticky-session.confに以下の設定を記述します。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com

    <Proxy "balancer://mycluster">
        BalancerMember http://192.168.1.10 route=app1
        BalancerMember http://192.168.1.11 route=app2
        BalancerMember http://192.168.1.12 route=app3
        ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
    </Proxy>

    ProxyPass / balancer://mycluster/ nocanon
    ProxyPassReverse / balancer://mycluster/

    <Location "/balancer-manager">
        SetHandler balancer-manager
        Require ip 192.168.1.0/24
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

設定の解説

  • route=app1/app2/app3: 各バックエンドサーバーに異なるルートを割り当てます。これにより、リクエストが特定のサーバーに固定されます。
  • stickysession=JSESSIONID|jsessionid: セッションID(JSESSIONID)に基づき、同一のユーザーが同じサーバーに接続されます。Tomcatなどのアプリケーションサーバーで使用されるセッションIDを指定します。
  • nocanon: クエリパラメータの変更を防ぎます。

3. 設定の有効化と反映


作成した設定ファイルを有効化し、Apacheを再起動します。

sudo a2ensite sticky-session.conf
sudo systemctl reload apache2

4. 動作確認


ブラウザでhttp://www.example.comにアクセスし、セッションが維持されているかを確認します。
以下のコマンドでログを監視し、特定のサーバーにリクエストが固定されていることを確認できます。

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

5. トラブルシューティング

  • セッションが維持されない場合: アプリケーションサーバーがセッションIDを正しく発行しているか確認してください。TomcatではJSESSIONIDがデフォルトです。
  • 特定のサーバーに偏る場合: routeの設定が重複していないか確認します。また、負荷分散の方式をbyrequests以外に切り替えてみてください。
  • 管理画面にアクセスできない場合: balancer-managerのLocation設定を見直し、アクセス許可IPが正しいか確認します。

これでスティッキーセッションの設定が完了です。次は、SSL対応のリバースプロキシ設定について解説します。

SSL対応リバースプロキシの設定


Apacheでリバースプロキシを構築する際に、SSL/TLSを導入することでセキュアな通信を実現できます。これにより、クライアントとApache間の通信を暗号化し、セキュリティを強化できます。さらに、ApacheがSSL処理を行うことで、バックエンドサーバーの負荷を軽減するSSLオフロードも可能になります。

以下では、ApacheでSSL対応のリバースプロキシを設定する方法について解説します。

1. SSLモジュールの有効化


SSL/TLS通信を行うには、mod_sslモジュールを有効化する必要があります。

sudo a2enmod ssl
sudo systemctl restart apache2

2. SSL証明書の取得と設置

自己署名証明書の作成(テスト環境向け)

以下のコマンドで自己署名証明書を作成します。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/apache-selfsigned.key \
-out /etc/ssl/certs/apache-selfsigned.crt

証明書の作成時に必要な情報を求められますが、重要なのはCommon Name (CN)で、ここにはサイトのドメイン名を入力してください(例: www.example.com)。

Let’s Encryptを使う場合(本番環境向け)

Let’s Encryptを使うと、無料で正式なSSL証明書を取得できます。

sudo apt install certbot python3-certbot-apache
sudo certbot --apache

証明書の自動更新も設定されるため、手間がかかりません。

3. SSLリバースプロキシの設定


/etc/apache2/sites-available/ssl-reverseproxy.confに以下の設定を追加します。

<VirtualHost *:443>
    ServerAdmin admin@example.com
    ServerName www.example.com

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

    <Proxy "balancer://mycluster">
        BalancerMember http://192.168.1.10 route=app1
        BalancerMember http://192.168.1.11 route=app2
        ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
    </Proxy>

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

    ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
</VirtualHost>

設定の解説

  • SSLEngine on: SSL/TLS通信を有効化します。
  • SSLCertificateFile / SSLCertificateKeyFile: SSL証明書と秘密鍵のパスを指定します。
  • BalancerMember: 負荷分散の設定は、非SSLの場合と同様です。
  • ProxyPass / ProxyPassReverse: クライアントからのリクエストをバックエンドサーバーに転送します。

4. 設定の有効化と反映


作成した設定を有効化し、Apacheを再起動します。

sudo a2ensite ssl-reverseproxy.conf
sudo systemctl reload apache2

5. HTTPからHTTPSへのリダイレクト


すべてのHTTPリクエストをHTTPSにリダイレクトするには、/etc/apache2/sites-available/000-default.confに以下を追加します。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>


この設定を反映させるためにApacheを再起動します。

sudo systemctl reload apache2

6. 動作確認


ブラウザでhttps://www.example.comにアクセスし、SSL証明書が正しく適用されていることを確認します。

curl -I https://www.example.com


200 OKが返ってくれば成功です。

7. トラブルシューティング

  • 証明書エラー: 自己署名証明書を使用している場合、ブラウザが警告を表示します。本番環境では必ずLet’s Encryptなどの正式な証明書を使用してください。
  • ポートが開いていない: SSLの通信はポート443を使用します。ファイアウォールがポート443を許可していることを確認してください。
sudo ufw allow 443
sudo ufw reload
  • 証明書の期限切れ: Let’s Encryptの証明書は90日ごとに更新が必要です。自動更新が設定されていない場合は以下のコマンドで手動更新できます。
sudo certbot renew

これでSSL対応リバースプロキシの設定が完了です。次は、トラブルシューティングとよくあるエラーについて解説します。

トラブルシューティングとよくあるエラー


Apacheでリバースプロキシと負荷分散を設定する際、予期しないエラーが発生することがあります。本項では、よくある問題とその解決方法について解説します。これにより、迅速に問題を特定し、稼働中のシステムを安定化できます。

1. 503 Service Unavailable


原因: バックエンドサーバーが応答していない、またはApacheがバックエンドに接続できない場合に発生します。
解決方法:

  • バックエンドサーバーが稼働しているか確認します。
systemctl status apache2
systemctl status tomcat
  • Apacheがバックエンドサーバーに接続可能か確認します。
curl http://192.168.1.10
  • ProxyPassBalancerMemberのアドレスに誤りがないか確認します。
  • ファイアウォールが通信を遮断していないかを確認します。
sudo ufw allow from 192.168.1.0/24

2. 502 Bad Gateway


原因: バックエンドサーバーがリクエストを処理中にエラーを返す場合に発生します。
解決方法:

  • バックエンドサーバーのログを確認し、アプリケーション側でエラーが発生していないか確認します。
tail -f /var/log/apache2/error.log
  • Apacheの設定でProxyTimeoutの値を調整し、応答待機時間を延ばします。
ProxyTimeout 300

3. 403 Forbidden


原因: アクセス制限が設定されている場合に発生します。
解決方法:

  • SELinuxが影響している可能性があります。以下でSELinuxの状態を確認し、一時的に無効化します。
getenforce
sudo setenforce 0
  • アクセス許可の設定を見直します。
<Proxy *>
    Require all granted
</Proxy>

4. 404 Not Found


原因: ProxyPassで指定したURLが存在しない場合に発生します。
解決方法:

  • バックエンドサーバーでアプリケーションが正しく稼働しているか確認します。
  • Apacheの設定ファイルで、正しいURIが設定されているか確認します。
ProxyPass /app http://192.168.1.10:8080/app
ProxyPassReverse /app http://192.168.1.10:8080/app

5. SSL証明書エラー


原因: SSL証明書が存在しない、または期限切れの場合に発生します。
解決方法:

  • 証明書が適切に設置されているか確認します。
ls /etc/ssl/certs/
  • Let’s Encryptの証明書を手動で更新します。
sudo certbot renew

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


原因: スティッキーセッションが正しく設定されていない可能性があります。
解決方法:

  • stickysessionの設定が正しいか確認します。
ProxySet stickysession=JSESSIONID|jsessionid
  • アプリケーションサーバーが正しくセッションIDを発行しているか確認します。

7. ログの活用


エラーの詳細を確認するには、Apacheのエラーログとアクセスログが役立ちます。

tail -f /var/log/apache2/error.log
tail -f /var/log/apache2/access.log


問題が発生した際には、ログを参照して原因を特定し、適切に対処します。

これでApacheのリバースプロキシおよび負荷分散に関するトラブルシューティングが完了です。次は、設定内容の総括としてまとめを解説します。

まとめ


本記事では、Apacheを使用した負荷分散リバースプロキシの設定方法について詳しく解説しました。基本的なリバースプロキシの導入から、ラウンドロビン方式の負荷分散、スティッキーセッション、SSL対応のリバースプロキシまで、幅広い設定手順を網羅しています。

適切な設定を行うことで、システムの可用性と拡張性が向上し、トラフィック増加に対しても柔軟に対応可能になります。また、SSLオフロードやスティッキーセッションの活用により、セキュアで安定したWebサービスの運用が可能です。

トラブルシューティングセクションでは、503エラーやSSL証明書エラーなどのよくある問題とその対処法についても触れました。これにより、運用中に発生する障害にも迅速に対応できるようになります。

Apacheは高い柔軟性と信頼性を備えたWebサーバーであり、リバースプロキシと負荷分散の構築には最適な選択肢です。今回紹介した設定例を活用し、安定したWebインフラの構築に役立ててください。

コメント

コメントする

目次