RockyLinux8でRsyslogを使用してHAProxyログを構成する方法[クイックスタート]
序章
高可用性プロキシの略であるHAProxyは、Linux、Solaris、およびFreeBSDで実行される広く使用されているTCPおよびHTTPベースのプロキシサーバーです。 これは、複数のサーバー間で要求を分散することによってアプリケーションの負荷を分散し、ユーザーがアプリケーションを高可用性で利用できるようにするために使用されます。
多くのRockyLinux8インストールのデフォルトでは、HAProxyはログ出力をファイルに書き込むように構成されていません。 このクイックスタートチュートリアルでは、信頼性、速度、およびセキュリティのためにUnixドメインソケットを使用してRsyslogでHAProxyロギングを構成する方法について説明します。
前提条件
このチュートリアルを完了するには、RockyLinux8を実行しているサーバーが必要です。 このサーバーには、管理者権限を持つroot以外のユーザーが必要です。 これを設定するには、 Rocky Linux8チュートリアルの初期サーバー設定ガイドに従ってください。
このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルでHAProxyとrsyslogのロギングを試すこともできます。 次のインタラクティブターミナルを起動します!ボタンをクリックして開始します。
ステップ1—HAProxyのインストールと有効化
HAProxyをインストールするには、以下を実行します dnf
指図:
- sudo dnf install haproxy
プロンプトが表示されたら Is this ok [y/N]:
入力 y
を押して RETURN
パッケージをインストールします。
HAProxyをインストールしたら、HAProxyを有効にして起動します。 systemctl
指図:
- sudo systemctl enable haproxy.service
次の出力が表示されます。
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
HAProxyサービスが有効になったら、HAProxyサービスを起動して、サーバーでデフォルトの構成で実行されるようにすることができます。
- sudo systemctl start haproxy.service
次に、HAProxyのステータスを調べて、実行されていることを確認します。
- 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.cfg
の vi
またはお好みの編集者:
- sudo vi /etc/haproxy/haproxy.cfg
プレス i
に切り替えるには INSERT
モード、次に行を見つけます log 127.0.0.1 local2
を追加してコメントアウトします #
次の例で強調表示されているように、行の先頭に文字を追加します。
. . .
# 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
編集したものには、次の行が含まれている必要があります。
. . .
# 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を再起動します。
- sudo mkdir /var/lib/haproxy/dev
- 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
またはお好みの編集者:
- sudo vi /etc/rsyslog.d/99-haproxy.conf
プレス i
に切り替えるには INSERT
モードにして、次の行をファイルに貼り付けます。
$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の現在のポリシーを確認するには、以下を実行します。
- getenforce
次の出力の1つを受け取ります。
Enforcing
-このモードでは、SELinuxはシステムにアクセス制御を適用しています。 次のオプションのステップ4—SELinuxセクションの設定を完了する必要があります。Permissive
-この場合、SELinuxはすべてのアクセス試行をログファイルに記録しますが、システムにアクセス制御を強制しません。Disabled
-SELinuxが無効になっている場合、システムにアクセス制御ポリシーを記録または適用していません。
の場合 getenforce
コマンドはどちらかを返しました Permissive
また Disabled
、次に、次のコマンドを使用してRsyslogを再起動できます。
- 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.te
の vi
またはお好みの編集者:
- vi rsyslog-haproxy.te
プレス i
に切り替えるには INSERT
モードにして、次の行をファイルに貼り付けます。
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モジュールに変換するために使用するユーティリティ。
- sudo dnf install checkpolicy
今、あなたは checkmodule
ツールがインストールされたら、次のステップはモジュールをコンパイルしてからSELinuxにロードすることです。 以下を実行して、TypeEnforcementファイルを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
最後のステップは、生成したパッケージをLinuxカーネルにロードすることです。 semodule
指図:
- sudo semodule -i rsyslog-haproxy.pp
モジュールの追加には数秒かかる場合があります。 コマンドが完了したら、を実行してモジュールがカーネルにロードされていることを確認できます。 semodule
指図:
- sudo semodule -l |grep rsyslog-haproxy
次のような出力を受け取るはずです。
Outputrsyslog-haproxy
モジュールがロードされたら、次のコマンドでRsyslogを再起動できます。
- 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
このような:
- curl -si http://127.0.0.1:5000
次のような出力を受け取るはずです。
OutputHTTP/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
指図:
- sudo grep -E 'NOSRV.+503' /var/log/haproxy.log
注: NOSRV.+503
コマンドの一部は正規表現です。 このチュートリアル LinuxでGrepと正規表現を使用してテキストパターンを検索する使用についてさらに深く掘り下げる grep
と正規表現。
次のような1行(または複数行)を受け取る必要があります。
OutputSep 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がソケットへの共有アクセスを許可します。