HAProxy 初心者向けチュートリアル

Haproxy Chu Xin Zhe Xiangkechutoriaru



アプリケーションがスケールするにつれて、より多くのトラフィックを処理するためにサーバーを追加する必要性が生じます。アプリケーションが受信するトラフィックが増えるほど、サーバーが過負荷になったときにダウンタイムが発生する可能性が高くなります。ただし、サーバー上の負荷のバランスをとるためにトラフィックを処理する方法を定義できる HAProxy などのツールがあります。アイデアは、サーバーが過負荷にならないようにすることです。高可用性プロキシは、TCP/HTTP アプリケーションのリバース プロキシとして機能しながら、信頼性の高い負荷分散を提供するように設計されたオープンソース ソフトウェアです。

HAProxy はサーバーの過負荷を軽減するように機能し、サーバーが過負荷にならないようにしながら他のサーバーが利用できるようにトラフィックを分散することでこれを実現します。 Instagram などのプラットフォームでは、1 秒あたりに送信されるリクエストにより大量のトラフィックが発生するため、過負荷を避けるために、HAProxy を使用してサーバーのフロントエンド、バックエンド、リスナーを定義する必要があります。

HAProxy を使用する理由

HAProxy のインストールと構成について学ぶ前に、HAProxy が提供する機能を考慮して、HAProxy がなぜ必要なのかを理解する必要があります。 HAProxy の主な機能は次のとおりです。







  1. ロードバランシング – HAProxy を使用すると、トラフィックをさまざまなサーバーに快適に分散して、単一サーバーの過負荷を回避できます。そうすれば、アプリケーションはダウンタイムの問題に直面することがなくなり、より高速な応答性、信頼性、可用性が実現されます。
  2. ロギングとモニタリング – サーバーの詳細な監視ログを取得して、問題のトラブルシューティングに役立ちます。さらに、HAProxy には、ロード バランサーのリアルタイムのパフォーマンス分析を取得できる統計ページがあります。
  3. ヘルスチェック – サーバーであっても、ステータスを確認するためにヘルスチェックが必要です。 HAProxy はサーバーの信頼性を高めるために、サーバーのステータスを知るためにヘルスチェックを頻繁に実行します。異常なサーバーが検出されると、トラフィックが別のサーバーに再ルーティングされます。
  4. リバースプロキシ – セキュリティを強化する 1 つの方法は、内部構造を隠すことです。幸いなことに、HAProxy を使用すると、クライアントからトラフィックを受信し、それらを適切なサーバーにルーティングできます。そうすることで、内部構造がハッカーの目から隠されます。
  5. ACL (アクセス制御リスト) – HAProxy を使用すると、パス、ヘッダー、IP アドレスなどのさまざまな基準を使用して、トラフィック ルーティングがどのように行われるかを定義できます。したがって、トラフィックのカスタム ルーティング ロジックの定義が簡単になります。
  6. SSL 終了 – デフォルトでは、SSL/TLS はバックエンド サーバーによってオフロードされるため、パフォーマンスが低下します。ただし、HAProxy を使用すると、SSL/TLS 終了がロード バランサーで行われ、バックエンド サーバーのタスクがオフロードされます。

HAProxy のインストール

ここまで、HAProxy とは何かを定義し、アプリケーションに HAProxy が必要な理由を理解するために、HAProxy が提供する機能について説明しました。次のステップは、システムにインストールして開始する方法を理解することです。



Ubuntu または Debian システムを実行している場合は、APT パッケージ マネージャーから HAProxy をインストールできます。次のコマンドを実行します。



$ sudo aptアップデート
$ sudo apt install haproxy

同様に、RHEL ベースのシステムまたは CentOS を使用している場合は、「yum」パッケージ マネージャーから HAProxy を利用できます。次のコマンドを実行します。





$ sudo yum アップデート
$ sudo yum install haproxy

私たちの場合は、Ubuntu を使用しています。したがって、次のようなコマンドがあります。



次に、そのバージョンをチェックして、HAProxy が正常にインストールされたことを確認できます。

$ haproxy --バージョン

HAProxy を構成する方法

HAProxy がインストールされていると、その構成ファイル ( / etc/haproxy/haproxy.cfg) を参照し、ロード バランサーに使用する設定を定義します。

nano や vim などのエディタを使用して構成ファイルを開きます。

$ sudo nano /etc/haproxy/haproxy.cfg

次のような構成ファイルを取得します。

構成ファイルを見ると、次の 2 つの主要セクションが含まれていることがわかります。

  1. グローバル - これはファイルの最初のセクションであり、その値は変更しないでください。これには、HAProxy の動作方法を定義するプロセス設定が含まれています。たとえば、ログの詳細と、HAProxy 機能を実行できるグループまたはユーザーを定義します。この構成ファイルではグローバル セクションを 1 つだけ持つことができ、その値は変更しないでください。
  1. デフォルト – このセクションには、ノードのデフォルト値が含まれています。たとえば、このセクションでは HAProxy のタイムアウトや動作モードを追加できます。さらに、HAProxy 構成ファイルに多数のデフォルト セクションを含めることができます。

「デフォルト」セクションの例を次に示します。

指定されたイメージでは、モードは HAProxy が受信リクエストをどのように処理するかを定義します。モードを HTTP または TCP に設定できます。タイムアウトに関しては、HAProxy が待機する時間を指定します。たとえば、タイムアウト接続は、バックエンド接続が確立されるまでの待機時間です。クライアントのタイムアウトは、クライアントがデータを送信するまで HAProxy が待機する時間です。タイムアウト サーバーは、適切なサーバーがクライアントに転送されるデータを送信するまで待機する時間です。デフォルト値をどのように定義するかは、アプリケーションの応答時間を向上させる上で非常に重要です。

ロード バランサが期待どおりに動作するためには、さらに 3 つのセクションを定義する必要があります。

  1. フロントエンド - このセクションには、クライアントが接続を確立するために使用する IP アドレスが含まれています。
  2. バックエンド – フロントエンドセクションで定義されたリクエストを処理するサーバープールが表示されます。
  3. 聞く - 特定のサーバーグループをルーティングしたい場合に連続して使用します。このセクションでは、フロントエンドとバックエンドのタスクを組み合わせます。

例を見てみましょう

この例では、特定のポートを持つローカルホストを使用するようにフロントエンドを定義します。次に、ローカルホストを実行するバックエンドにバインドし、Python サーバーを実行して、負荷分散がすべて期待どおりに機能するかどうかをテストします。指定された手順に従ってください。

ステップ 1: デフォルトセクションの構成

「デフォルト」セクションでは、ノード間で共有される値を設定します。この例では、モードを HTTP に設定し、クライアントとサーバーのタイムアウトを設定します。ニーズに合わせて時間を調整できます。

これらすべての編集は、「/etc/haproxy/haproxy.cfg」にある HAProxy 設定にあることに注意してください。デフォルトセクションを設定したら、フロントエンドを定義しましょう。

ステップ 2: フロントエンドセクションの構成

フロントエンド セクションでは、クライアントがオンラインでアプリケーションまたは Web サイトにアクセスする方法を定義します。アプリケーションの IP アドレスを指定します。ただし、この場合はローカルホストを使用します。したがって、IP アドレスはフォールバック アドレス 127.0.0.1 であり、ポート 80 経由の接続を受け入れたいと考えています。

指定したポート上の IP アドレスのリスナーとして機能する「bind」キーワードを追加する必要があります。定義した IP アドレスとポートは、ロード バランサーが受信リクエストを受け入れるために使用します。

構成ファイルに前の行を追加した後、次のコマンドを使用して「haproxy.service」を再起動する必要があります。

$ sudo systemctl 再起動 haproxy

この時点で、「curl」コマンドを使用してリクエストを Web サイトに送信してみることができます。コマンドを実行し、ターゲット IP アドレスを追加します。

$curl

HAProxy のバックエンドがどのようになるかをまだ定義していないため、次のような 503 エラーが発生します。ロード バランサーはリクエストを受信できましたが、現在それを処理できるサーバーがないため、エラーが発生します。

ステップ 3: バックエンドの構成

バックエンド セクションでは、受信リクエストを処理するサーバーを定義します。ロード バランサーは、このセクションを参照して、サーバーが過負荷にならないように受信リクエストをどのように分散するかを判断します。

以前に発生した 503 エラーは、リクエストを処理するバックエンドがなかったためです。まず、リクエストを処理するための「default_backend」を定義します。フロントエンドセクションで定義します。このケースでは、「linux_backend」という名前を付けました。

次に、フロントエンド セクションで定義したものと同じ名前のバックエンド セクションを作成します。次に、「server」キーワードの後に​​サーバー名とその IP アドレスを使用する必要があります。次の図は、IP 127.0.0.1 とポート 8001 を使用して「linuxhint1」サーバーを定義したことを示しています。

バックエンド サーバーのプールを作成することもできますが、この場合は 1 つだけを定義しました。必ずファイルを保存してください。 HAProxy サービスを再度再起動する必要があります。

作成した HAProxy ロード バランサーをテストするには、Python3 を使用して Web サーバーを作成し、指定した IP アドレスを使用してバックエンド ポートをバインドします。次のようにコマンドを実行します。

$ python3 -m http.server 8001 --bind 127.0.0.1

IP アドレスとバインドするポートに一致するように値を置き換えてください。 Web サーバーがどのように作成され、受信リクエストをリッスンするかに注目してください。

別の端末で「curl」コマンドを使用してサーバーにリクエストを送信してみましょう。

$curl

以前にリクエストを処理できるサーバーが存在しないことを示す 503 エラーが表示されたのとは異なり、今回は HAProxy ロード バランサが動作していることを確認する出力が表示されます。

Web サーバーを作成した前のターミナルに戻ると、成功出力 200 が表示されます。これは、HAProxy がリクエストを受信し、バックエンド セクションで定義されたサーバーにリクエストを送信して処理したことを確認します。

これが、Web サイトまたはアプリケーションに単純な HAProxy を設定する方法です。

ルールの操作

この初心者向け HAProxy チュートリアルを終える前に、ロード バランサーによるリクエストの処理方法をガイドするルールを定義する方法について簡単に説明しましょう。

前と同じ手順に従って、デフォルトのセクションをそのままにして、フロントエンド セクションで別の IP アドレスを定義しましょう。同じ IP アドレスをバインドしますが、異なるポートからの接続を受け入れます。

さらに、「default_backend」と別の「use_backend」があります。これは、リクエストの送信元ポートに応じて使用するサーバーの異なるプールです。次の構成では、ポート 81 経由のすべてのリクエストが「Linux2_backend」のサーバーによって処理されます。他のリクエストはすべて「default_backend」によって処理されます。

次に、フロントエンドでの定義に従ってバックエンド セクションを作成します。バックエンドごとに、リクエストの処理に使用するように指定した異なるサーバーがあることに注意してください。

HAProxy サービスをすぐに再起動します。

Python3 を使用して Web サーバーを作成し、代替バックエンド サーバーであるポート 8002 にリクエストをバインドしましょう。

リクエストを送信するときは、ポートを 81 に指定して、ロード バランサーがデフォルトではない代替サーバーにリクエストを送信するようにトリガーします。

Web サーバーを再確認すると、リクエストの受信と処理に成功し、200 (成功) 応答が返されていることがわかります。

これにより、ロード バランサーがリクエストを受信して​​処理する方法をガイドするルールを定義できます。

結論

HAProxy は、TCP/HTTP アプリケーションの負荷分散に最適なソリューションです。インストールしたら、構成ファイルを簡単に編集してデフォルト、フロントエンド、バックエンドのセクションを定義し、ロード バランサーがどのように動作するかをガイドできます。この投稿は HAProxy の初心者向けガイドです。それは、HAProxy とその機能を定義することから始まりました。次に、HAProxy の構成方法を詳しく説明し、HAProxy をロード バランサーとして使用する方法の例を示して終了しました。