Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

準備

Windows Server 2008 R2 Enterprise (2.40GH、8GB、64ビット、192.168.10.212)
2 Ubuntu 10.04.4 (192.168.10.98, 192.168.10.137)
JDK1.7.80
トムキャット7.0.68
アパッチ2.4.4

1. Apache 2.4.4をインストールする

インストールプロセス中に注意すべきことは何もありません。「次へ」をクリックし続けるだけです。インストールが完了すると、Apache サービスがデフォルトで有効になります。ブラウザに localhost または 127.0.0.1 と入力すると、「It works」という文字が表示されます。

2. Java環境

Ubuntuの設定はインターネット上にたくさんあるので、ここでは詳しくは説明しませんが、JAVA_HOMEとPATHの設定を忘れないようにしてください。

3.Tomcatのインストール

ディレクトリ内で解凍するだけです。私のディレクトリは /opt/tomcat7/ です。両方の Ubuntu で解凍しました。権限不足の問題に遭遇する可能性があります。このとき、コマンドを入力する必要があります。最も単純かつ最も強力なのは、sudo chmod 777 directory です。セキュリティ上の問題により、適切に認証する必要があるため、ここでは言及しません。

構成を開始する

Apache の設定

1. まず、conf/httpdファイルで、必要なモジュールコメントを開きます(先頭の#記号を削除するだけです)。

LoadModule proxy_module モジュール/mod_proxy.so
ロードモジュール proxy_ajp_module モジュール/mod_proxy_ajp.so
ロードモジュール proxy_balancer_module モジュール/mod_proxy_balancer.so
ロードモジュール proxy_connect_module モジュール/mod_proxy_connect.so
ロードモジュール slotmem_shm_module モジュール/mod_slotmem_shm.so
ロードモジュール lbmethod_byrequests_module モジュール/mod_lbmethod_byrequests.so

ここでは最後の 2 つについて説明します。最初のいくつかを開いただけで、Apache を起動できませんでした。

ログを確認すると、「'slotmem' のプロバイダー 'shm' の検索に失敗しました: mod_slotmem_shm がロードされていますか?」というエラーが報告され続けていることがわかりました。確認したところ、モジュールが有効になっていませんでした。# 記号を削除すると、エラーは報告されなくなります。

もう 1 つの理由は、エラー (22) 無効な引数: AH01183: バランサーを共有できません が報告されることです。このモジュールを開くと、エラーは報告されなくなります。

2. conf/httpdファイル内の仮想ホストのコメントを解除する

Includeの前の#を削除します

3. conf/extra/httpd-vhosts.confに設定を追加する

まずは私自身の設定を投稿させてください。

<仮想ホスト *:80>
  サーバー管理者 [email protected]
  ProxyPass / balancer://cluster/ スティッキーセッション=JSESSIONID|jsessionid nofailover=オン
  ProxyPassReverse / バランサ://cluster/
  サーバー名 192.168.10.212
  エラーログ "logs/error.log"
  CustomLog "logs/access.log" 共通
</仮想ホスト>
プロキシリクエストオフ
<プロキシ バランサー://クラスター>
  バランサメンバー ajp://192.168.10.98:8009 負荷係数=1 ルート=jvm1 smax=5 最大=20 ttl=120 再試行=300 タイムアウト=15
  バランサメンバー ajp://192.168.10.137:8009 負荷係数=1 ルート=jvm2 smax=5 最大=20 ttl=120 再試行=300 タイムアウト=15
</プロキシ>

ProxyPass: リモートサーバーをローカルサーバーのURL空間にマッピングします

balancer:// : プロキシ命令タイプ

sticksession: バランサーのスティッキーセッション名。この値は、セッションをサポートするバックエンド アプリケーション サーバーに応じて、JSESSIONID や PHPSESSIONID などに設定されることが多いです。バックエンド サーバーが異なる Cookie 名または URL エンコードされた ID (サーブレット コンテナーなど) を使用する場合は、| を使用してそれらを区切ります。最初の部分は Cookie 用、2 番目の部分はパス用です。

nofailover : 「オン」に設定すると、ワーカーが無効になったりエラーが発生したりしたときにセッションが直ちに終了します。バックエンド サーバーがセッション レプリケーションをサポートしていない場合は、この値をオンに設定できます。

ProxyRequests: ProxyPass ディレクティブを使用する場合は、通常、ProxyRequests ディレクティブをオフにする必要があります。

BalancerMember: Balancer メンバー

loadfactor: 作業単位の負荷係数。 BalancerMember に使用されます。これは、この作業者に適用される正規化された重量負荷を定義する 1 ~ 100 の数値です。

route : ロードバランサーで使用されるワーカーのルート。ルートはセッション ID に追加される値です。

smax: 必要に応じて、最大数のリンク (ソフト最大値、または smax) を作成します。 smax 数を超えるリンクには、有効期間 (ttl) が割り当てられます。

max: デフォルト値は、現在の MPM 内のプロセスあたりのスレッド数です。 Prefork MPM ではこの値は常に 1 であり、Worker MPM ではこの値は ThreadsPerChild によって制御されます。

ttl: smax 接続数を超える非アクティブ リンクの存続時間 (TTL) (秒単位)。 Apache はこの間に使用されていない接続をすべて閉じます。

retry: スレッド プール ワーカーの再試行のタイムアウト (秒単位)。バックエンド サーバーへのスレッド プール ワーカーのステータスがエラーの場合、Apache はタイムアウトが経過するまでサーバーにリクエストを送信しません。 これにより、バックエンド サーバーをメンテナンスのために停止し、後でオンラインに戻すことができます。値が 0 の場合、エラーが発生したときに待機せずにワーカーを常に再試行することを意味します。

timeout: リンクのタイムアウト(秒単位)。設定されていない場合、Apache は接続が利用可能になるまで待機します。このディレクティブは、バックエンド サーバーへの接続を制限するために、max パラメータと一緒に使用されることが多いです。

これで設定はほぼ完了です。Apache サービスを再起動するだけです。

注: localhost または 127.0.0.1 を入力すると、「It works」という文字は表示されなくなります。代わりに、503 エラーが報告されます。これは、Apache が負荷分散機能を有効にし、ターゲット IP を AJP 経由で Tomcat に送信したが、Tomcat がまだ起動していないため、正常な動作です。

Tomcat の設定

192.168.10.98のサーバーを例に挙げます

Vim を使用して conf の下の server.xml を開きます (Vim を知らない場合は想像力を働かせてください ╮(╯▽╰)╭)。ここで紹介する負荷分散は、Apache が AJP プロトコルを介して Tomcat に接続するため、Apache で設定されたポート番号が Tomcat の AJP のポート番号になります。

さらに、エンジンでjvmRouteを設定する必要があります

 <エンジン名="Catalina" defaultHost="localhost" jvmRoute="jvm1">

ここでの jvmRoute は Apache のルートに対応します。 (これを削除したところ、まだ機能していることがわかりました。素晴らしいと思いますが、設定する必要があります。)

ついに、

 <クラスタークラス名="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

このメモは

この時点で設定は完了です。同様に、192.168.10.137 でも設定します。

テスト用に小さなtest.jspを書く

<%@ ページコンテンツタイプ="text/html;charset=UTF-8" %>
<%@ ページインポート="java.util.*"%>
<html>
  <ヘッド>
    <title>ApacheTomcatテスト</title>
  </head>
  <本文>
    <%
      out.println("<br> セッションID:" + session.getId() + "</br>");
    %>
  </本文>
</html>

Tomcat の webapps ディレクトリの下に balance フォルダを作成し、そのフォルダに test.jsp を置いて、Tomcat を起動します。

最後に、ブラウザに192.168.10.212/balance/test.jspと入力します。
セッションIDの値が2つの数字の間で変化していることがわかります。

これは負荷分散の具体化です。もちろん、192.168.10.212 を入力すると、「It works」ではなく、従来の Tomcat ホームページが表示されます。

ちなみに、上記は3つのサーバーに基づいています

Apache+Tomcat7の負荷分散構成の詳細については、次の関連リンクをクリックしてください。

以下もご興味があるかもしれません:
  • Apache、wsgi、django プログラムのデプロイメント設定方法の詳細な説明
  • LinuxベースのApacheウェブサイトサービス構成の詳細な説明
  • Ubuntu 上の Apache で SSL (https 証明書) を設定する正しい方法の詳細な説明
  • Apache Web サーバーを使用して 2 つ以上のサイトを構成する方法
  • Apache での ModSecurity のインストール、有効化、および構成
  • CentOS 7 での Apache Web サーバーのインストールと設定のチュートリアル
  • Alibaba Cloud Server Apache は SSL 証明書を構成して Https を正常に有効にします (さまざまな落とし穴を記録します)
  • Win10 Apache が仮想ホストを設定した後にローカルホストが利用できなくなる問題の解決方法
  • Apache 経由で複数の仮想ホストをローカルに設定する方法

<<:  MySQL の厄介な Aborted 警告をケーススタディで分析する

>>:  この記事はPReact10.5.13のソースコードを理解するのに役立ちます

推薦する

初めてDockerイメージを構築、実行、公開、取得するための詳細な手順

1. はじめに以前は、Python アプリケーションの作成を開始したい場合、最初のステップはマシンに...

MySQL 8で追加された3つの新しいインデックスは、非表示、降順、関数です。

目次MySQL 8 の隠しインデックス、降順インデックス、関数インデックス1. 隠しインデックス1....

VueコンポーネントライブラリElementUIはテーブルリストのページング効果を実現します

ElementUIはテーブルリストのページング効果のチュートリアルを実装しています。参考までに。具体...

ハイパーリンクAタグを学ぶ

聞く: CSS を使用してハイパーリンクのスタイルを設定しましたが、ホバーしても機能しません。なぜこ...

MySQL の char、varchar、text フィールド タイプの違い

MySQL では、char、varchar、text の各タイプのフィールドはすべて文字タイプのデー...

ウェブデザインに必須のツール: Firefox Web Developer プラグイン CSS ツールセットのチュートリアル

プラグインは Firefox ブラウザにインストールされます。 Web Developer プラグイ...

ウォーターフォールフローレイアウト(無限読み込み)を実現する js

この記事の例では、ウォーターフォールフローレイアウトを実装するためのjsの具体的なコードを参考までに...

Vueグローバルカスタム命令の実践 モーダルドラッグ

目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...

一意の注文番号を生成するためのMySQLの高同時実行方法

序文このブログ記事が公開された後、何人かの友人からSQL Serverバージョンがあるかどうか尋ねら...

MySQL5.7.27-winx64 バージョン win10 のダウンロードとインストールのチュートリアル図

MySQL 5.7 のインストール私たちは学校で MySQL データベースを学んでいます。先生は私た...

LINUX でポートが占有されているかどうかを確認する方法

ポートが占有されているかどうかは、これまで一度もわかりませんでした。多くの人に尋ねて、ようやくわかり...

Node.js で簡単なクローラーケースを作成するチュートリアル

準備まず、nodejs をダウンロードする必要がありますが、これは問題ないはずです。原文はwebst...

Vueのシンプルな状態管理ストアモードを理解する方法

目次概要1. store.jsを定義する2. store.js を使用するコンポーネント3. 成果を...

Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

質問LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

MySQL マスタースレーブの原理と構成の詳細

MySQLのマスタースレーブ構成と原理、参考までに具体的な内容は以下のとおりです。 1. 環境の選択...