How To Configure HAProxy Logging with Rsyslog on CentOS 8 [Quickstart]

Introduction

HAProxy は High Availability Proxy を意味し、Linux や Solaris および FreeBSD で動作する TCP および HTTP ベースのプロキシサーバーとして広く使用されています。 複数のサーバー間で要求を分散することにより、アプリケーションの負荷分散に使用され、アプリケーションがユーザーにとって高可用であることを保証します。

多くの CentOS 8 インストールのデフォルトでは、HAProxy はファイルにそのログ出力を書き込むように構成されていません。 このクイックスタート チュートリアルでは、信頼性、速度、およびセキュリティのために、Unix ドメイン ソケットを使用して Rsyslog で HAProxy ログを構成する方法について説明します。 このサーバーには、管理者権限を持つ非 root ユーザーが必要です。

Step 1 – Installing and Enabling HAProxy

HAProxyをインストールするには、次のdnfコマンドを実行します:

  • sudo dnf install haproxy

Ind you are prompt Is this ok : enter y and press RETURN to install the package.インストールするには、

Step 2 – HAProxyをインストールするには、最初のステップを実行します。

HAProxyをインストールしたら、systemctlコマンドで有効にして起動します:

  • sudo systemctl enable haproxy.service

以下の出力が表示されるはずです。

Output
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

これで HAProxy サービスが有効になったので、それを起動して、サーバー上のデフォルト構成で動作することを確認できます:

  • sudo systemctl start haproxy.service

次に HAProxy の状態を調べて、それが実行されていることを確認します:

  • sudo systemctl status haproxy.service

以下のような出力があることを確認してください。 出力のハイライトされた active (running) 部分に注意してください。

Output
● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS) Main PID: 21341 (haproxy) Tasks: 2 (limit: 2881) Memory: 2.7M CGroup: /system.slice/haproxy.service ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid. . .

出力が異なる場合、またはステータスが Active: failed のように表示される場合は、「How to Troubleshoot Common HAProxy Errors」のトラブルシューティング手順に従い、HAProxy が正しく開始できない原因を特定する必要があります。

HAProxyが有効で実行されていることを確認したら、次のステップ、つまりHAProxyのロギングディレクティブを設定することに進むことができます。

Step 2 – Configuring HAProxy Logging Directives

HAProxy のロギングディレクティブを設定するには、/etc/haproxy/haproxy.cfgvi またはお好みのエディタで開いてください。

  • sudo vi /etc/haproxy/haproxy.cfg

i を押して INSERT モードに切り替え、log 127.0.0.1 local2 行を見つけ、次の例で強調されているように、行頭に # 文字を追加してコメントアウトします:

/etc/haproxy/haproxy.Logging ディレクティブを設定するには、次のようにします。cfg
. . .# 2) configure local2 events to go to the /var/log/haproxy.log# file. A line like the following can be added to# /etc/sysconfig/syslog## local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .

次に、コメントアウトした行の直後に、次の内容の行を追加します:

 log /dev/log local0

編集した /etc/haproxy/haproxy.cfg のセクション全体は、次の行を含む必要があります:

/etc/haproxy/haproxy.cfg/etc/haproxy/haproxy.cfg/etc_haproxy/haproxy.cfg

/etc/haproxy.cfg

/etc/haproxy.cfg

. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .

chroot 行は、HAProxy プロセスが /var/lib/haproxy ディレクトリ内のファイルにのみアクセスするよう制限するため、重要な行となります。 log /dev/log local0 行は、Rsyslog がログエントリを収集するために使用するファイルをそのディレクトリ内に作成します。

/etc/haproxy/haproxy.cfglog 行の編集が終わったら、ESC を押し、:wq と入力して ENTER でファイルを保存して閉じます。

このセクションで完了する必要がある最後のステップは、デフォルトでは存在しないため、/var/lib/haproxy/dev ディレクトリを作成することです。

mkdirコマンドを使用してディレクトリを作成し、HAProxy を再起動します:

  • sudo mkdir /var/lib/haproxy/dev
  • sudo systemctl restart haproxy.service

これで、/var/lib/haproxy/dev/log にある Unix ドメインソケットにそのログを送信する HAProxy が設定されました。 次のステップでは、ソケットを作成してアクセスするように Rsyslog を設定します。

Step 3 – Configuring Rsyslog to Collect HAProxy Logs

Rsyslog’s default configuration on CentOS 8 does not handle HAProxy logs.Rsyslog は、HAProxy のログを処理しません。 HAProxy サービスからログを収集するには、vi またはお好みのエディタを使用して新しいファイル /etc/rsyslog.d/99-haproxy.conf を開きます。

  • sudo vi /etc/rsyslog.d/99-haproxy.conf

i を押して INSERT モードに切り替え、次の行をファイルに貼り付けます:

/etc/rsyslog.d/99-haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}

$AddUnixListenSocket指示は、指定された場所、この場合は/var/lib/haproxy/dev/logにUnixドメインソケットを作成するようRsyslogに指示します。 :programname, startswith, "haproxy" セクションは、Rsyslogがソケットから収集したログエントリを書き込むファイルを指定します。

/etc/rsyslog.d/99-haproxy.confの編集を終えたら、ESCを押してファイルを保存して閉じ、:wqと入力してENTERを押します。

これで、/var/lib/haproxy/dev/logのUnixドメインソケットからログエントリを読み取り、/var/log/haproxy.logにログファイルへ書き込むためのRsyslogが構成されました。

ただし、Rsyslog を再起動する前に、SELinux が CentOS 8 システムでアクセス制御を実施しているかどうかを判断する必要があります。

SELinuxの現在のポリシーを確認するには、以下を実行します。

  • getenforce

以下のいずれかの出力を受け取ります。

  • Permissive – この場合、SELinux はすべてのアクセスの試みをログファイルに記録しますが、システム上でアクセス制御を実施しません。
  • Disabled – SELinux が無効になっている場合、システム上でアクセス制御ポリシーを記録または実施しません。
  • getenforceコマンドがPermissiveまたはDisabledを返した場合、次のコマンドでRsyslogを再起動できます:

    • sudo systemctl restart rsyslog

    Rsyslogを再起動すると、/etc/rsyslog.d/99-haproxy.confで設定した/var/log/haproxy.logファイルのログを表示することができるようになります。 ステップ5 – HAProxyロギングのテスト」に進み、すべてが期待通りに動作していることを確認してください。

    その他、システムがEnforcingモードでSELinuxを実行している場合、このチュートリアルの次のセクションでは、RsyslogとHAProxyが共有Unixドメインソケットを介して互いに通信できるようモジュールを追加する方法について説明します。

    Step 4 – (オプション) SELinux の設定

    お使いの CentOS 8 システムが Enforcing モードの SELinux で構成されている場合、Rsyslog が HAProxy の chroot ディレクトリにアクセスすることを許可する必要があります。 このアクセスを許可すると、RsyslogがHAproxyがログを送信するUnixドメインソケットを作成します。

    SELinuxに精通していない場合、このチュートリアルシリーズAn Introduction to SELinux on CentOS 7は、SELinuxの管理および操作方法を学習するのに役立ちます。

    RsyslogおよびHAProxyの共有ソケットへのアクセスを有効にするには、最初のタスクとして、Type Enforcementポリシー ファイルを作成します。 vi またはお好みのエディタで rsyslog-haproxy.te という名前の新しいファイルを開きます。

    • vi rsyslog-haproxy.te

    i を押して INSERT モードに切り替え、次の行をファイルに貼り付けます:

    rsyslog-haproxy.te
    module rsyslog-haproxy 1.0;require { type syslogd_t; type haproxy_var_lib_t; class dir { add_name remove_name search write }; class sock_file { create setattr unlink };}#============= syslogd_t ==============allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };

    最初の行はモジュール名とバージョンで定義します。 requireの部分は、SELinux モジュールローダーに、モジュールとして読み込まれるポリシーに必要な型とクラスについて知らせます。 最後の2行は、それぞれHAProxyのchrootとソケットファイルへのRsyslogアクセスを許可するルールです。

    ファイルの編集が終わったら、ESCを押し、:wqと入力し、ENTERを押して保存し、ファイルを閉じます。checkmodule ユーティリティーが含まれています。 次のように実行して Type Enforcement ファイルを SELinux モジュールにコンパイルします:

    • checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod

    次に、semodule_package を実行して SELinux が Linux カーネルにロードできる完全なポリシーパッケージを生成します:

    • semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod

    最後の手順は、semodule コマンドを使って生成したパッケージを Linux カーネルにロードします:

    • sudo semodule -i rsyslog-haproxy.pp

    モジュールを追加すると数秒かかる可能性があります。

    • sudo semodule -l |grep rsyslog-haproxy

    以下のような出力が得られるはずです:

    Output
    rsyslog-haproxy

    モジュールがロードされたら、次のコマンドで Rsyslog を再起動できます:

    • sudo systemctl restart rsyslog

    これで、HAProxy と Rsyslog が共有ソケットを介して通信できるよう SELinux ポリシーの定義、コンパイルおよびロードが完了しました。

    次のステップでは、HAProxy に HTTP リクエストを行い、その新しいログ ファイルを調べることで、すべてが機能することをテストします。

    Step 5 – Testing HAProxy Logging

    これで、HAProxy、Rsyslog、およびオプションで SELinux を設定したので、/var/log/haproxy.log へのログ記録が機能しているかテストできます。

    デフォルトでは、ポート 5000 に HTTP リスナーソケットを作成する設定ファイルが haproxy パッケージには同梱されています。 この構成は存在しないバックエンドサーバを指すため、このポートへのいかなるリクエストも HTTP 503 エラーになります。

    /var/log/haproxy.log ファイルで 503 エラーを確認するには、まず curl を使用して次のような HTTP リクエストを生成します:

    • curl -si http://127.0.0.1:5000

    次に grep コマンドで /var/log/haproxy.log に HTTP 503 の応答があるかどうか調べます:

    • sudo grep -E 'NOSRV.+503' /var/log/haproxy.log

    注意: コマンドの NOSRV.+503 部分は、正規表現です。 このチュートリアル「Using Grep & Regular Expressions to Search for Text Patterns in Linux
    」では、grep と正規表現の使用についてより深く掘り下げて説明しています。

    次のような行 (または複数の行) を受け取るはずです。

    Output
    Sep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy: 127.0.0.1:56024 main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

    この行は、あなたが行った curl 要求に対応しており、Rsyslog と HAProxy が共有ソケットを正しく使用するように設定されたことを意味します。

    まとめ

    このクイックスタートチュートリアルでは、Unixドメインソケットに記録するようにHAProxyを設定しました。 また、2 つのプログラムがシステム上で TCP/IP ポートを開くことなく互いに通信できるように、ソケットを作成し、そこから読み取るために Rsyslog を設定しました。 最後に、Rsyslog と HAProxy がソケットに共有アクセスできるように SELinux ポリシーをオプションでコンパイル、パッケージ、およびロードしました

    コメントを残す

    メールアドレスが公開されることはありません。