UbuntuにHAProxyを構築して負荷分散する方法

サーバー構築

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.cfg
  • balance roundrobin の1行でラウンドロビン分散が設定できる
  • ポート8404の stats ページでリアルタイムにバックエンドの状態を確認できる
  • curl × 9回のテストで web1 → web2 → web3 → web1 … と均等に振り分けられることを実証

目次

  1. HAProxy とは何か
  2. HAProxy のインストール
  3. 設定ファイルの書き方(haproxy.cfg)
  4. ラウンドロビン動作の確認
  5. stats 管理画面の使い方
  6. Ubuntu 22.04 vs 24.04 のバージョン比較
  7. よくあるエラーと解決策
  8. まとめ

HAProxy とは何か

HAProxy(HA Proxy)は、TCP/HTTPトラフィックを複数のサーバーに振り分けるロードバランサーです。GitHubやRedditなど大規模サービスでも使われており、高スループットと低レイテンシを両立しています。

主な役割は2つです。

  • 負荷分散(Load Balancing):リクエストを複数のバックエンドサーバーに振り分け、1台に集中するのを防ぐ
  • 高可用性(High Availability):バックエンドの1台が落ちても、残りのサーバーへ自動的に切り替える
HAProxy 負荷分散の構成図(illustrative)
HAProxy 負荷分散の構成図(illustrative)

図のように、クライアントからのリクエストはすべてHAProxyが受け取り、バックエンドのサーバー群に順番に振り分けます。外部からはHAProxyのIPアドレスしか見えないため、バックエンドの台数を動的に増減できます。

HAProxy のインストール

手順1:前提環境を確認する

動作確認済み環境

本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04 でも動作しますが、インストールされる HAProxy のバージョンが異なります(後述の比較表を参照)。




ubuntu@server: ~
$ lsb_release -a
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 を実行します。これをやらないと古いバージョンが入ってしまうことがあります。




ubuntu@server: ~
$ sudo 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 をインストールする




ubuntu@server: ~
$ sudo apt install -y 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) …
apt install haproxy の実行ログ(Ubuntu 24.04、実測)
apt install haproxy の実行ログ(Ubuntu 24.04、実測)

インストールが完了したら、バージョンを確認します。




ubuntu@server: ~
$ haproxy -v
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:サービスを有効化・起動する




ubuntu@server: ~
$ sudo systemctl enable haproxy –now
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 で編集してください。

haproxy.cfg の設定ファイル(実測)
haproxy.cfg の設定ファイル(実測)



/etc/haproxy/haproxy.cfg
global
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 を書いておくことが重要です。これがないとコネクションが使いまわされて、同じバックエンドにリクエストが偏ることがあります。ラウンドロビンを使うなら必ず入れましょう。

設定を反映する




ubuntu@server: ~
$ sudo haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid

$ sudo systemctl reload haproxy
(出力なし:正常に反映)

-c オプションで設定ファイルの文法チェックを先に行うのが定番です。Configuration file is valid と出たら reload します。

ラウンドロビン動作の確認

実際に3台のバックエンドを起動して、HAProxy がリクエストを均等に振り分けることを確認します。以下は Dockerで実際に計測した結果です。




ubuntu@server: ~
$ for i in $(seq 1 9); do curl -s http://localhost/; echo; done
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
ラウンドロビン動作確認 curl × 9回(実測)
ラウンドロビン動作確認 curl × 9回(実測)

9回のリクエストが web1 → web2 → web3 → web1 … と3台に均等に振り分けられています。これがラウンドロビン(round-robin)です。

HAProxy のアクセスログでも確認できます。




ubuntu@server: ~
$ sudo journalctl -u haproxy –no-pager | tail -9
[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/web1web_servers/web2web_servers/web3 が交互に現れており、正しくラウンドロビンが動いています。

stats 管理画面の使い方

HAProxy には組み込みの管理画面(stats ページ)があります。ブラウザで http://<サーバーIP>:8404/ にアクセスするだけで、バックエンドの状態・リクエスト数・エラー率をリアルタイムに確認できます。

HAProxy 統計管理画面(stats ページ、実撮影)
HAProxy 統計管理画面(stats ページ、実撮影)

画面には以下の情報が表示されます。

表示項目 意味
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 vs 24.04 HAProxy バージョン比較(実測)
Ubuntu 22.04 vs 24.04 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」エラー




ubuntu@server: ~
$ sudo systemctl start haproxy
haproxy.service: Control process exited, code=exited status=1
[ALERT] cannot bind socket [0.0.0.0:80]

原因:ポート80が既に他のプロセス(nginx, Apache等)に使われています。




ubuntu@server: ~
$ sudo ss -tlnp | grep :80
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エラー

バックエンドサーバーがすべてダウンしているときに出ます。




ubuntu@server: ~
$ curl -v http://localhost/
HTTP/1.0 503 Service Unavailable
No server is available to handle this request.

解決策:sudo systemctl status nginx でバックエンドの状態を確認し、起動していない場合は起動します。stats ページ(:8404)でどのバックエンドが DOWN になっているか確認できます。

③ 設定ファイルの構文エラー




ubuntu@server: ~
$ sudo haproxy -f /etc/haproxy/haproxy.cfg -c
[ALERT] parsing [/etc/haproxy/haproxy.cfg:12]: unknown keyword ‘timout’ in ‘defaults’ section

エラーメッセージに行番号が含まれます。タイポ(timouttimeout)やインデントのずれが多いです。-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でぜひ試してみてください。

コメント

タイトルとURLをコピーしました