Skip to content

Ubuntu + HAProxy で HTTP トラフィックを負荷分散する

Linux をロードバランサーにしたい場合、LVS を利用することができます。 LVS は比較的シンプルなため、より高機能が必要な場合は HAProxy を使うことができます。 今回は Ubuntu 24.04 LTS へ HAProxy をインストールして、簡単なロードバランスを行う手順をメモします。

検証環境

対象 バージョン
Ubuntu 24.04.2 LTS
HAProxy 2.8.5

インストール

apt でインストール可能です。 インストール直後から起動していました。

apt install -y haproxy

HAProxy の設定

設定ファイルは /etc/haproxy/haproxy.cfg にあります。 3 台の Web サーバ (10.0.0.1 〜 10.0.0.3) へ HTTP トラフィックを分散する設定例は以下の通りです。 listen セクションで server web1 10.0.0.1:80 check のように定義しています。 check を指定することでヘルスチェックの対象にできます。 デフォルトで HAProxy はラウンドロビン動作をしていました。

/etc/haproxy/haproxy.cfg
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

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

listen web_proxy
    bind *:80
    option httpchk
    http-check send meth GET uri /
    http-check expect status 200
    server web1 10.0.0.1:80 check
    server web2 10.0.0.2:80 check
    server web3 10.0.0.3:80 check

設定が完了したらサービスを再起動します。

systemctl restart haproxy.service

HAProxy の動作ログ

今回の設定内容であれば HAProxy の動作ログは /var/log/haproxy.log に保存されます。 ログの内容例は以下の通りです。

/var/log/haproxy.log
2025-06-17T15:55:36.809537+09:00 ubuntu haproxy[1726]: 192.168.0.1:49278 [17/Jun/2025:15:55:36.805] web_proxy web_proxy/web1 0/0/1/1/2 304 162 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"
2025-06-17T15:55:38.413665+09:00 ubuntu haproxy[1726]: 192.168.0.1:49278 [17/Jun/2025:15:55:38.410] web_proxy web_proxy/web2 0/0/1/1/2 200 211 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"
2025-06-17T15:55:38.939441+09:00 ubuntu haproxy[1726]: 192.168.0.1:49278 [17/Jun/2025:15:55:38.935] web_proxy web_proxy/web3 0/0/1/2/3 200 211 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"

参考

/etc/haproxy/haproxy.cfg

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http