読者です 読者をやめる 読者になる 読者になる

ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

Apache2.4でロードバランシング設定して管理画面(バランサマネージャ)で確認する。

Apacheのバランサマネージャでロードバンスを行う。

環境

CentOS7
Apache2.4

手順

ロードバランス管理機能を使用するには mod_proxy_balancer をインストールする。
バランサマネージャ(管理画面)を使用するには mod_status が必要。

※モジュールは既にインストール済みの前提

ロードバランス設定

httpd.conf
で当該モジュールを有効にする

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so                                           
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so                                             
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so                                           
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so 
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so 
LoadModule status_module modules/mod_status.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 

2.2と異なるみたい。

ロードバランス設定追記
※予めポート番号8080と18080のTomcatを2台準備

ProxyPass / balancer://cluster/ nofailover=Off timeout=10 maxattempts=1 stickysession=JSESSIONID 
ProxyPassReverse / balancer://cluster/

<Proxy balancer://cluster/>
  BalancerMember http://localhost:8080 keepalive=On loadfactor=10 retry=2
  BalancerMember http://localhost:18080 keepalive=On loadfactor=10 retry=2
</Proxy>
</Proxy>

※記ポート番号後ろにスラッシュを付けると、Tomcat上でのアクセスでスラッシュが一つ多くなるので注意。

ProxyPassのオプション

公式ドキュメント参照。
https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypass

  • nofailover=Off

On になっていると、ワーカーがエラーを起こしたり 無効になっている場合にセッションが切れます。
デフォルトはOffだけど明示的に指定。

  • timeout=10

バランサーのタイムアウトを秒で指定します。
この値を設定すると、フリーのワーカーを取得するまでの最大待機時間になります。
デフォルトでは待機しません。

  • maxattempts=1

フェイルオーバーを試みる最大の回数を指定します。

  • stickysession=JSESSIONID

バランサーのスティッキーセッション名。stickysessionはCookieで保持してる。
セッション維持の仕組みが必要なら設定する。
値はバックエンドサーバーにより異なるTomcat(Java)の場合は上記で良いかと。
stickysessionの仕組みとしては、1回目のリクエストでバックエンドサーバーaにアクセスがあった場合、2回目以降もずっとバックエンドサーバーaにアクセスしにいくというもの。
スティッキーセッションを使用しないと、アクセス毎に参照サーバーが異なり、セッションでのログイン情報保持などが正常に行えなくなる等の問題がある。

BalancerMemberのオプション

公式ドキュメント参照。
https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypass

とりあえず必要そうなものを設定。

  • keepalive=On

その名の通り、KeepAliveを有効にする。
このフラグは OS に指示して、KEEP_ALIVE メッセージを非活動状態の コネクションでも送るようにします。これによってファイアウォールによってコネクションが 落とされることを防げます。

  • loadfactor

ワーカーあたりの負荷係数で、1~100まで指定できる。
重みづけみたいなもの。
数値の大きい方へ多く割り振られる。
試しにワーカー1を10、ワーカー2を5に設定したら、アクセス数が7:3になった。
通常は同じ値にして、スペック低いサーバーは小さくすると良いかも。

  • retry

コネクションをプーリングするための、リトライのタイムアウトを秒で 指定します。
バックエンドのサーバがいったんダウンすると、復旧しても一定時間(デフォルトでは60秒)は 503エラーを返してしまうのでその対策。
2秒と短くしておく事で、バックエンドサーバーが復旧後はすぐに503エラーは解消される。

以下はApache2.4からなくなったらしい。(公式ドキュメントに無い)ので指定しない

  • lbset

重み付けみたいなもの?
値の小さいほうが優先して使用されるみたい。

  • status

一文字でワーカーの初期状態を定義します。

Apacheが起動エラー時

Apacheのエラーログを確認する。

下記エラーが出た時。

[Fri Jan 13 23:36:30.369840 2017] [proxy_balancer:emerg] [pid 57544:tid 140472117761856] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??

httpd.confの下記をコメントアウト

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 

下記エラーが出た時

[Fri Jan 13 23:39:46.639850 2017] [proxy:crit] [pid 57596:tid 140634305619776] AH02432: Cannot find LB Method: byrequests
[Fri Jan 13 23:39:46.639930 2017] [proxy_balancer:emerg] [pid 57596:tid 140634305619776] (22)Invalid argument: AH01183: Cannot share balancer

httpd.confの下記をコメントアウト

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so                                           
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so                                             
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so                                           
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so 

Apache起動できたがアクセスすると下記エラー

[Fri Jan 13 23:44:36.055815 2017] [proxy:warn] [pid 57765:tid 139641429935872] [client ::1:38006] AH01144: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

httpd.confの下記をコメントアウト

LoadModule proxy_http_module modules/mod_proxy_http.so 

動いた!
何度かアクセスし、2台のTomcatにアクセスがいってる事を確認。

バランサマネージャー設定

httpd.conf

ProxyPass /balancer-manager !
<Location /balancer-manager>
SetHandler balancer-manager

Order Deny,Allow
Deny from all
Allow from 192.168
</Location>

注意点として、ロードバランサ設定の前に記述する事。
/balancer-managerのパスはプロキシ通さないようにしている。
また、192.168*のIP指定でのアクセス以外は除外している。
必須では無い。

http://192.168.10.117/balancer-manager
でアクセスできる事を確認。

http://localhst/balancer-manager
だと403エラー

バランサマネージャー管理画面

起動するとこんな感じ。
バランサマネージャーの状態が確認できる。
現在の構成としてtomcat2台をロードバランスしている。
f:id:blackna7:20170114111336j:plain

各列の意味については分かり次第追記していく。

  • Worker

ワーカーのURL
ex)
http://localhost:8080

  • URL
  • Route RouteRedir
  • Factor

設定されたloadfactorの値。
大きい方が多く振り分けられる。

  • Set
  • Status

ワーカーの起動状態。
Init Ok ... 起動中
Init Err .. アクセスできない
試しに片方のTomcatを停止するとinit Errとなった。

  • Elected

Apache起動後、振り分けられたリクエスト件数。

  • Busy
  • Load
  • To
  • From