手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 HAProxy ロードバランサー – frontend / backend とヘルスチェック

Ubuntu 22.04 で HAProxy を使う場合、まず frontendbackend、ヘルスチェックの役割を分けて考えます。HAProxy は、外部または上位のクライアントから受けた通信を複数の上流サーバーへ振り分けるリバースプロキシ / ロードバランサーです。

この記事は、Ubuntu 22.04 の既存環境で HAProxy の設定を読み直すための記事です。新規構築では Ubuntu 26.04 側の記事を優先しつつ、22.04 環境の設定確認や古い構築記録の読み替えに使ってください。

関連する記事
この記事で確認すること
  • HAProxy の frontendbackend の役割
  • HTTP ロードバランサーの基本設定
  • ヘルスチェックの確認対象
  • ログと統計画面の確認
  • TLS 終端を行う場合の注意点
参考
書籍
参考書籍

マスタリング TCP/IP 入門編 第6版

TCP/IP、Ethernet、VLAN、ルーティングなど、ネットワークの基礎を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

HAProxy の位置づけ

HAProxy は、外部から内部サービスへ向かう通信を受ける入口に置きます。Squid のように内部クライアントから外部へ出るフォワードプロキシとは通信の向きが違います。

項目主な役割
frontendクライアントから接続を受ける入口
backend実際に処理する上流サーバー群
ヘルスチェック上流サーバーが応答可能か確認する
TLS 終端HAProxy で HTTPS を受け、内部へ渡す構成
リバースプロキシ外部から内部サービスへ向かう通信の中継

既存環境を確認するときは、どのアドレスとポートで受け、どの上流サーバーへ流し、どの条件で上流を異常扱いにするかを分けて見ます。

HAProxy をインストールする

Ubuntu 22.04 の標準リポジトリから HAProxy をインストールします。

コマンド
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y haproxy

HTTP ロードバランサーを設定する

HTTP の入口を frontend、上流 Web サーバー群を backend として設定します。ここでは上流サーバーを 10.1.0.2110.1.0.22 の例にします。

コマンド
sudo tee /etc/haproxy/haproxy.cfg <<'EOF'
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5s
    timeout client 30s
    timeout server 30s
frontend web_front
    bind *:80
    default_backend web_back
backend web_back
    balance roundrobin
    option httpchk GET /
    server web1 10.1.0.21:80 check
    server web2 10.1.0.22:80 check
EOF
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy

haproxy -c で設定ファイルの構文を確認してから再起動します。既存環境では、上流サーバーの IP アドレス、DNS 名、待ち受けポートが実際の構成と一致しているかを確認します。

動作確認する

サービス状態、待ち受け、HTTP 応答を確認します。

コマンド
systemctl status haproxy --no-pager
ss -ltnp | grep ':80'
curl -I http://lb.example.local/

接続できない場合は、HAProxy 側だけでなく、上流サーバーの待ち受け、ファイアウォール、名前解決、経路も合わせて見ます。

ログを確認する

HAProxy のログは syslog 経由で出る構成が一般的です。Ubuntu の環境により journald や syslog 側を確認します。

コマンド
sudo journalctl -u haproxy -n 80 --no-pager
sudo grep haproxy /var/log/syslog | tail -n 50

ログでは、クライアントからの接続、選ばれた上流、ステータスコード、応答時間を確認します。単に 200 が返るかだけではなく、どの上流へ流れているかも見ます。

統計画面を有効化する

内部管理用に stats 画面を有効化できます。外部へ公開しないように、待ち受け先と認証を制限します。

コマンド
sudo tee -a /etc/haproxy/haproxy.cfg <<'EOF'
listen stats
    bind 127.0.0.1:8404
    mode http
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:change-me
EOF
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy
curl -I http://127.0.0.1:8404/stats

stats 画面は便利ですが、上流の状態や構成が見える管理画面です。公開アドレスではなく、管理ネットワークやローカルホストに限定します。

TLS 終端を行う場合

HAProxy で TLS を終端する場合は、証明書と秘密鍵を結合した PEM ファイルを指定します。内部 CA と公開 CA のどちらを使うかは、公開範囲に応じて決めます。

コマンド
sudo install -d -m 0750 -o root -g haproxy /etc/haproxy/certs
sudo tee /etc/haproxy/certs/server.example.local.pem < server.example.local.crt
sudo tee -a /etc/haproxy/certs/server.example.local.pem < server.example.local.key
sudo chmod 0640 /etc/haproxy/certs/server.example.local.pem
sudo chown root:haproxy /etc/haproxy/certs/server.example.local.pem

TLS 入口を追加する場合は、frontend 側で証明書を指定し、内部へ渡すプロトコルを決めます。

コマンド
sudo tee -a /etc/haproxy/haproxy.cfg <<'EOF'
frontend web_tls_front
    bind *:443 ssl crt /etc/haproxy/certs/server.example.local.pem
    http-request set-header X-Forwarded-Proto https
    default_backend web_back
EOF
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy

TLS 終端を HAProxy に寄せる場合、証明書更新、秘密鍵の権限、上流へ渡すヘッダー、上流側で HTTPS を認識する設定を合わせて確認します。

ヘルスチェックの考え方

ロードバランサーでは、単にポートが開いていることだけでなく、アプリケーションとして正常に応答できるかを見ることが重要です。

コマンド
sudo tee -a /etc/haproxy/haproxy.cfg <<'EOF'
backend web_back_health
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 10.1.0.21:80 check
    server web2 10.1.0.22:80 check
EOF
sudo haproxy -c -f /etc/haproxy/haproxy.cfg

ヘルスチェック用の URL は、アプリケーションの依存先まで含めて確認するのか、Web サーバーの生存だけを見るのかで意味が変わります。障害時にどの上流を切り離したいかに合わせて決めます。

運用上の注意

  • HAProxy はフォワードプロキシではなくリバースプロキシとして考える
  • 上流サーバーは DNS 名または固定 IP で管理する
  • ヘルスチェックは障害時の切り離し単位に合わせる
  • TLS 終端する場合は証明書更新と秘密鍵管理を決める
  • WAF を入れる場合は HAProxy と Apache / ModSecurity の配置順を決める

まとめ

Ubuntu 22.04 の HAProxy は、複数の Web サーバーへ通信を振り分けるリバースプロキシ / ロードバランサーです。frontendbackend、ヘルスチェック、ログ、TLS 終端を分けて見ると、既存環境の設定意図を確認しやすくなります。

22.04 の既存環境を見直すときは、入口、上流、正常性判定、証明書、ログを分けて確認します。新しい環境へ移す場合は、ロードバランサーで TLS を終端するのか、WAF をどこに置くのか、上流サーバーの切り離し条件をどうするのかまで合わせて見直します。

関連する記事
Ubuntu 22.04 HAProxy ロードバランサー – frontend / backend とヘルスチェック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る