本記事では、仮想サーバー上にい構築した、WebサーバとAPサーバ間の連携方法について解説します。なお、WebサーバーとAPサーバー間の接続には「mod_proxy」を、負荷分散設定には「mod_proxy_Balancer」を採用することとします。
Web-AP間接続コネクタとは?
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/mod_proxy-image-01.png)
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間連携構成図
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/wb-ap-linkage-norm-01.png)
サーバーグループ毎に、異なるアプリケーションが動作することを想定して「main-server-group」のメンバに「jbs11」「jbs12」、「other-server-group」のメンバに「jbs21」「jbs22]を組み合わせ、それぞれサーバーを跨いで構築します。
実際のプロジェクトでは、ドメインコントローラも冗長構成にすることが一般的ですが、本記事ではシングルドメイン構成とします。
※ ドメインコントローラーを正副構成(冗長化)にしないという意味です。
負荷分散の振り分け(ロードバランシング)
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/wb-ap-linkage-error-01.png)
各Jboss-eapサーバーグループのインスタンスは、特に正副は設けず「Act/Act」とします。「mod_proxy」を利用する事により、Apacheから複数台のJboss-eapサーバーインスタンスへリクエストを分散させる事が可能です。設定で「Act/Stb」構成とすることも可能です。
メンバーインスタンスに障害が発生した場合には「mod_proxy_balancer」がステータスコードを検知し、その経路を切断します。また、ロードバランスの方法には、大まかにラウンドロビンとステッィキーセッション2つの方式があります。
- ラウンドロビン方式
単純に、リクエストが来たら複数のJboss-eapにリクエストを振り分けます。 - ステッィキーセッション方式
クッキーの値で同じユーザと判断した場合、一度つながったJboss-eapへ再度リクエストを送ります。
本記事では、動的コンテンツを想定してスティッキーセッション方式を採用します。
Web-AP間連携設定の流れ
- コネクタモジュールの設定
- 各サービス及びサーバーインスタンスの起動確認
- JBOSS-EAPサーバーへのデプロイ
- Web-AP間接続コネクタの動作確認
- Web-AP間接続障害時の縮退動作確認
Web-AP間連携の設定を行う
ここからは、Apacheのモジュール「mod_proxy」関連のファイルを編集して設定を行っていきます。Web-サーバーへバンドル版のhttpd(Apache)を導入していれば、「mod_proxy」モジュールはデフォルトでインストールされています。
ちなみに、下記のコマンドでApacheのモジュール関連の導入有無が確認できます。
# 導入されている「Apache」の起動シェルスクリプトを検索
$ which apachectl
# 導入済みモジュールの一覧を表示
$ sh apachectl -M | grep proxy*
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@wb01 sbin]# sh apachectl -M | grep proxy* AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.109.150. Set the 'ServerName' directive globally to suppress this message proxy_module (shared) proxy_ajp_module (shared) proxy_balancer_module (shared) proxy_connect_module (shared) proxy_express_module (shared) proxy_fcgi_module (shared) proxy_fdpass_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_scgi_module (shared) proxy_wstunnel_module (shared) |
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点のロード設定が有効化(非コメントアウト)されていることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@wb01 conf.modules.d]# cat 00-proxy.conf # This file configures all the proxy modules: LoadModule proxy_module modules/mod_proxy.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_express_module modules/mod_proxy_express.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_scgi_module modules/mod_proxy_scgi.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so |
確認するのは下記の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の起動時に読み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [root@wb01 conf.d]# vi proxy-balancer.conf # BalancerMember ProxyPass /balancer-manager ! <Location /balancer-manager> SetHandler balancer-manager Order Deny,Allow Deny from all Allow from all 192.168.109. </Location> # ServerStatus ExtendedStatus On ProxyPass /server-status ! <Location /server-status> Sethandler server-status Order deny,allow Deny from all Allow from all 192.168.109. </Location> ProxyRequests Off ProxyPass / balancer://jbs-main-cluster nofailover=Off lbmethod=byrequests timeout=10 maxattempts=1 stickysession=JSESSIONID ProxyPassReverse / balancer://jbs-main-cluster/ <Proxy balancer://jbs-main-cluster> BalancerMember http://ap01:8080/ route=01 keepalive=On loadfactor=10 retry=20 BalancerMember http://ap02:8180/ route=02 keepalive=On loadfactor=10 retry=20 ProxySet failonstatus=500,403,404 </Proxy> ProxyPass / balancer://jbs-other-cluster nofailover=Off lbmethod=byrequests timeout=10 maxattempts=1 stickysession=JSESSIONID ProxyPassReverse / balancer://jbs-other-cluster/ <Proxy balancer://jbs-other-cluster> BalancerMember http://ap02:8080/ route=01 keepalive=On loadfactor=10 retry=20 BalancerMember http://ap01:8180/ route=02 keepalive=On loadfactor=10 retry=20 ProxySet failonstatus=500,403,404 </Proxy> |
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サービスの起動を確認します。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-27-e1588908837508.png)
起動していない場合は、下記のコマンドで起動して下さい。
# systemctl start httpd
Jboss-eapサーバーの起動確認
Jboss-eapサーバーの全インスタンスの起動を確認します。
ap01のJboss-eapサーバー起動確認
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-28-e1588908810347.png)
ap02のJboss-eapサーバー起動確認
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-29-e1588908769268.png)
起動していない場合は、下記のコマンドで起動して下さい。
※ ap01、ap02で実行します。
# sh /opt/jboss/EAP-7.2.0/bin/init.d/jboss-eap-rhel.sh start
「main-server-group」 のサーバーインスタンス(jbs11、jbs12)が起動していることを確認します。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-36-e1585981196968.png)
「other-server-group」 のサーバーインスタンス(jbs21、jbs22)が起動していることを確認します。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-37-e1585981180861.png)
Server-Status画面の確認
下記のURLへアクセスして「Server-Status」が正常に動作していることを確認します。
URL:http://wb01/server-status/
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-30-e1585981286732.png)
Balancer-Manager画面の確認
下記のURLへアクセスして「Balancer-Manager」が正常に動作していることを確認します。
URL:http://wb01/balancer-manager/
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-31-e1585981138103.png)
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」に対して行います。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-32-e1585981266355.png)
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-33-e1585981249962.png)
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-34-e1585981230557.png)
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-35-e1585981213204.png)
※「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!」が出力されていることを確認します。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-38-e1592200463334.png)
Web-AP間接続コネクタの動作確認
下記のURLを入力し、Web-AP間接続コネクタが正常に負荷分散していることを、「Balancer-Manager」画面から確認します。
「wb01」⇒「jbs11」「jbs12」への接続確認
URL: http://wb01/main/jboss-as-helloworld/HelloWorld
※ 上記URLを10回連続で表示させます。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-39-e1585981095842.png)
「wb01」⇒「jbs21」「jbs22」への接続確認
URL: http://wb01/other/jboss-as-helloworld/HelloWorld
※ 上記URLを5回連続で表示させます。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-40-e1585981077223.png)
Web-AP間接続障害時の縮退動作確認
サーバーグループ内でメンバーインスタンスに障害が発生した場合には、「mod_proxy_balancer」がステータスコードを検知し、その経路を切断することを確認します。
「jbs-main-cluster」 の縮退確認
「jbs11」サーバーインスタンスを停止して、下記のURLへアクセスします。
URL: http://wb01/main/jboss-as-helloworld/HelloWorld
※ 上記URLを5回連続で表示させます。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-41-e1585981058159.png)
「jbs-other-cluster」 の縮退確認
「jbs21」サーバーインスタンスを停止して、下記のURLへアクセスします。
URL: http://wb01/other/jboss-as-helloworld/HelloWorld
※ 上記URLを5回連続で表示させます。
![](https://www.pmi-sfbac.org/wp-content/uploads/2020/04/ap01-jboss-42-e1585981034682.png)
本記事でのWeb-AP間接続コネクタの設定は、あくまでも一例にすぎません。
「mod_proxy」は、ヘルスチェックによる自動障害検知の方法や、負荷分散方式「Acrive-Standby」等、他にも詳細に設定が可能です。
是非、いろいろ試してみてください。
仮想サーバー構築(全9記事)[追加記事作成中]
├─KickStartを使ってVmWare Player上へLinuxを導入する!
├─KickStart設定ファイルについて!
├─httpd(Apache)サーバーの導入
├─NICチーミングを設定する!
├─サーブレットコンテナ(JBOSS)の導入
├─JBoss-EAPを設定する!
├─Web-AP間連携の設定を行う!
├─VmWare Playerのディスク共有設定を行う!
└─共有ディスク上へデータ格納領域を作成する