haproxyコマンドの使い方|Linuxでロードバランサーを構築する方法と設定例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > haproxyコマンドの使い方|Linuxでロードバランサーを構築する方法と設定例
「Webアプリの負荷が一台のサーバーに集中して、アクセスが増えるたびに応答が遅くなる」
「複数台のバックエンドサーバーに均等にリクエストを振り分けたいが、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 でブラウザから接続状況・死活をリアルタイム確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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

最新の2.8系(LTS版)が必要な場合、Ubuntu では PPA を追加してインストールする方法もあります。

# 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がブロック:SELinux環境ではHAProxyがバインドできるポートが制限されます

# 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

ファイアウォールがブロック:バックエンドサーバー側のfirewalldやセキュリティグループを確認

# バックエンドサーバー側でのファイアウォール確認 $ 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'

PEMファイルの結合順序:必ず「CRT → KEY」の順で結合してください(逆順はエラーになります)
ファイルのパーミッション: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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。