CentOS8でNginxのロードバランサーとしてHAProxyを設定する方法


Webアプリケーションの可用性、スケーラビリティ、および高性能を最大限に確保するために、サーバークラスタリングや負荷分散など、冗長性を導入するテクノロジを実装することが一般的になっています。たとえば、すべて同じアプリケーションを実行するサーバーのクラスターをセットアップし、それらの前にロードバランサーを展開してトラフィックを分散します。

HAProxyは、非常にトラフィックの多いWebサイト用に構築された、オープンソース、強力、高性能、信頼性、安全性、および広く使用されている高可用性TCP/HTTPロードバランサー、プロキシサーバー、SSL/TLSターミネーターです。 Linux、Solaris、FreeBSD、OpenBSD、およびAIXオペレーティングシステムで確実に動作します。

このガイドでは、CentOS 8でHAProxyを使用して専用の高可用性ロードバランサーをセットアップし、NGINXWebサーバーのクラスター内のトラフィックを制御する方法を示します。また、HAProxyでSSL/TLSターミネーションを設定する方法も示します。

CentOS8のインストールが最小限の合計4台のサーバー。

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

ステップ1:クライアントマシンでのNginxHTTPサーバーのセットアップ

1.すべてのCentOS8クライアントマシンにログインし、図のようにdnfパッケージマネージャーを使用してNginxWebサーバーをインストールします。

# dnf install Nginx

2.次に、Nginxサービスを開始します。今のところ、システムの起動時に自動的に開始できるようにし、systemctlコマンドを使用してステータスを確認して実行中であることを確認します(すべてのクライアントマシンでこれを実行します)。

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3.また、firewalldサービスがすべてのクライアントマシンで実行されている場合(systemctl start Firewalldを実行して確認できます)、ロードバランサーからのリクエストがファイアウォールを通過できるように、ファイアウォール構成にHTTPサービスとHTTPSサービスを追加する必要があります。 NginxWebサーバーに。次に、firewalldサービスをリロードして、新しい変更を有効にします(すべてのクライアントマシンでこれを実行します)。

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4.次に、ローカルマシンでWebブラウザーを開き、Nginxのインストールが正常に機能しているかどうかをテストします。クライアントIPを使用してナビゲートします。Nginxテストページが表示されたら、クライアントマシンにインストールされているWebサーバーが正常に機能していることを意味します。

5.次に、後でHAProxyセットアップをテストするために使用するクライアントマシン上にテストページを作成する必要があります。

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

ステップ2:CentOS8へのHAProxyサーバーのインストールと構成

6.次のコマンドを実行して、HAProxyサーバーにHAProxyパッケージをインストールします。

# dnf install haproxy

7.次に、HAProxyサービスを開始し、システムの起動時に自動開始できるようにして、ステータスを確認します。

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy

8.次に、次の構成ファイルを使用してHAProxyを構成します。

# vi /etc/haproxy/haproxy.cfg

構成ファイルは、4つの主要なセクションに分かれています。

  • global settings – sets process-wide parameters.
  • defaults – this section sets default parameters for all other sections following its declaration.
  • frontend – this section describes a set of listening sockets accepting client connections.
  • Backend – this section describes a set of servers to which the proxy will connect to forward incoming connections.

グローバル設定とデフォルトのオプションを理解するには、HAProxyのドキュメント(記事の最後にあるリンク)をお読みください。このガイドでは、デフォルトを使用します。

9. HAProxyは、一度展開されるとITインフラストラクチャで重要な役割を果たします。したがって、HAProxyのロギングを構成することが基本的な要件です。これにより、バックエンドWebサーバーへの各接続に関する洞察を得ることができます。

ログパラメータ(次のスクリーンショットで強調表示)は、ログメッセージを受信するグローバルSyslogサーバー(CentOSのデフォルトのrsyslogなど)を宣言します。ここで複数のサーバーを宣言できます。

デフォルト設定はローカルホスト(127.0.0.1)を指し、local2はrsyslogの下でHAProxyログメッセージを識別するために使用されるデフォルトのファシリティコードです。

10.次に、HAProxyログメッセージを受信して処理する方法をrsyslogサーバーに指示する必要があります。 rsyslog構成ファイルを/etc/rsyslog.confに開くか、/ etc /rsyslog.dディレクトリ内に/etc/rsyslog.d/haproxy.confなどの新しいファイルを作成します。

# vi /etc/rsyslog.d/haproxy.conf

次の構成をコピーして貼り付け、デフォルトのポート514でUDPを使用してログを収集します。

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

また、これらの行を追加して、重大度に基づいて2つの別々のログファイルに書き込むようにrsyslogに指示します。ここで、local2は、上記のHAProxy構成で定義されたファシリティコードです。

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11.ファイルを保存して閉じます。次に、rsyslogサービスを再起動して、最近の変更を適用します。

# systemctl restart rsyslog

12.このセクションでは、フロントエンドプロキシとバックエンドプロキシを構成する方法を示します。 HAProxy構成ファイルに戻り、デフォルトのフロントエンドセクションとバックエンドセクションを次のように変更します。各パラメータの詳細な説明は行いません。いつでも公式ドキュメントを参照できます。

次の設定は、HAProxyStatsページを提供するために使用されるlistenセクションを定義します。 bindパラメーターは、リスナーを特定のIPアドレス(この場合はすべて * )とポート(9000)に割り当てます。

stats enable設定は、URI/stats(つまり、 http:// server_ip:9000/stats )を使用してアクセスされる統計ページを有効にします。

stats auth設定は、ページにアクセスするときに基本認証を追加するために使用されます(haproxyと[メールで保護]を任意のユーザー名とパスワードに置き換えます)。

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:[email protected]

13.次の構成では、TLと呼ばれるフロントエンドセクションを定義します(好みの名前を付けることができます)。 modeパラメータは、HAProxyが動作するモードを定義します。

acl(アクセス制御リスト)パラメーターは、要求から抽出されたコンテンツに基づいて決定を下すために使用されます。この例では、SSLを介して行われていない場合、リクエストはプレーンHTTPと見なされます。

次に、http-request set-header設定を使用して、HTTPヘッダーをリクエストに追加します。これは、最初のリクエストがHTTP経由(またはポート80経由)で行われたことをNginxに通知するのに役立ちます。

default_backendまたはuse_backendディレクティブは、バックエンドサーバーを定義します。この場合、TL_web_serversによって参照されます。

リクエストがuse_backendまたはdefault_backendディレクティブによってルーティングされない場合、HAProxyは「503ServiceUnavailableエラー」を返すことに注意してください。

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14.次に、バックエンドセクションを定義する必要があります。ここで、バランス設定は、永続化メソッドがその選択をオーバーライドしない場合に、HAProxyがリクエストを処理するためにバックエンドサーバーを選択する方法を定義します。

cookieディレクティブは、cookieベースの永続性を有効にし、SERVERIDという名前のcookieをクライアントに送信し、それを最初の応答を提供したサーバーのIDに関連付けるようにHAProxyに指示します。

serverディレクティブは、sever_name(websrv1など)、server_IP:port、およびoptionsの形式でアップストリームサーバーを定義するために使用されます。

重要なオプションの1つは、サーバーの可用性をチェックし続け、統計ページでレポートするようにHAProxyに指示するチェックです。

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

次のスクリーンショットに示すように、他のフロントエンドセクションとバックエンドセクションをコメントアウトします。ファイルを保存して閉じます。

15.次に、HAProxyサービスを再起動して、新しい変更を適用します。

# systemctl restart haproxy

16.次に、HTTP(ポート80)およびHTTPS(ポート433)サービスがファイアウォールで開かれていることを確認して、次のようにクライアント要求を受け入れます。また、統計ページにアクセスするためにファイアウォールでポート9000を開き、ファイアウォール設定を再ロードします。

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

ステップ3:HAProxyセットアップのテストと統計の表示

17.次に、HAPrxoyのセットアップをテストします。すべてのサーバーにアクセスしているローカルデスクトップマシンで、/ etc/hostsファイルに次の行を追加して、ダミーサイトドメインを使用できるようにします。

10.42.0.247  www.tecmint.lan

18.次に、ブラウザを開き、サーバーアドレスまたはサイトドメインのいずれかを使用してナビゲートします。

http://10.42.0.247/
OR
http://www.tecmint.lan/

19. HAProxy統計ページにアクセスするには、次のアドレスを使用します。

http://10.42.0.247:9000/stats

次に、HAProxy構成ファイルで定義したユーザー名とパスワードを使用します(stats authパラメーターを参照)。

ログインに成功すると、HAProxy統計ページが表示され、サーバーの状態、現在の要求率、応答時間などをカバーするメトリックが表示されます。

カラーコードの動作に関するステータスレポートの動作を示すために、バックエンドサーバーの1つを配置しました。

ステップ4:自己署名SSL証明書を使用してHAProxyでHTTPSを構成する

20.この最後のセクションでは、HAProxyサーバーとクライアント間のすべての通信を保護するようにSSL/TLSを構成する方法を示します。 HAProxyは4つの主要なHTTPS構成モードをサポートしていますが、このガイドでは、SSL/TLSオフロードを使用します。

SSL/TLSオフロードモードでは、HAProxyはクライアント側のトラフィックを解読し、クリアトラフィックでバックエンドサーバーに接続します。

図のように証明書とキーを作成することから始めます(スクリーンショットで強調表示されているように、証明書の作成中に会社の詳細に基づいて質問に答えます)。

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l

21.次に、HAProxy構成ファイル(/etc/haproxy/haproxy.cfg)を開き、フロントエンドセクションを編集します。

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers

ファイルを保存して閉じます。

22.次に、HAProxyサービスを再起動して、新しい変更を適用します。

# systemctl restart haproxy.service

23.次に、Webブラウザーを開いて、もう一度サイトにアクセスしてみます。自己署名証明書が原因でブラウザにエラーが表示されます。[詳細設定]をクリックして続行します。

それは今のところすべてです!すべてのWebアプリケーションには独自の要件があり、ITインフラストラクチャとアプリケーションの要件に合わせて負荷分散を設計および構成する必要があります。

このガイドで使用されているいくつかの構成オプション、および一般的なHAProxyの使用方法について詳しくは、HAProxyコミュニティエディションの公式ドキュメントまたはHAProxyエンタープライズバージョンのドキュメントを参照してください。以下のフィードバックフォームから質問や考えを投稿できます。