なぜFedoraでHAProxyを選ぶのか?
2年以上Fedoraをメイン環境として使用してきましたが、このOSは安定性と新しさのバランスが非常に優れていると感じています。古いバージョンに留まりがちなCentOSやUbuntu LTSとは異なり、Fedora Serverの公式リポジトリには常にHAProxy 2.8+や3.0が用意されています。サードパーティのリポジトリを追加する手間なく、dnf installだけで最新機能を利用できます。
Layer 7(アプリケーション層)におけるHAProxyの大きなメリットは、HTTPヘッダー、クッキー、URLを深く解析できる点です。これにより、TCP層での単純な負荷分散ではなく、非常に柔軟なトラフィック制御が可能になります。この記事では、具体的な設定方法と、RedHat系OS特有の「SELinux」エラーの解決策について詳しく解説します。
クイックスタート:5分でHAProxyを稼働させる
テスト用に負荷分散クラスタを素早く構築する必要がある場合は、以下の3つのステップを実行してください。
1. HAProxyのインストール
sudo dnf install haproxy -y
2. 最小限の構成設定
/etc/haproxy/haproxy.cfgファイルを開きます。既存の内容をすべて削除し、以下の内容を貼り付けてください(バックエンドのIPは適宜変更してください)。
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
3. サービスの有効化
sudo systemctl enable --now haproxy
理論上はこれで完了です。しかし、アクセスして503エラーやタイムアウトが発生しても、焦る必要はありません。90%の確率はFirewallかSELinuxが通信をブロックしています。これについては後ほど対処します。
ACLによるスマートなルーティング
例えば、APIとフロントエンドが別々に稼働しているシステムを想定します。/apiへのリクエストはロジック処理サーバーへ、それ以外は静的ページへ振り分けたい場合、ACL(Access Control Lists)がその役割を担います。
frontend http_in
bind *:80
# APIリクエストの識別
acl is_api path_beg /api
# スマートなルーティング
use_backend api_cluster if is_api
default_backend static_web
backend api_cluster
balance leastconn
server api01 10.0.0.5:8080 check maxconn 500
server api02 10.0.0.6:8080 check maxconn 500
backend static_web
balance roundrobin
server web01 10.0.0.10:80 check
server web02 10.0.0.11:80 check
APIクラスタにはleastconnアルゴリズムを優先的に使用しています。このアルゴリズムは、接続数が最も少ないサーバーにリクエストを送信します。データ処理タスクの応答時間が不均一な場合、roundrobinよりもはるかに効率的です。
SELinuxとFirewalldの対応:無効化せず、正しく設定する!
多くのエンジニアは手っ取り早くsetenforce 0でSELinuxを無効化しがちですが、これはセキュリティ上、致命的なミスです。FedoraはデフォルトでHAProxyが外部へ接続(アウトバウンド)することを禁止しているため、適切な権限を付与する必要があります。
1. SELinux의 通信許可
以下のコマンドを実行して、HAProxyがネットワーク経由でバックエンドサーバーに接続することを許可します。
sudo setsebool -P httpd_can_network_connect 1
-Pフラグを付けることで、サーバーを再起動してもこのルールが維持されます。
2. Firewalldのポート開放
サービスポートの開放も忘れないでください。開放しないと、クライアントはロードバランサーに到達できません。
sudo firewall-cmd --permanent --add-service={http,https}
sudo firewall-cmd --reload
ヘルスチェック:システムの可用性を確保する
優れたロードバランサーは、故障したサーバーを即座に切り離すことができなければなりません。単なるTCPポートのチェックではなく、アプリケーションが実際に応答しているかを確認するためにHTTPチェックを使用します。
backend app_backend
option httpchk GET /health
http-check expect status 200
server app01 192.168.1.20:8080 check inter 2s rise 3 fall 2
server app02 192.168.1.21:8080 check inter 2s rise 3 fall 2
この設定では、HAProxyは2秒ごとに/healthエンドポイントをチェックします。サーバーが500エラーを返したり、2回連続(fall 2)でタイムアウトしたりすると、サービスリストから除外されます。ステータス200が3回連続(rise 3)で返されたときのみ、再び稼働状態に戻されます。
管理画面(HAProxy Stats)
視覚的に監視するために、組み込みのダッシュボードを有効にすることをお勧めします。どのサーバーが「生存」しているか、トラフィック量やエラーをリアルタイムで確認できます。
listen stats
bind *:9000
stats enable
stats uri /monitor
stats auth admin:ChouKyokuPassword2024
stats refresh 5s
http://あなたのIP:9000/monitorにアクセスして確認してください。Firewalldでポート9000を開放するのを忘れずに。
実践で得られた知見
本番環境で何度も苦労した経験から、いくつか重要な注意点を挙げます。
- 構文チェック: 再起動する前に、必ず
haproxy -c -f /etc/haproxy/haproxy.cfgを実行してください。余計なコンマ一つでシステムがダウンする可能性があります。 - ログの分離: デフォルトではHAProxyのログは
journalctlに混ざってしまい見にくいです。Rsyslogを設定して、ログを/var/log/haproxy.logなどの専用ファイルに出力するようにしましょう。 - カーネルの最適化: 10,000以上の同時接続を処理するシステムでは、
/etc/sysctl.confにfs.file-max = 65535を追加してファイル記述子の制限を上げてください。 - SSL Termination: HAProxyでHTTPSの復号を行う場合は、最新のFedoraを使用してOpenSSL 3.0を活用することで、ハンドシェイク速度を大幅に向上させることができます。
FedoraでのHAProxyの構築は難しくありませんが、OSのセキュリティシステムとの相互作用を理解することが重要です。もし不明なエラーに遭遇した場合は、ausearch -m avc -ts recentコマンドを使用して、SELinuxが何をブロックしているかを確認してください。安定したシステム構築を応援しています!

