序章

高可用性プロキシの略である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をインストールしたら、HAProxyを有効にして起動します。 systemctl 指図:

  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のロギングディレクティブを設定するには、 /etc/haproxy/haproxy.cfgvi またはお好みの編集者:

  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
. . .

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

編集が終了したら、 log の行 /etc/haproxy/haproxy.cfg、を押してファイルを保存して閉じます ESC、入力 :wq、を押します ENTER.

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

を使用してディレクトリを作成します mkdir コマンドを実行してからHAProxyを再起動します。

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

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

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

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

  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
}

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

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

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

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

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

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

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

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

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

共有ソケットへのRsyslogおよびHAProxyアクセスを有効にするには、最初のタスクはTypeEnforcementポリシーファイルを作成することです。 と呼ばれる新しいファイルを開きます rsyslog-haproxy.tevi またはお好みの編集者:

  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 };

最初の行は、モジュール名とバージョンを定義します。 The require 部分は、SELinuxモジュールローダーに、ポリシーをモジュールとしてロードするために必要なタイプとクラスについて通知します。 最後の2行は、RsyslogがHAProxyにアクセスできるようにするルールです。 chroot それぞれソケットファイル。

ファイルの編集が完了したら、を押して保存して閉じます ESC、入力 :wq、を押します ENTER.

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

  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

最後のステップは、生成したパッケージをLinuxカーネルにロードすることです。 semodule 指図:

  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エラーになります。

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

  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>

今調べてください /var/log/haproxy.log を使用したHTTP503応答の場合 grep 指図:

  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がソケットへの共有アクセスを許可します。