UbuntuでHAProxyを使って複数のWebサーバーに負荷を分散する方法を解説します。HAProxyは「High Availability Proxy」の略で、世界中の大規模サービスで採用されている、信頼性の高いロードバランサーです。
Ubuntu 24.04 LTS の apt リポジトリには haproxy 2.8.16(LTSブランチ)が収録されており、apt install 一発でセットアップできます。本記事では実際にDockerで3台のnginxバックエンドとHAProxyを起動し、リクエストが均等に振り分けられることを実証しながら手順を説明します。
この記事のポイント
- Ubuntu 24.04 LTS には
haproxy 2.8.16(2028年Q2まで長期サポート)が収録されている apt install haproxyだけでインストール完了。設定ファイルは/etc/haproxy/haproxy.cfgbalance roundrobinの1行でラウンドロビン分散が設定できる- ポート8404の stats ページでリアルタイムにバックエンドの状態を確認できる
- curl × 9回のテストで web1 → web2 → web3 → web1 … と均等に振り分けられることを実証
目次
- HAProxy とは何か
- HAProxy のインストール
- 設定ファイルの書き方(haproxy.cfg)
- ラウンドロビン動作の確認
- stats 管理画面の使い方
- Ubuntu 22.04 vs 24.04 のバージョン比較
- よくあるエラーと解決策
- まとめ
HAProxy とは何か
HAProxy(HA Proxy)は、TCP/HTTPトラフィックを複数のサーバーに振り分けるロードバランサーです。GitHubやRedditなど大規模サービスでも使われており、高スループットと低レイテンシを両立しています。
主な役割は2つです。
- 負荷分散(Load Balancing):リクエストを複数のバックエンドサーバーに振り分け、1台に集中するのを防ぐ
- 高可用性(High Availability):バックエンドの1台が落ちても、残りのサーバーへ自動的に切り替える

図のように、クライアントからのリクエストはすべてHAProxyが受け取り、バックエンドのサーバー群に順番に振り分けます。外部からはHAProxyのIPアドレスしか見えないため、バックエンドの台数を動的に増減できます。
HAProxy のインストール
手順1:前提環境を確認する
動作確認済み環境
本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04 でも動作しますが、インストールされる HAProxy のバージョンが異なります(後述の比較表を参照)。
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.4 LTS
Release: 24.04
Codename: noble
手順2:apt update を実行する
apt install の前に必ず apt update を実行します。これをやらないと古いバージョンが入ってしまうことがあります。
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Reading package lists… Done
Building dependency tree… Done
All packages are up to date.
手順3:haproxy をインストールする
Reading package lists… Done
Building dependency tree… Done
The following additional packages will be installed:
adduser liblua5.4-0
The following NEW packages will be installed:
adduser haproxy liblua5.4-0
Need to get 2335 kB of archives.
After this operation, 5935 kB of additional disk space will be used.
…
Setting up haproxy (2.8.16-0ubuntu0.24.04.2) …

インストールが完了したら、バージョンを確認します。
HAProxy version 2.8.16-0ubuntu0.24.04.2 2026/04/15 – https://haproxy.org/
Status: long-term supported branch – will stop receiving fixes around Q2 2028.
Ubuntu 24.04 の標準リポジトリから haproxy 2.8.16(LTSブランチ)がインストールされました。このバージョンは 2028年Q2まで長期サポートされます。
手順4:サービスを有効化・起動する
haproxy.service enabled and started.
$ sudo systemctl status haproxy
● haproxy.service – HAProxy Load Balancer
Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2026-06-13 06:21:39 UTC; 5s ago
Process: ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS)
Main PID: 1234 (haproxy)
active (running) と表示されれば起動成功です。systemctl enable を付けているので、サーバー再起動後も自動で起動します。
設定ファイルの書き方(haproxy.cfg)
HAProxy の設定はすべて /etc/haproxy/haproxy.cfg に書きます。設定を変更するたびに systemctl reload haproxy で反映できます(サービスを止めずに設定を更新できます)。
haproxy.cfg の構成
設定ファイルは大きく4つのセクションに分かれています。
| セクション | 役割 | 主な設定項目 |
|---|---|---|
global |
プロセス全体の設定 | ログ出力先、最大接続数、ユーザー |
defaults |
frontend/backend 共通のデフォルト値 | モード(http/tcp)、タイムアウト |
frontend |
クライアントからの受付口 | 待ち受けポート、ACL、デフォルトバックエンド |
backend |
バックエンドサーバー群 | 負荷分散方式、サーバー一覧、ヘルスチェック |
設定ファイルの実例
3台のバックエンドにラウンドロビン分散する設定を書きます。sudo nano /etc/haproxy/haproxy.cfg で編集してください。

log stdout format raw local0
maxconn 4096
defaults
mode http
log global
option httplog
option forwardfor
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
option http-server-close
server web1 192.168.1.11:80 check
server web2 192.168.1.12:80 check
server web3 192.168.1.13:80 check
listen stats
bind *:8404
stats enable
stats uri /
stats refresh 10s
各設定の意味です。
balance roundrobin:リクエストを web1 → web2 → web3 → web1 … の順に振り分けるoption forwardfor:バックエンドにX-Forwarded-ForヘッダーでクライアントのIPを伝えるcheck:バックエンドのヘルスチェックを有効にする(落ちたサーバーは自動で除外)listen stats:ポート 8404 で管理画面を公開する
ポイント
option http-server-close を書いておくことが重要です。これがないとコネクションが使いまわされて、同じバックエンドにリクエストが偏ることがあります。ラウンドロビンを使うなら必ず入れましょう。
設定を反映する
Configuration file is valid
$ sudo systemctl reload haproxy
(出力なし:正常に反映)
-c オプションで設定ファイルの文法チェックを先に行うのが定番です。Configuration file is valid と出たら reload します。
ラウンドロビン動作の確認
実際に3台のバックエンドを起動して、HAProxy がリクエストを均等に振り分けることを確認します。以下は Dockerで実際に計測した結果です。
Server-1 (HAProxy Backend) — hostname: haproxy_backend1
Server-2 (HAProxy Backend) — hostname: haproxy_backend2
Server-3 (HAProxy Backend) — hostname: haproxy_backend3
Server-1 (HAProxy Backend) — hostname: haproxy_backend1
Server-2 (HAProxy Backend) — hostname: haproxy_backend2
Server-3 (HAProxy Backend) — hostname: haproxy_backend3
Server-1 (HAProxy Backend) — hostname: haproxy_backend1
Server-2 (HAProxy Backend) — hostname: haproxy_backend2
Server-3 (HAProxy Backend) — hostname: haproxy_backend3

9回のリクエストが web1 → web2 → web3 → web1 … と3台に均等に振り分けられています。これがラウンドロビン(round-robin)です。
HAProxy のアクセスログでも確認できます。
[13/Jun/2026:06:21:39] http_front web_servers/web1 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:40] http_front web_servers/web2 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:40] http_front web_servers/web3 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:40] http_front web_servers/web1 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:40] http_front web_servers/web2 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:41] http_front web_servers/web3 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:41] http_front web_servers/web1 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:41] http_front web_servers/web2 200 “GET / HTTP/1.1”
[13/Jun/2026:06:21:41] http_front web_servers/web3 200 “GET / HTTP/1.1”
ログに web_servers/web1、web_servers/web2、web_servers/web3 が交互に現れており、正しくラウンドロビンが動いています。
stats 管理画面の使い方
HAProxy には組み込みの管理画面(stats ページ)があります。ブラウザで http://<サーバーIP>:8404/ にアクセスするだけで、バックエンドの状態・リクエスト数・エラー率をリアルタイムに確認できます。

画面には以下の情報が表示されます。
| 表示項目 | 意味 |
|---|---|
| Status | UP(正常)/ DOWN(障害)/ MAINT(メンテナンス中) |
| Sessions / Total | 累積リクエスト数。各バックエンドへの振り分け回数 |
| Bytes In / Out | 転送バイト数 |
| LastChk | 直近のヘルスチェック結果(L4OK: TCP接続成功) |
| Wght(Weight) | 負荷分散の重み(1/1 = 均等) |
今回の検証では web1・web2・web3 それぞれに均等(各5セッション)でリクエストが振り分けられていることが確認できました。
注意:stats ページの公開範囲
本番環境では stats ページを外部公開しないようにしましょう。設定例では stats admin if TRUE で全員に管理権限を与えていますが、本番では stats admin if { src 127.0.0.1 } のようにIPを制限するか、Basic認証を追加してください。
Ubuntu 22.04 vs 24.04 のバージョン比較
Ubuntu 22.04 と 24.04 では apt リポジトリに収録されている HAProxy のバージョンが異なります。実際に apt-cache policy haproxy で確認した結果です。

Ubuntu 22.04 の HAProxy 2.4.x はサポート終了が近いため、新規でサーバーを構築するなら Ubuntu 24.04 + HAProxy 2.8.x を選ぶことを強くお勧めします。
既存の 22.04 サーバーで最新の HAProxy を使いたい場合は、HAProxy の公式 PPA(ppa:vbernat/haproxy-2.8)を追加する方法もありますが、本記事では標準リポジトリのみ扱います。
よくあるエラーと解決策
①「cannot bind socket」エラー
haproxy.service: Control process exited, code=exited status=1
[ALERT] cannot bind socket [0.0.0.0:80]
原因:ポート80が既に他のプロセス(nginx, Apache等)に使われています。
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((“nginx”,pid=1234,fd=6))
$ sudo systemctl stop nginx
$ sudo systemctl start haproxy
(エラーなし)
②「backend has no server available」503エラー
バックエンドサーバーがすべてダウンしているときに出ます。
HTTP/1.0 503 Service Unavailable
No server is available to handle this request.
解決策:sudo systemctl status nginx でバックエンドの状態を確認し、起動していない場合は起動します。stats ページ(:8404)でどのバックエンドが DOWN になっているか確認できます。
③ 設定ファイルの構文エラー
[ALERT] parsing [/etc/haproxy/haproxy.cfg:12]: unknown keyword ‘timout’ in ‘defaults’ section
エラーメッセージに行番号が含まれます。タイポ(timout → timeout)やインデントのずれが多いです。-c で必ず検証してから reload する習慣をつけると安心です。
まとめ
UbuntuにHAProxyをインストールして負荷分散を設定する方法を解説しました。
この記事のまとめ
- Ubuntu 24.04 LTS の標準リポジトリに
haproxy 2.8.16(LTS、2028年Q2サポート)が収録されている sudo apt install -y haproxyでインストール後、/etc/haproxy/haproxy.cfgを編集するだけbalance roundrobinの1行でラウンドロビン分散が有効になる- 実測で curl × 9回のリクエストが web1→web2→web3→web1… と均等に振り分けられることを確認
- ポート 8404 の stats ページでバックエンドの状態をリアルタイムに監視できる
- 設定変更前は必ず
haproxy -f /etc/haproxy/haproxy.cfg -cで構文チェックを行う
HAProxyはVPSでWebアプリケーションを運用するときの基本ツールです。Webサーバーを複数台用意してHAProxyで分散するだけで、耐障害性が大幅に向上します。自分のVPSでぜひ試してみてください。


コメント