仮想サーバー構築

【仮想サーバ構築】Web-AP間連携の設定を行う!【mod_proxy】

2020年4月2日

本記事では、仮想サーバー上にい構築した、WebサーバとAPサーバ間の連携方法について解説します。なお、WebサーバーとAPサーバー間の接続には「mod_proxy」を、負荷分散設定には「mod_proxy_Balancer」を採用することとします。

Web-AP間接続コネクタとは?

Web-AP間接続コネクタとは、ユーザーからのリクエストをWebサーバで受け取り、Apacheに導入したコネクタモジュール(Web-AP間接続コネクタ)からJBossクラスタの各ノードにリクエストを振り分ける機能を提供します。

クライアントと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」は除外します。また「mod_cluster」は、経験上パフォーマンスに問題があるため、本記事ではWeb-AP間のコネクタに「mod_proxy」を採用します。

想定するWeb-AP間連携構成図

Web-AP間論理イメージ

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

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

負荷分散の振り分け(ロードバランシング)

Web-AP間の縮退動作イメージ

各Jboss-eapサーバーグループのインスタンスは、特に正副は設けず「Act/Act」とします。「mod_proxy」を利用する事により、Apacheから複数台のJboss-eapサーバーインスタンスへリクエストを分散させる事が可能です。設定で「Act/Stb」構成とすることも可能です。

メンバーインスタンスに障害が発生した場合には「mod_proxy_balancer」がステータスコードを検知し、その経路を切断します。また、ロードバランスの方法には、大まかにラウンドロビンとステッィキーセッション2つの方式があります。

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

本記事では、動的コンテンツを想定してスティッキーセッション方式を採用します。

Web-AP間連携設定の流れ

  1. コネクタモジュールの設定
  2. 各サービス及びサーバーインスタンスの起動確認
  3. JBOSS-EAPサーバーへのデプロイ
  4. Web-AP間接続コネクタの動作確認
  5. Web-AP間接続障害時の縮退動作確認

Web-AP間連携の設定を行う

ここからは、Apacheのモジュール「mod_proxy」関連のファイルを編集して設定を行っていきます。Web-サーバーへバンドル版のhttpd(Apache)を導入していれば、「mod_proxy」モジュールはデフォルトでインストールされています。

ちなみに、下記のコマンドでApacheのモジュール関連の導入有無が確認できます。

# 導入されている「Apache」の起動シェルスクリプトを検索
$ which apachectl

# 導入済みモジュールの一覧を表示
$ sh apachectl -M | grep proxy*

proxyモジュールが一式導入されていることが分かります。

コネクタモジュールの設定

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)」の起動時に読み込まれ、実行可能となります。

ロードバランス設定

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サービス起動中

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

# systemctl start httpd

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

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

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

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

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

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

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

# sh /opt/jboss/EAP-7.2.0/bin/init.d/jboss-eap-rhel.sh start

「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

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-仮想サーバー構築

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