Apacheにおける負荷分散機能(ロードバランサ)

Apacheにおける負荷分散機能(ロードバランサ)

■負荷分散概要
通常の構成においてはロードバランサは専用のアプライアンスを導入する。
その方が多くのリクエストをさばけるからである。
だがApacheにも負荷分散機能が存在し、利用することができる。

負荷分散方式には下記のものがある
1.ラウンドロビン方式・・・順番にサーバにリクエストを割り振る
2.最速応答時間方式・・・最も応答が早いと思われるサーバにリクエストを割りふる
3.最少コネクション方式・・・クライアントと保持しているコネクションが最も少ないサーバにリクエストを割りふる
4.最少トラフィック方式・・・データ通信量が最も少ないサーバにリクエストを割り振る

このほかに、重みつけラウンドロビン方式、CPU負荷分散方式、セッション維持方式等も存在する。

ロードバランサを導入することで、バックエンドで故障の合ったサーバを切り離したりすることなどができ、柔軟に対応することができる。
一方で構成が複雑になり、ログも分散することがあるため、導入は慎重に検討するべきである。

apacheにおける負荷分散

・フォーワードProxy
俗に言う通常のプロキシ。ネットワークは以下におけるそれぞれのクライアントが個々に直接インターネットへアクセスするのではなく
プロキシサーバが中継し、代表してインターネットにアクセスする。
キャッシュがプロキシサーバに保存されるため、応答が早い。ただし逆にコンテンツが更新されていた場合は更新に時間がかかる。

・リバースProxy
本項で述べた負荷分散に用いる機能。正確にはリバースProxy+負荷分散+冗長性によりロードバランシングを実現する。

Apacheのリバースプロキシ関連のモジュールは下記
1. mod_proxy
2. mod_proxy_balancer
3. mod_proxy_ftp
4. mod_proxy_http
5. mod_proxy_ajp
6. mod_proxy_connect

またApacheのproxy機能によって実現できる負荷分散機能は下記
1. リクエスト回数をもとにサーバに処理を割り振る
2. トラフィック量をもとにサーバに処理を割り振る
3. セッション変数を利用している場合は、セッションを作成済みのサーバに対してのみリクエストを割り振る(スティッキーセッション)
4. 設定を動的に変更するマネージャが利用できる
マネージャを通じてバックエンドサーバの状況確認ができる。

またApacheのproxy機能によって実現できる冗長化機能は下記
1. バックエンドサーバのダウンを自動的に検知し、分散対象から外すことが可能
2. バックエンドサーバが障害から復帰した場合には自動的に分散対象に含めることが可能
3. バックエンドのオンライン/オフラインを動的に変更するマネージャが利用できる


■mod_proxyを使用してURLに対応して異なるバックエンドサーバへ処理を割り振る
下記の例では/server1へのアクセスをhttp://192.168.1.1へ転送。
/server2へのアクセスをhttp://127.0.0.1へ転送する。

#Proxyフォーワードの機能はOffとする
ProxyRequests Off

#set the mappings of the reversproxy
ProxyPass /server1 http://192.168.1.1
#replace the response header of http
ProxyPassReverse /server1 http://192.168.1.1

ProxyPass /server2 http://127.0.0.1
ProxyPassReverse /server2 http://127.0.0.1


■mod_proxyを使用してリクエスト回数毎に異なるバックエンドサーバへ処理を割り振る
下記の例では/balancer_testへのアクセスを重み3として127.0.0.1へ、重み2として192.168.1.1へ割り振る

#Proxyフォーワードの機能はOffとする
ProxyRequests Off

ProxyPass /balancer_test balancer://mycluster lbmethod=byrequests timeout=1

BalancerMember http://127.0.0.1 loadfactor=3
BalancerMember http://192.168.1.1 loadfactor=2

※ちなみにトラフィック量によりバックエンドサーバへの処理を振り分ける場合はlbmethod=bytrafficへと変更するだけである


■管理画面を使用してバックエンドサーバの稼働状況を確認する
下記の例では127.0.0.1以外からのアクセスを拒否し、/usr/local/apache2/conf/htpasswdに用意されたファイルをもとにBasic認証を行っている。

SetHandler balancer-manager

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
AuthUserFile /usr/local/apache2/conf/htpasswd
AuthGroupFile /dev/null
AuthName "Balancer Manager"
AuthType Basic
require valid-user

Apache mod_security2について

WAF(Web Application Wirewall)
ファイアウォールというと通常、ルータやL2スイッチの機能として普及しているのが一般的な用に感じるが、
今回のWAFというものは文字通りアプリケーションレベルでファイアウォールを実装したものである。
これにはApacheの拡張モジュールであるmod_security2というものを用いる。

これを用いることによってApacheにより柔軟にアクセス制限を設定できる。
GET, POSTパラメータに関して特定の文字列を検知し制限をかけることもできるため、PHPなどの言語によるバリデーションとケースバイケースで併用すると、より良い効果が望まれると思われる。
ログに関しても、アクセスログなどと同様にして保存されるため、非常に便利な機能の一つだと感じる。

使用法としてはごく単純であり、まずモジュールをロードする記述と、WAFとして機能させるためのいくつかのルールを設定するだけである。
ロードするモジュールとしては下記の二つが必要となる。
1. mod_unique_id
2. mod_security2

実際にhttpd.confまたは各種切り出された拡張モジュール単位の設定ファイルに記述される内容は以下のようになる。

1. モジュールのロード
LoadModule security2_module modules/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so

2. ファイアウォールルールの設定

#基本設定
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

#デフォルトアクションの設定
SecDefaultAction phase:2,log,auditlog,deny

#デバッグログ
SecDebugLog logs/modsec_debug.log
SecDebugLogLevel 3

#監査ログ
SecAuditEngine RelevantOnly
SecAuditLog logs/modsec_audit.log

#監査ルールの設定
#例えばアクセス元IPアドレスをもとに制限をする場合
SecRule REMOTE_ADDR "!@rx ^192\.168\.1\.[0-9]{1,3}$" "log,deny"

#例えばGETパラメータのバリューとしてlimitedが設定されている時にログをとりアクセスを拒否する場合
SecRule ARGS_GET "limited" "log,deny"
#例えばPOSTパラメータのバリューとしてlimitedが設定されている時にログをとりアクセスを拒否する場合
SecRule ARGS_POST "limited" "log,deny"