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
以下の出力が表示されるはずです。
OutputCreated 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.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
のセクション全体は、次の行を含む必要があります:
/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.cfg
の log
行の編集が終わったら、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
モードに切り替え、次の行をファイルに貼り付けます:
$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
モードに切り替え、次の行をファイルに貼り付けます:
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
以下のような出力が得られるはずです:
Outputrsyslog-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
と正規表現の使用についてより深く掘り下げて説明しています。
次のような行 (または複数の行) を受け取るはずです。
OutputSep 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 ポリシーをオプションでコンパイル、パッケージ、およびロードしました
。