序章

高可用性プロキシの略であるHAProxyは、Linux、Solaris、およびFreeBSDで実行される広く使用されているTCPおよびHTTPベースのプロキシサーバーです。 これは、複数のサーバー間で要求を分散することによってアプリケーションの負荷を分散し、ユーザーがアプリケーションを高可用性で利用できるようにするために使用されます。

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

前提条件

このチュートリアルを完了するには、RockyLinux8を実行しているサーバーが必要です。 このサーバーには、管理者権限を持つroot以外のユーザーが必要です。 これを設定するには、 Rocky Linux8チュートリアルの初期サーバー設定ガイドに従ってください。

このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルでHAProxyとrsyslogのロギングを試すこともできます。 次のインタラクティブターミナルを起動します!ボタンをクリックして開始します。

ステップ1—HAProxyのインストールと有効化

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

  1. sudo dnf install haproxy

Is this ok [y/N]:のプロンプトが表示されたら、yと入力し、RETURNを押してパッケージをインストールします。

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

  1. sudo systemctl enable haproxy.service

次の出力が表示されます。

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

HAProxyサービスが有効になったら、HAProxyサービスを起動して、サーバーでデフォルトの構成で実行されるようにすることができます。

  1. sudo systemctl start haproxy.service

次に、HAProxyのステータスを調べて、実行されていることを確認します。

  1. sudo systemctl status haproxy.service

次のような出力が表示されます。 出力の強調表示されたactive (running)部分に注意してください。 サーバーに同じ強調表示されたセクションが表示されている場合、HAProxyはサーバー上で正しく実行されており、ロギングの構成を続行できます。

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のように表示される場合は、一般的なHAProxyエラーのトラブルシューティング方法チュートリアルのトラブルシューティング手順に従って、HAProxyが正しく起動しない原因を特定してください。

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

ステップ2—HAProxyロギングディレクティブの設定

HAProxyのロギングディレクティブを設定するには、viまたはお好みのエディタで/etc/haproxy/haproxy.cfgを開きます。

  1. sudo vi /etc/haproxy/haproxy.cfg

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

/etc/haproxy/haproxy.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
. . .
#    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を再起動します。

  1. sudo mkdir /var/lib/haproxy/dev
  2. sudo systemctl restart haproxy.service

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

ステップ3—HAProxyログを収集するためのRsyslogの設定

Rocky Linux 8でのRsyslogのデフォルト構成は、HAProxyログを処理しません。 HAProxyサービスからログを収集するには、viまたはお好みのエディターを使用して新しいファイル/etc/rsyslog.d/99-haproxy.confを開きます。

  1. 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がRockyLinux8システムでアクセス制御を実施しているかどうかを確認する必要があります。

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

  1. getenforce

次の出力の1つを受け取ります。

  • Enforcing-このモードでは、SELinuxはシステムにアクセス制御を適用しています。 次のオプションのステップ4—SELinuxセクションの設定を完了する必要があります。
  • Permissive-この場合、SELinuxはすべてのアクセス試行をログファイルに記録しますが、システムにアクセス制御を強制しません。
  • Disabled-SELinuxが無効になっている場合、システムにアクセス制御ポリシーを記録または適用していません。

getenforceコマンドがPermissiveまたはDisabledのいずれかを返した場合は、次のコマンドを使用してRsyslogを再起動できます。

  1. sudo systemctl restart rsyslog

Rsyslogを再起動すると、/etc/rsyslog.d/99-haproxy.confで構成した/var/log/haproxy.logファイルのログを表示できるようになります。 ステップ5— HAProxyログのテストに進み、すべてが期待どおりに機能していることを確認します。

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

ステップ4—(オプション)SELinuxの設定

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

インタラクティブターミナルを使用してこのチュートリアルを実行している場合、環境はSELinuxの有効化をサポートしていません。 モジュールの作成とコンパイルを試すことはできますが、モジュールをロードすることはできません。

SELinuxに精通していない場合は、このチュートリアルシリーズ CentOS 7でのSELinuxの概要は、SELinuxの管理と操作の方法を学ぶのに役立ちます。 CentOS 7向けに書かれていますが、このシリーズの原則とコマンドはRockyLinux8にも同様に適用できます。

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

  1. 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行は、RsyslogがHAProxyのchrootとソケットファイルにそれぞれアクセスできるようにするルールです。

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

次に、次のコマンドを実行してcheckpolicyパッケージをインストールします。このパッケージには、TypeEnforcementファイルをSELinuxモジュールに変換するために使用するcheckmoduleユーティリティが含まれています。

  1. sudo dnf install checkpolicy

checkmoduleツールがインストールされたので、次のステップはモジュールをコンパイルしてからSELinuxにロードすることです。 以下を実行して、TypeEnforcementファイルをSELinuxモジュールにコンパイルします。

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

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

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

最後のステップは、semoduleコマンドを使用して生成したパッケージをLinuxカーネルにロードすることです。

  1. sudo semodule -i rsyslog-haproxy.pp

モジュールの追加には数秒かかる場合があります。 コマンドが完了したら、semoduleコマンドを実行して、モジュールがカーネルにロードされていることを確認できます。

  1. sudo semodule -l |grep rsyslog-haproxy

次のような出力を受け取るはずです。

Output
rsyslog-haproxy

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

  1. sudo systemctl restart rsyslog

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

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

ステップ5—HAProxyログのテスト

HAProxy、Rsyslog、およびオプションでSELinuxを構成したので、/var/log/haproxy.logへのロギングが機能していることをテストできます。

デフォルトでは、haproxyパッケージには、ポート5000にHTTPリスナーソケットを作成する構成ファイルが付属しています。 構成は存在しないバックエンドサーバーを指しているため、ポートへのリクエストはすべてHTTP503エラーになります。

/var/log/haproxy.logファイルで503エラーをチェックするには、最初に次のようにcurlを使用してHTTPリクエストを生成します。

  1. curl -si http://127.0.0.1:5000

次のような出力を受け取るはずです。

Output
HTTP/1.0 503 Service Unavailable Cache-Control: no-cache Connection: close Content-Type: text/html <html><body><h1>503 Service Unavailable</h1> No server is available to handle this request. </body></html>

次に、grepコマンドを使用して、/var/log/haproxy.logでHTTP503応答を調べます。

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

:コマンドのNOSRV.+503部分は正規表現です。 このチュートリアル LinuxでGrepと正規表現を使用してテキストパターンを検索する使用についてさらに深く掘り下げるgrepと正規表現。

次のような1行(または複数行)を受け取る必要があります。

Output
Sep 9 21:32:22 rocky-s-1vcpu-1gb-nyc3-01 haproxy[4451]: 127.0.0.1:56024 [9/Sep/2020:21:32:22.098] 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を設定します。 最後に、オプションでSELinuxポリシーをコンパイル、パッケージ化、およびロードして、RsyslogとHAProxyがソケットへの共有アクセスを許可します。