仮想サーバー構築

【サーバ構築:第7巻】Web-AP間連携の設定をしよう!【mod_proxy】

2020年4月2日

Web-AP間連携を設定しよう!

本記事でのWeb-AP間連携は、クライアントからのアクセスをWebサーバ(Apache)で受け、Apacheに導入したコネクタモジュールから「Jboss-eap」クラスタの各ノードにリクエストを振り分ける構成を組みます。

Web-AP間接続コネクタの設定

クライアントとJBossクラスタの間にWebサーバ(Apache)を設置してロードバランシングする場合、コネクタとしては以下の3つの選択肢があります。

Web-AP間コネクタの種類

  • Tomcat Connectors(mod_jk)
    Apache Tomcatプロジェクトによって開発されているコネクタです。開発の歴史も古く情報も豊富です。ただし通信プロトコルは「ajp」のみ対応。
  • Apache Proxyモジュール(mod_proxy
    Apache HTTPに標準で含まれているプロキシ用モジュールです。mod_proxyはいくつかのモジュールに分割されており、APサーバとの通信を行う場合はmod_proxy_ajp、mod_proxy_httpといったモジュールを利用して通信します。
  • JBoss HTTP Connector(mod_cluster)
    JBossコミュニティが開発しているコネクタモジュールです。mod_clusterは、JBossパッケージに含まれて配布されています。

「mod_jk」や「mod_proxy」は、Webサーバ側に導入します。「mod_cluster」はWebサーバ、APサーバそれぞれにモジュールを導入します。

尚、プロトコルに「http」を使用するため「mod_jk」は除外します。
実際のプロジェクトでは「ajp」プロトコルの疎通申請書など、手続きがめんどくさいことが多いです。

また「mod_cluster」経験上パフォーマンスに問題がある気がします。

以上の理由から、本記事ではWeb-AP間のコネクタに「mod_proxy」を採用します。

Web-AP間連携概略図

Web-AP間論理イメージ

「main-server-group」として、メンバに「jbs11」「jbs12」、「other-server-group」として、メンバに「jbs21」「jbs22]を、それぞれサーバーを跨いで構築します。
サーバーグループ毎に、異なるアプリケーションが動作する想定です。

実際のプロジェクトでは、ドメインコントローラも冗長構成にすることが一般的ですが、本記事ではシングルドメイン構成とします。
ドメインコントローラーを正副構成(冗長化)にしないという意味です。

負荷分散の振り分け

各Jboss-eapサーバーグループのインスタンスは、特に正副は設けず「Act/Act」とします。
ロードバランス設定で「Act/Stb」の構成も可能です。

サーバーグループ内でメンバーインスタンスに障害が発生した場合には、「mod_proxy_balancer」がステータスコードを検知し、その経路を切断します。

「mod_proxy」を利用する事により、Apacheから複数台のJboss-eapサーバーインスタンスへリクエストを分散させる事が可能です。

ロードバランスの方法には、大まかにラウンドロビンとステッィキーセッション2つの方式があります。

  • ラウンドロビン方式
    単純に、リクエストが来たら複数のJboss-eapにリクエストを振り分けます。
  • ステッィキーセッション方式
    クッキーの値で同じユーザと判断した場合、一度つながったJboss-eapへ再度リクエストを送ります。

本記事では、動的なJavaアプリケーションを想定して、スティッキーセッション方式を採用します。

Web-AP間接続モジュール

Webサーバー(wb01)とAPサーバー(ap01、ap02)の接続には、下記の3つのモジュールを使用して、各リクエストをAPサーバーへ負荷分散します。

負荷分散方式

  • mod_proxy
    Apache HTTPに標準で含まれているプロキシ用モジュールです。
  • mod_proxy_http
    HTTP/1.1 プロキシ/ゲートウェイサーバです。
  • mod_proxy_balancer
    負荷分散のための mod_proxy 拡張機能を備えたモジュールです。

ロードモジュールの設定

「/etc/httpd/conf.modules.d/00-proxy.conf」の設定を確認します。

Web-AP間の連携で必要なモジュール3点のロード設定が有効化(非コメントアウト)されていることを確認します。

確認するのは下記の3つのモジュールです。

3行目:「modules/mod_proxy.so」
9行目:「modules/mod_proxy_balancer.so」
15行目:「modules/mod_proxy_http.so」

ロードバランス設定

httpd(Apache)からmod_httpdを利用してJboss-eapサーバー(jbs11、jbs12、jbs21、jbs22)に、接続するための設定を行います。

「/etc/httpd/conf.d/proxy-balancer.conf」ファイルを作成します。
ファイル名は判り易い名前であれば、特にルールはありません。「/etc/httpd/conf.d」配下へ作成すれば、httpdの起動時に読み込みます。

3-10行目:バランサーマネージャの設定を記述します。
  現在の稼働状況の確認やバランスメンバーの切離しや接続制御が可能になります。
12-20行目:サーバーステータスの設定を記述します。
  現在のサーバーステータスが確認できるようになります。
22行目:フォワードプロキシ機能を無効にします。
23行目:バランシング対象とするパス(以下のパス全てが対象範囲)、対応するProxy balancerディレクティブと同じ名前を記述します。
25行目:リダイレクト時のURLを置換する為の設定を記述します。
26-30行目:「jbs-main-cluster」のプロキシーバランサーメンバーを追加します。
 本記事では、メンバーにjbs11、jbs12を設定します。
32-38行目:「jbs-other-cluster」のプロキシーバランサーメンバーを追加します。
 本記事では、メンバーにjbs21、jbs22を設定します。

主なディレクティブ

  • ProxyRequests
    リバースプロキシのみ利用する場合は(フォワードプロキシを利用しない場合)は、off を指定します。
  • ProxyPass
    プロトコル経由でJboss-eapへ接続します。
    本記事では、負荷分散を行うため、「proxy-balancer」へリクエストを流します。<Proxy balancer://jbs-cluster>
  • Proxy
    このタグ内に追加するバランサーメンバーを追加します。
  • lbmethod
    分散方法の選択。byrequests(リクエスト回数)、bytraffic(バイト単位転送量)、bybusyness(フリーのワーカ優先)から選択します。
  • timeout
    ワーカーを取得するまでの最大待機時間を設定します。
  • nofailover
    アプリケーションがフェールオーバーに対応していればoffを、対応してない場合はonを指定します。
  • stickysession
    同一情報に継続的に接続する為のセッション値を指定します。
  • loadfactor
    ロードバランスする割合を指定します。
  • route
    どのサーバに割り振るか動作している指定します。
  • retry
    再接続思考の間隔を指定します。デフォルトは60秒

各サービス及びサーバーインスタンスの起動確認

実際に画面上でWeb-AP間接続コネクタの動作を確認していきます。

httpdサービスの起動確認

wb01サーバでhttpdサービスの起動を確認します。

wb01のhttpdサービス起動中

起動していない場合は、下記のコマンドで起動して下さい。

Jboss-eapサーバーの起動確認

Jboss-eapサーバーの全インスタンスの起動を確認します。

ap01のJboss-eapサーバー起動確認

ap01のJboss-eapサーバーが起動中

ap02のJboss-eapサーバー起動確認

ap01のJboss-eapサーバーが起動中

起動していない場合は、下記のコマンドで起動して下さい。
ap01、ap02で実行します。

「main-server-group」 のサーバーインスタンス(jbs11、jbs12)が起動していることを確認します。

サーバーインスタンス(jbs11、jbs12)が起動中

「other-server-group」 のサーバーインスタンス(jbs21、jbs22)が起動していることを確認します。

サーバーインスタンス(jbs21、jbs22)が起動中

Server-Status画面の確認

下記のURLへアクセスして「Server-Status」が正常に動作していることを確認します。

URL:http://wb01/server-status/

Server-Statusが正常に動作している

Balancer-Manager画面の確認

下記のURLへアクセスして「Balancer-Manager」が正常に動作していることを確認します。

URL:http://wb01/balancer-manager/

「jbs-main-cluster」と「jbs-other-cluster」の負荷分散状況が表示されている

JBOSS-EAPサーバーへのデプロイ

Web-AP間接続コネクタの正常動作を確認するために、全インスタンスへテストアプリケーションをデプロイします。

下記のURLから、テスト用アプリケーション「jboss-as-helloworld.war」をダウンロードします。

URL」 https://github.com/spagop/quickstart/blob/master/management-api-examples/mgmt-deploy-application/application/jboss-as-helloworld.war
アップしていただいた方に感謝です。

「jboss-as-helloworld.war」がダウンロードできたら、JBOSS-EAPの管理コンソールを使用して、「jboss-as-helloworld.war」を「jbs11」「jbs12」へデプロイします。
ドメイン構成なので、実際にデプロイするのは「main-server-group」に対して行います。

「Deployments」⇒「Server Groups」⇒「main-server-group」⇒「Add」ボタン押下
「Name」と「Runtime Name」が自動で入力されます。
「 jboss-as-helloworld.war 」のアップロードが正常に完了
「main-server-group」に対して「 jboss-as-helloworld.war 」のデプロイが完了

main-server-group」に対して「 jboss-as-helloworld.war 」のデプロイが完了したら、同様に「other-server-group」へも「 jboss-as-helloworld.war 」をデプロイします。
本来は、サーバーグループ毎に別のアプリケーションがデプロイされる想定ですが、本記事では学習目的の為、同じアプリケーションをデプロイしています。

各JBOSS-EAPのサーバーインスタンスへ接続

下記のURLを入力し、各Jboss-eapのサーバーインスタンスへ直接アクセスします。

URL:http://ap01:8080/jboss-as-helloworld/HelloWorld
URL:http://ap01:8180/jboss-as-helloworld/HelloWorld
URL:http://ap02:8080/jboss-as-helloworld/HelloWorld
URL:http://ap02:8180/jboss-as-helloworld/HelloWorld

上記のURL全ての画面で、 正常に「Hello World!」が出力されていることを確認します。

正常に「Hello World!」が出力されている。

Web-AP間接続コネクタの動作確認

下記のURLを入力し、Web-AP間接続コネクタが正常に負荷分散していることを、「Balancer-Manager」画面から確認します。

「wb01」⇒「jbs11」「jbs12」への接続確認

URL: http://wb01/main/jboss-as-helloworld/HelloWorld
上記URLを10回連続で表示させます。

「jbs-main-cluster」メンバーが、それぞれ5回づつアクセスされている

「wb01」⇒「jbs21」「jbs22」への接続確認

URL: http://wb01/other/jboss-as-helloworld/HelloWorld
上記URLを5回連続で表示させます。

「jbs-other-cluster」メンバーが、「jbs21」が3回、「jbs22」が2回アクセスされている

Web-AP間接続障害時の縮退動作確認

サーバーグループ内でメンバーインスタンスに障害が発生した場合には、「mod_proxy_balancer」がステータスコードを検知し、その経路を切断することを確認します。

「jbs-main-cluster」 の縮退確認

「jbs11」サーバーインスタンスを停止して、下記のURLへアクセスします。

URL: http://wb01/main/jboss-as-helloworld/HelloWorld
上記URLを5回連続で表示させます。

「jbs11」の異常を検知したBalancer-Managerは、次回から「jbs12」のみへリクエストを送信します

「jbs-other-cluster」 の縮退確認

「jbs21」サーバーインスタンスを停止して、下記のURLへアクセスします。

URL: http://wb01/other/jboss-as-helloworld/HelloWorld
上記URLを5回連続で表示させます。

「jbs21」の異常を検知したBalancer-Managerは、次回から「jbs22」のみへリクエストを送信します

本記事でのWeb-AP間接続コネクタの設定は、あくまでも一例にすぎません。

「mod_proxy」は、ヘルスチェックによる自動障害検知の方法や、負荷分散方式「Acrive-Standby」等、他にも詳細に設定が可能です。

是非、いろいろ試してみてください。

お疲れさまでした。

よく読まれている記事

1

独立前は、誰もが不安でいっぱい。近い将来、フリーランスとして独立を考えている方が独立初期に躓かないために「独立前にやるべきことチェックリスト」をご紹介します。 当記事は前編となる「お金まわり編」。全て ...

2

ゲームなどのエンタメ分野での導入が進んでいるVR。言葉自体は耳にしたことがあっても、その意味を詳しく知らないという人も多いのではないでしょうか。また、次世代の新たな技術をビジネスに積極的に活用していく ...

3

フリーランスの確定申告には、青色申告と白色申告の2種類があります。いったいどちらの申告方法を選ぶべきなのでしょうか。 この記事では、青色申告と白色申告、それぞれのメリット・デメリットを把握することでベ ...

4

フリーランスの仕事場は、自宅をはじめとし、カフェや図書館、コワーキングスペースなど自由に選べます。しかし全ての場所で100%集中ができるどうかは、人それぞれです。どのような環境が自身の仕事場として快適 ...

5

フリーランスのITエンジニアとして、一番難しいのは「自己管理」と言えるでしょう。 自分の体調管理はもとより、仕事のスケジュール等すべて自分で管理します。もちろんフリーランスに有給休暇等ありませんから休 ...

-仮想サーバー構築

Copyright© Beエンジニア , 2020 All Rights Reserved.