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

ウェブアプリケーションの可用性、拡張性、および高性能を確保するために、サーバークラスタリングや負荷分散など、冗長性を導入する技術の実装が一般的になっています。たとえば、同じアプリケーションを実行する複数のサーバーのクラスターを設定し、それらの前に負荷分散器を展開してトラフィックを分散することがあります。

HAProxyは、非常に高いトラフィックのウェブサイト向けに構築された、オープンソースで強力で高性能、信頼性の高いセキュアなハイアベイラビリティのTCP/HTTP負荷分散器、プロキシサーバー、SSL/TLSターミネーターです。それはLinuxSolarisFreeBSDOpenBSD、およびAIXオペレーティングシステム上で信頼性高く実行されます。

このガイドでは、HAProxyを使用してCentOS 8上に専用の高可用性負荷分散器を設定し、NGINXウェブサーバーのクラスター内のトラフィックを制御する方法について説明します。また、HAProxySSL/TLSの終了を構成する方法も示します。

前提条件:

A total of 4 servers with minimal CentOS 8 installation.

テスト環境のセットアップ

----------- 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:クライアントマシンにNginx HTTPサーバーを設定する

1.すべてのCentOS 8クライアントマシンにログインし、Nginxウェブサーバーをdnfパッケージマネージャーを使用してインストールします。

# dnf install Nginx

2. 次に、現時点でNginxサービスを開始し、システムの起動時に自動的に開始するように設定し、その状態を確認するためにsystemctlコマンドを使用して状態を確認します(これをすべてのクライアントマシンで実行します)。

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

3. また、すべてのクライアントマシンでfirewalldサービスが実行されている場合(systemctl start firewalldを実行して確認できます)、ファイアウォール構成にHTTPおよびHTTPSサービスを追加して、負荷分散装置からNginxウェブサーバーに対するリクエストがファイアウォールを通過するようにします。その後、新しい変更を反映するためにfirewalldサービスをリロードします(これをすべてのクライアントマシンで実行します)。

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

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

Test Nginx Installation on All CentOS 8 Client Machines

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:CentOS 8にHAProxyサーバーをインストールして構成します

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

# dnf install haproxy

7. 次に、HAProxy サービスを起動し、システムの起動時に自動的に起動するように設定し、その状態を確認します。

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
Verify HAProxy Status in CentOS 8

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

# vi /etc/haproxy/haproxy.cfg

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

  • global settings – プロセス全体のパラメータを設定します。
  • defaults – このセクションは、その宣言に続くすべての他のセクションのデフォルトパラメータを設定します。
  • frontend – このセクションは、クライアント接続を受け入れるリスニングソケットのセットを記述します。
  • Backend – このセクションは、プロキシが転送される着信接続先のサーバーのセットを記述します。

global settingsdefaults のオプションを理解するには、HAProxy のドキュメントを参照してください(記事の最後にリンクが提供されています)。このガイドでは、デフォルトを使用します。

HAProxy ロギングの設定

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

ログパラメーター(以下のスクリーンショットで強調表示されています)は、ローカルなSyslogサーバー(たとえばCentOSのデフォルトであるrsyslog)を宣言し、ログメッセージを受信することができます。ここには複数のサーバーを宣言できます。

デフォルトの設定は、localhost127.0.0.1)を指し示し、local2rsyslogでHAProxyログメッセージを識別するために使用されるデフォルトのファシリティコードです。

HAProxy Default Log Parameter

10.次に、rsyslogサーバーにHAProxyログメッセージを受信および処理する方法を指示する必要があります。rsyslog構成ファイルを開いてください:/etc/rsyslog.conf、または/etc/rsyslog.dディレクトリ内に新しいファイルを作成してください。たとえば、/etc/rsyslog.d/haproxy.confです。

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

以下の構成をコピーしてUDPを使用してデフォルトポート514でログを収集するように設定してください。

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

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

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

11.ファイルを保存して閉じてください。その後、最近の変更を適用するためにrsyslogサービスを再起動してください。

# systemctl restart rsyslog

HAProxyフロントエンドとバックエンドの構成

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

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

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

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

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:Lostp@1ss

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

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

その後、http-request set-header設定が使用されて、リクエストにHTTPヘッダーが追加されます。これにより、Nginxに初期リクエストがHTTP(またはポート80経由で)で行われたことが通知されます。

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

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

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.次に、balance設定がバックエンドサーバーを選択する方法を定義するバックエンドセクションを定義する必要があります。持続性の方法がその選択を上書きしない場合、HAProxyがリクエストを処理するためにバックエンドサーバーを選択します。

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

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

重要なオプションの1つは、checkで、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

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

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

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

http://10.42.0.247:9000/stats

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

HAProxy Stats Login Page

ログインに成功すると、HAProxy 統計ページに移動します。このページでは、サーバーの健康状態、現在のリクエストレート、応答時間などをカバーするメトリクスが表示されます。

色コードの動作を示すために、バックエンドサーバーの1つを設定しました。

HAProxy Statistics Report

ステップ4: セルフサインドSSL証明書を使用してHAProxyでHTTPSを構成する

20. 最後のセクションでは、SSL/TLS を構成して、HAProxyサーバーとクライアント間のすべての通信をセキュリティで保護する方法を示します。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
Create SSL for HAProxy

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
Configure HAProxy Front-end with SSL

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

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

# systemctl restart haproxy.service

23. 次に、ウェブブラウザを開いてサイトに再アクセスしてみてください。セルフサインド証明書のためにエラーが表示されますが、進むには詳細 をクリックしてください。

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

それでは、これで終わりです!すべてのウェブアプリケーションには独自の要件があります。ITインフラストラクチャとアプリケーションの要件に合わせてロードバランシングを設計および構成する必要があります。

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

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/