Fedora ServerでのHAProxy Layer 7の構築:検証環境から本番環境まで

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

なぜ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.conffs.file-max = 65535を追加してファイル記述子の制限を上げてください。
  • SSL Termination: HAProxyでHTTPSの復号を行う場合は、最新のFedoraを使用してOpenSSL 3.0を活用することで、ハンドシェイク速度を大幅に向上させることができます。

FedoraでのHAProxyの構築は難しくありませんが、OSのセキュリティシステムとの相互作用を理解することが重要です。もし不明なエラーに遭遇した場合は、ausearch -m avc -ts recentコマンドを使用して、SELinuxが何をブロックしているかを確認してください。安定したシステム構築を応援しています!

Share: