「複数台のバックエンドサーバーに均等にリクエストを振り分けたいが、HAProxyの設定が複雑でどこから手をつければいいかわからない」
こういった悩みを持つサーバー管理者は少なくありません。HAProxyはLinuxで最もよく使われるオープンソースのロードバランサー・プロキシサーバーです。設定ファイルのシンタックスが独特なため最初は戸惑いますが、構造を理解すると非常に柔軟な制御が可能になります。
この記事では、HAProxyのインストールから基本設定、HTTPロードバランサー構成、ヘルスチェック、SSL/TLS終端まで、実際のサーバーで動作確認した手順を解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・HAProxyは haproxy -c -f で設定ファイルの構文チェックができる
・frontend/backend の分離構成がHAProxy設定の基本パターン
・balance ラウンドロビン/leastconn でバランシングアルゴリズムを切り替える
・stats enable でブラウザから接続状況・死活をリアルタイム確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
HAProxyとは何か|ロードバランサーの役割を理解する
HAProxy(High Availability Proxy)は、TCP/HTTPトラフィックをバックエンドサーバー群に分散させるロードバランサー兼リバースプロキシです。もともとフランスのエンジニア Willy Tarreau が開発し、2001年に公開されました。現在もアクティブにメンテナンスが続いており、多くの大規模Webサービスで採用されています。ロードバランサーが必要になる主な場面は以下のとおりです。
・水平スケールアウト:1台のサーバーのスペックを上げる「垂直スケール」に限界が来たとき
・冗長化:バックエンドの1台が落ちても自動的に別のサーバーへ切り替える
・SSL終端:HAProxy側でHTTPS処理を集約し、バックエンドはHTTPで受けてCPU負荷を分散する
・セッション維持(sticky session):特定のユーザーを同じバックエンドに割り当て続ける
HAProxyのインストール
1. RHEL 9 / AlmaLinux 9 / Rocky Linux 9の場合
dnfコマンドでインストールします。# HAProxyをインストール $ sudo dnf install -y haproxy # バージョン確認 $ haproxy -v HAProxy version 2.4.22-f8e3218 2023/02/14 - https://haproxy.org/ # サービスを自動起動に設定 $ sudo systemctl enable --now haproxy
2. Ubuntu 24.04 LTSの場合
# HAProxyをインストール $ sudo apt update && sudo apt install -y haproxy # バージョン確認 $ haproxy -v HAProxy version 2.8.5-1ubuntu3 2024/01/06 - https://haproxy.org/ # サービスを自動起動に設定 $ sudo systemctl enable --now haproxy
# PPA追加でHAProxy最新LTS版をインストール(Ubuntu 24.04) $ sudo add-apt-repository ppa:vbernat/haproxy-2.8 $ sudo apt update && sudo apt install -y haproxy=2.8.\*
3. インストール後の確認
# サービス状態確認 $ sudo systemctl status haproxy * haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; preset: disabled) Active: active (running) since Wed 2026-06-04 09:10:31 JST; 5s ago Main PID: 12345 (haproxy) Tasks: 3 (limit: 4583) Memory: 15.2M # 設定ファイルの場所 $ ls -l /etc/haproxy/ total 20 -rw-r--r--. 1 root root 6935 Feb 14 2023 haproxy.cfg
haproxy.cfgの基本構造|4つのセクションを理解する
HAProxyの設定はすべて/etc/haproxy/haproxy.cfg に記述します。設定ファイルは4つのセクションで構成されます。| セクション | 役割 | 主な設定項目 |
|---|---|---|
| global | プロセス全体のチューニング | maxconn / log / user / group |
| defaults | frontend/backendのデフォルト値 | mode / timeout / log format |
| frontend | クライアントからの接続を受け付ける | bind ポート / ACL / use_backend |
| backend | 実際に処理するサーバー群 | balance / server / health check |
デフォルトの設定ファイル(/etc/haproxy/haproxy.cfg)を確認すると、実際の構造が把握しやすくなります。
# デフォルト設定ファイルの概要確認 $ grep -n "^[a-z]" /etc/haproxy/haproxy.cfg 1:global 13:defaults 30:frontend main 36:backend app
HTTPロードバランサーの設定|ラウンドロビンで3台に分散する
ここでは、フロントエンド(80番ポート受け付け)から3台のバックエンドサーバーにリクエストをラウンドロビンで分散する設定を組みます。1. 設定ファイルを編集する
# バックアップを取ってから編集 $ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak $ sudo vi /etc/haproxy/haproxy.cfg
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend web_front bind *:80 default_backend web_servers backend web_servers balance roundrobin server web1 192.168.10.11:80 check server web2 192.168.10.12:80 check server web3 192.168.10.13:80 check
2. 設定ファイルの構文チェック
設定を変更したら、必ず構文チェックを実行してからサービスを再起動します。これを怠るとサービスが起動しなくなります。# 構文チェック(-c: チェックのみ実行、-f: 設定ファイル指定) $ sudo haproxy -c -f /etc/haproxy/haproxy.cfg Configuration file is valid # 問題なければサービスを再起動 $ sudo systemctl reload haproxy
# エラー例(バックエンド名が一致しない場合) $ sudo haproxy -c -f /etc/haproxy/haproxy.cfg [ALERT] 155/091234 (12345) : proxy 'web_front': default backend 'web_server' referenced but not found.
3. バランシングアルゴリズムの種類
balance ディレクティブで分散アルゴリズムを切り替えます。| アルゴリズム | 特徴 | 用途 |
|---|---|---|
roundrobin |
順番に均等振り分け | 処理時間が均一なAPIサーバー |
leastconn |
接続数が最小のサーバーへ | 長時間接続が発生するDBプロキシ |
source |
クライアントIPを元に固定 | セッション維持が必要なアプリ |
uri |
リクエストURIを元に固定 | キャッシュサーバー前段 |
first |
先頭サーバーが満杯になったら次へ | コスト最小化(最小台数稼働) |
ヘルスチェックの設定|バックエンドの死活監視
1. 基本的なヘルスチェック
server 行末尾の check を追記するだけで、TCP疎通確認(デフォルト)が有効になります。backend web_servers balance roundrobin # inter: チェック間隔(ms) fall: 失敗N回でdown rise: 成功N回でup server web1 192.168.10.11:80 check inter 2000 fall 3 rise 2 server web2 192.168.10.12:80 check inter 2000 fall 3 rise 2 server web3 192.168.10.13:80 check inter 2000 fall 3 rise 2
2. HTTPレスポンスコードでヘルスチェックする
TCPポートが開いているだけでなく、HTTPで200が返ることを確認する場合はoption httpchk を使います。backend web_servers balance roundrobin option httpchk GET /health HTTP/1.1\r\nHost:\ example.com http-check expect status 200 server web1 192.168.10.11:80 check inter 2000 server web2 192.168.10.12:80 check inter 2000 server web3 192.168.10.13:80 check inter 2000
/health エンドポイントを用意しておくと、アプリレベルの死活確認ができます。3. バックエンドを一時的に切り離す(メンテナンス)
メンテナンス時にサーバーを切り離す場合、設定ファイルでdisabled キーワードを使う方法と、ソケット経由でオンラインに操作する方法があります。# 設定ファイルでの切り離し(再起動が必要) server web2 192.168.10.12:80 check disabled # または、HAProxy管理ソケット経由でオンライン操作 # stats socket を global セクションで有効にする必要がある $ echo "disable server web_servers/web2" | sudo socat stdio /var/lib/haproxy/stats $ echo "enable server web_servers/web2" | sudo socat stdio /var/lib/haproxy/stats
ログ設定と統計ページ|現状をリアルタイムで把握する
1. rsyslogにログを転送する設定
HAProxyはデフォルトで/var/log/haproxy.log にログを書き込みます。rsyslogの設定が必要です。# /etc/rsyslog.d/haproxy.conf を作成 $ sudo bash -c 'cat > /etc/rsyslog.d/haproxy.conf << "RSYSLOG" $ModLoad imudp $UDPServerRun 514 local2.* /var/log/haproxy.log RSYSLOG' $ sudo systemctl restart rsyslog # ログ確認 $ sudo tail -f /var/log/haproxy.log Jun 4 09:15:22 lb01 haproxy[12345]: 192.168.1.50:54321 [04/Jun/2026:09:15:22.345] web_front web_servers/web1 0/0/1/5/6 200 854 - - ---- 3/3/0/0/0 0/0 "GET / HTTP/1.1"
2. 統計ページ(stats)を有効化する
HAProxyには標準でWebベースの統計ダッシュボードが内蔵されています。設定ファイルにlisten stats セクションを追加します。listen stats bind *:8080 stats enable stats uri /haproxy-stats stats realm HAProxy\ Statistics stats auth admin:changeme stats refresh 30s stats show-legends stats show-node
http://サーバーIP:8080/haproxy-stats にアクセスすると、各バックエンドの接続数・レスポンスタイム・ダウン状態がグラフィカルに確認できます。【注意】本番環境では8080ポートをパブリックに開放しないでください。
bind 127.0.0.1:8080 にするか、firewall-cmdでアクセス元IPを限定するのが鉄則です。statsページには認証情報が必要ですが、それだけでは不十分です。# ローカルからSSHポートフォワードで確認する場合 $ ssh -L 8080:127.0.0.1:8080 user@lb01.example.com # ブラウザで http://localhost:8080/haproxy-stats にアクセス
SSL/TLS終端(HTTPS)の設定
HAProxyにSSL証明書を持たせ、バックエンドへはHTTPで通信する「SSL終端」構成は、大規模環境でよく使われるパターンです。各バックエンドサーバーでSSL証明書を管理する手間が省けます。1. 証明書ファイルの準備
HAProxyは証明書ファイル(CRT)と秘密鍵(KEY)を1ファイルに結合したPEM形式を要求します。# CRT + KEY を結合して haproxy.pem を生成 $ sudo cat /etc/ssl/example.com.crt /etc/ssl/example.com.key \ > /etc/haproxy/example.com.pem $ sudo chmod 600 /etc/haproxy/example.com.pem # Let's Encrypt 証明書の場合 $ sudo cat /etc/letsencrypt/live/example.com/fullchain.pem \ /etc/letsencrypt/live/example.com/privkey.pem \ > /etc/haproxy/example.com.pem $ sudo chmod 600 /etc/haproxy/example.com.pem
2. フロントエンドにHTTPS(443番)を追加する
frontend web_front bind *:80 bind *:443 ssl crt /etc/haproxy/example.com.pem # HTTPをHTTPSにリダイレクト redirect scheme https code 301 if !{ ssl_fc } default_backend web_servers backend web_servers balance roundrobin # バックエンドへはHTTPで転送(X-Forwarded-Protoでオリジナルプロトコルを通知) http-request set-header X-Forwarded-Proto https if { ssl_fc } server web1 192.168.10.11:80 check server web2 192.168.10.12:80 check server web3 192.168.10.13:80 check
3. TLS設定のセキュリティ強化
古いTLSバージョン(1.0/1.1)や脆弱な暗号スイートを無効化します。frontend web_front bind *:443 ssl crt /etc/haproxy/example.com.pem \ ssl-min-ver TLSv1.2 \ ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 # HSTS(6ヶ月間HTTPSを強制) http-response set-header Strict-Transport-Security "max-age=15768000" default_backend web_servers
よく使うHAProxyコマンド一覧
| やりたいこと | コマンド |
|---|---|
| 設定ファイルの構文チェック | haproxy -c -f /etc/haproxy/haproxy.cfg |
| 設定をリロード(サービス無停止) | systemctl reload haproxy |
| サービスの再起動 | systemctl restart haproxy |
| サービスの状態確認 | systemctl status haproxy |
| リアルタイムログ確認 | tail -f /var/log/haproxy.log |
| バックエンドを無効化(ソケット経由) | echo "disable server web_servers/web1" | socat stdio /var/lib/haproxy/stats |
| バックエンドを有効化(ソケット経由) | echo "enable server web_servers/web1" | socat stdio /var/lib/haproxy/stats |
| 接続中のセッション数確認 | echo "show info" | socat stdio /var/lib/haproxy/stats | grep CurrConns |
トラブルシュート|よくあるエラーと対処法
1. 「Cannot bind socket」エラー
[ALERT] 155/091234 (12345) : Starting frontend web_front: cannot bind socket [0.0.0.0:80]
・ポートが別プロセスで使用中:他のWebサーバー(Apache/Nginx)が起動していないか確認してください
$ sudo ss -tlnp | grep ':80' # 他プロセスが使用している場合 $ sudo systemctl stop httpd # または nginx
# SELinuxのAVCエラー確認 $ sudo ausearch -m avc -ts recent | grep haproxy # ポートへのアクセスを許可 $ sudo semanage port -a -t http_port_t -p tcp 8080
2. バックエンドが「DOWN」と表示される
統計ページでバックエンドがすべてDOWNになっている場合、以下の点を確認します。・バックエンドサーバーが起動しているか:対象ポートへの疎通確認
# HAProxyサーバーからバックエンドへの疎通確認 $ curl -I http://192.168.10.11:80/ $ nc -zv 192.168.10.11 80
# バックエンドサーバー側でのファイアウォール確認 $ sudo firewall-cmd --list-all $ sudo firewall-cmd --add-port=80/tcp --permanent && sudo firewall-cmd --reload
3. SSL証明書関連のエラー
[ALERT] error reading certificate from file '/etc/haproxy/example.com.pem'
・ファイルのパーミッション:haproxyユーザーが読み取れるか確認
# PEMファイルの内容確認(CRT部分が先頭にあるか) $ head -2 /etc/haproxy/example.com.pem -----BEGIN CERTIFICATE----- MIIFYzCCBEugAwIBAgIQD... # パーミッション確認・修正 $ ls -la /etc/haproxy/example.com.pem $ sudo chmod 600 /etc/haproxy/example.com.pem $ sudo chown haproxy:haproxy /etc/haproxy/example.com.pem
4. 「haproxy.cfg」を変更したのに反映されない
systemctl reload haproxy ではなく systemctl restart haproxy を実行してしまうと、一瞬サービスが停止します。設定変更の反映には reload を使うのが原則です。ただし、bind のポート変更など一部の変更はreloadで反映されず、restartが必要な場合があります。# 設定変更の流れ $ sudo vi /etc/haproxy/haproxy.cfg $ sudo haproxy -c -f /etc/haproxy/haproxy.cfg # 必ず構文チェック $ sudo systemctl reload haproxy # 無停止リロード
本記事のまとめ
HAProxyはLinux環境で実績のあるロードバランサーです。設定ファイルの構造さえ理解すれば、HTTPの負荷分散からSSL終端まで柔軟に対応できます。| やりたいこと | 設定・コマンド |
|---|---|
| 設定ファイルの構文チェック | haproxy -c -f /etc/haproxy/haproxy.cfg |
| ラウンドロビン分散の設定 | backend に balance roundrobin |
| HTTPヘルスチェック | option httpchk GET /health |
| 統計ダッシュボードを表示 | listen stats セクションに stats enable |
| SSL終端(HTTPS) | bind に ssl crt /etc/haproxy/example.com.pem |
| バックエンドをオンラインで切り離す | echo "disable server backend/server" | socat stdio /var/lib/haproxy/stats |
| 設定を無停止でリロード | systemctl reload haproxy |
HAProxyの構築後はログ監視とヘルスチェックの設定を忘れずに行いましょう。バックエンドのダウンを検知して自動的に切り離す仕組みが整っていれば、サービス影響を最小化できます。
Linux環境でのポート確認には Linux ポート確認の全コマンド も参照してください。ファイアウォールの設定は Linux DNS 設定の基本 と合わせて確認しておくと、ネットワーク診断がスムーズになります。
SELinuxを有効にしている環境でHAProxyを動かす場合は、Linux ポート確認の全コマンド で通信状況を確認しながら、semanageコマンドでポリシーを調整してください。サーバーのサービス管理については httpd の基本操作 も参考になります。
Linux無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:renameコマンドでファイル名を一括変更する方法|正規表現・連番・拡張子変更の実践例
- 前のページへ:chronyc・chronyコマンドでLinuxの時刻同期を管理する方法|offset確認・トラブルシュートまで
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます