HAProxy入門|オンプレ環境のLBを設定する実践手順

HAProxyを使ってオンプレミス環境にロードバランサーを構築する方法を、具体的な手順と設定例で解説します。本記事では、HAProxyの基本的な仕組みから、実運用に耐える設定までを網羅的に紹介します。サーバーの負荷分散を実現し、システムの可用性とパフォーマンスを向上させましょう。

目次

HAProxyとは何か

ロードバランサーの基礎知識

HAProxyの特徴とメリット

HAProxyのインストー…

Linux環境へのインスト…

HAProxyの基本設定フ…

実践的なロードバランサー設定

HTTP/HTTPSの負荷…

TCP/UDPの負荷分散設定

ヘルスチェックとフェイルオ…

HAProxyの運用と最適化

パフォーマンスチューニング

ログ管理と監視設定

セキュリティ対策

HAProxyのトラブルシ…

一般的なエラーと解決方法

パフォーマンス低下時の対処法

HAProxyとは何か

HAProxyは、高性能なオープンソースのロードバランサーであり、TCP/HTTPベースのアプリケーションに対して、リアルタイムの負荷分散と高可用性を提供します。オンプレミス環境でHAProxyを導入することで、サーバーリソースの効率的な活用とシステムの安定稼働を実現できます。

HAProxyは、2000年代初頭にWilly Tarreau氏によって開発され、現在では世界中の大規模Webサイトや企業システムで採用されています。特に、高い同時接続性能と低レイテンシが求められる環境でその真価を発揮します。

ロードバランサーの基礎知識

ロードバランサーは、複数のサーバーに対してクライアントからのリクエストを分散させることで、システム全体のパフォーマンスと可用性を向上させる役割を担います。主な機能は以下の通りです。

機能説明
負荷分散複数のバックエンドサーバーにリクエストを均等に分配する
ヘルスチェックバックエンドサーバーの健康状態を監視し、不健康なサーバーへのリクエストを停止する
SSL/TLS終端暗号化されたトラフィックを復号し、バックエンドサーバーへの負荷を軽減する
セッション維持特定のクライアントからのリクエストを常に同じバックエンドサーバーに振り分ける
レイヤー4/7対応TCP(レイヤー4)やHTTP/HTTPS(レイヤー7)レベルでの負荷分散が可能

ロードバランサーには、ハードウェア型とソフトウェア型がありますが、HAProxyはソフトウェア型に分類されます。ソフトウェア型はコストが低く、柔軟なカスタマイズが可能なため、オンプレミス環境での導入に適しています。

HAProxyの特徴とメリット

HAProxyを選択する主なメリットは以下の通りです。

  • 高性能: C言語で実装されており、高い同時接続性能(1秒あたり数万〜数十万の接続)を実現
  • 柔軟な設定: 細かなルール設定が可能で、複雑な負荷分散シナリオに対応
  • 軽量: リソース消費が少なく、低スペックのサーバーでも動作可能
  • 豊富なプロトコル対応: HTTP/HTTPS、TCP、UDP、WebSocketなど多様なプロトコルに対応
  • オープンソース: 無償で利用でき、コミュニティサポートも充実
  • 高可用性: マルチスレッドアーキテクチャにより、シングルポイント障害を回避

HAProxyは、特にWebサーバーやAPIサーバーの負荷分散に適しており、オンプレミス環境での導入実績も豊富です。例えば、GitHub、Stack Overflow、Redditなどの大規模サイトでもHAProxyが採用されています。

HAProxyのインストー…

HAProxyをオンプレミス環境に導入するには、まずLinuxサーバーへのインストールが必要です。本セクションでは、Ubuntu/DebianおよびCentOS/RHEL環境へのインストール手順と、基本的な設定方法を解説します。

Linux環境へのインスト…

HAProxyは、公式リポジトリまたはソースコードからインストールできます。以下に、主要なLinuxディストリビューションごとのインストール手順を示します。

Ubuntu/Debian環境

Ubuntu/Debianでは、APTパッケージマネージャーを使用してHAProxyをインストールできます。

# パッケージリストの更新
sudo apt update

HAProxyのインストール

sudo apt install haproxy -y

インストール確認

haproxy -v

最新バージョンのHAProxyを使用したい場合は、公式リポジトリを追加します。

# 公式リポジトリの追加
sudo add-apt-repository ppa:vbernat/haproxy-2.6 -y
sudo apt update

HAProxyのインストール

sudo apt install haproxy=2.6.* -y

CentOS/RHEL環境

CentOS/RHELでは、yum/dnfパッケージマネージャーを使用します。HAProxyはEPELリポジトリに含まれています。

# EPELリポジトリの有効化
sudo dnf install epel-release -y

HAProxyのインストール

sudo dnf install haproxy -y

インストール確認

haproxy -v

最新バージョンを使用したい場合は、公式リポジトリを追加します。

# 公式リポジトリの追加
sudo tee /etc/yum.repos.d/haproxy.repo <HAProxyのインストール
sudo dnf install haproxy -y

ソースコードからのインストール

特定のバージョンやカスタムビルドが必要な場合は、ソースコードからインストールできます。

# 必要な依存パッケージのインストール
sudo apt install build-essential zlib1g-dev libssl-dev -y

HAProxyのソースコードをダウンロード

wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.12.tar.gz tar xzvf haproxy-2.6.12.tar.gz cd haproxy-2.6.12

コンパイルとインストール

make TARGET=linux-glibc sudo make install

ソースコードからインストールした場合は、実行ファイルが/usr/local/sbin/haproxyに配置されます。

HAProxyの基本設定フ…

HAProxyの設定は、主に/etc/haproxy/haproxy.cfgファイルで管理されます。このファイルは、グローバル設定、デフォルト設定、フロントエンド設定、バックエンド設定の4つの主要なセクションで構成されています。

以下に、基本的な設定ファイルの構造を示します。

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    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

frontend http-in
    bind *:80
    default_backend servers

backend servers
    balance roundrobin
    server server1 192.168.1.10:80 check
    server server2 192.168.1.11:80 check

各セクションの詳細な説明は以下の通りです。

セクション説明
globalHAProxyの全体的な設定。ログ設定、ユーザー、プロセス管理などを含む
defaults全てのフロントエンドとバックエンドに適用されるデフォルト設定
frontendクライアントからのリクエストを受け付けるエントリーポイント。ポートやIPアドレスのバインド、ルーティングルールを定義
backendバックエンドサーバーの設定。負荷分散アルゴリズム、サーバーのリスト、ヘルスチェックなどを含む

設定ファイルを編集した後は、HAProxyを再起動して変更を反映させます。

sudo systemctl restart haproxy

実践的なロードバランサー設定

HAProxyを使って実際にロードバランサーを構築するには、HTTP/HTTPSやTCP/UDPの負荷分散設定、ヘルスチェック、フェイルオーバーなどの実践的な設定が必要です。本セクションでは、これらの設定方法を具体的な例を交えて解説します。

HTTP/HTTPSの負荷…

HTTP/HTTPSの負荷分散は、Webサーバーやアプリケーションサーバーの負荷を分散するために広く使用されています。HAProxyを使ったHTTP/HTTPSの負荷分散設定には、以下のような要素が含まれます。

  • フロントエンドのバインド設定(HTTP/HTTPSポート)
  • SSL/TLS終端設定(HTTPSの場合)
  • バックエンドサーバーの負荷分散アルゴリズム
  • ヘルスチェック設定
  • セッション維持設定

以下に、HTTPとHTTPSの負荷分散設定例を示します。

HTTP負荷分散設定

HTTP負荷分散の基本的な設定例です。ポート80でリクエストを受け付け、2台のWebサーバーに負荷を分散します。

frontend http-in
    bind *:80
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

この設定では、以下の点に注意してください。

  • balance roundrobin: ラウンドロビン方式で負荷を分散します。
  • option httpchk GET /health: HTTPヘルスチェックを実施し、/healthエンドポイントに対してGETリクエストを送信します。
  • check: サーバーのヘルスチェックを有効にします。

HTTPS負荷分散設定

HTTPS負荷分散では、SSL/TLS終端をHAProxyで行うことで、バックエンドサーバーの負荷を軽減できます。以下に設定例を示します。

まず、SSL/TLS証明書を準備します。証明書は、PEM形式で保存します。

# SSL/TLS証明書の配置
sudo mkdir -p /etc/haproxy/certs
sudo cp yourdomain.com.pem /etc/haproxy/certs/

次に、HAProxyの設定ファイルを編集します。

frontend https-in
    bind *:443 ssl crt /etc/haproxy/certs/yourdomain.com.pem
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

この設定では、以下の点に注意してください。

  • bind *:443 ssl crt /etc/haproxy/certs/yourdomain.com.pem: SSL/TLSを有効にし、証明書を指定します。
  • バックエンドサーバーはHTTP(ポート80)で動作していますが、HAProxyがSSL/TLSを終端するため、バックエンドサーバーへの通信は暗号化されません。バックエンドサーバー間の通信を暗号化したい場合は、バックエンドサーバー間でもHTTPSを使用します。

SSL/TLS証明書には、自己署名証明書やLet’s Encryptなどの認証局から発行された証明書を使用できます。Let’s Encryptを使用する場合は、certbotを使って証明書を取得します。

# certbotのインストール
sudo apt install certbot -y

証明書の取得

sudo certbot certonly --standalone -d yourdomain.com

証明書の配置

sudo cp /etc/letsencrypt/live/yourdomain.com/fullchain.pem /etc/haproxy/certs/yourdomain.com.pem sudo cp /etc/letsencrypt/live/yourdomain.com/privkey.pem /etc/haproxy/certs/yourdomain.com.pem

TCP/UDPの負荷分散設定

HAProxyは、TCP/UDPベースのプロトコルにも対応しており、データベースサーバーやメッセージキューなどの負荷分散に使用できます。TCP/UDPの負荷分散設定は、HTTP/HTTPSと比較してシンプルです。

以下に、TCPとUDPの負荷分散設定例を示します。

TCP負荷分散設定

TCP負荷分散は、主にデータベースサーバーやRedisなどのメモリキャッシュサーバーの負荷分散に使用されます。以下に、MySQLサーバーの負荷分散設定例を示します。

frontend mysql-in
    bind *:3306
    default_backend mysql_servers

backend mysql_servers
    balance roundrobin
    option tcp-check
    server mysql1 192.168.1.20:3306 check
    server mysql2 192.168.1.21:3306 check

この設定では、以下の点に注意してください。

  • bind *:3306: TCPポート3306でリクエストを受け付けます。
  • option tcp-check: TCPレベルのヘルスチェックを有効にします。
  • check: サーバーのヘルスチェックを有効にします。

UDP負荷分散設定

UDP負荷分散は、主にDNSサーバーやSyslogサーバーなどの負荷分散に使用されます。以下に、DNSサーバーの負荷分散設定例を示します。

frontend dns-in
    bind *:53
    default_backend dns_servers

backend dns_servers
    balance roundrobin
    option udp-check
    server dns1 192.168.1.30:53 check
    server dns2 192.168.1.31:53 check

この設定では、以下の点に注意してください。

  • bind *:53: UDPポート53でリクエストを受け付けます。
  • option udp-check: UDPレベルのヘルスチェックを有効にします。
  • check: サーバーのヘルスチェックを有効にします。

ヘルスチェックとフェイルオ…

ヘルスチェックは、バックエンドサーバーの健康状態を監視し、不健康なサーバーへのリクエストを停止する機能です。HAProxyでは、HTTP、TCP、UDPなどのプロトコルに対応したヘルスチェックを設定できます。

フェイルオーバーは、プライマリサーバーがダウンした際に、セカンダリサーバーに自動的に切り替える機能です。HAProxyでは、ヘルスチェックと組み合わせてフェイルオーバーを実現できます。

HTTPヘルスチェック

HTTPヘルスチェックは、HTTPリクエストを送信してレスポンスを確認することで、サーバーの健康状態を判定します。以下に、HTTPヘルスチェックの設定例を示します。

backend web_servers
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

この設定では、以下の点に注意してください。

  • option httpchk GET /health: /healthエンドポイントに対してGETリクエストを送信します。
  • http-check expect status 200: レスポンスステータスが200であることを期待します。
  • check: サーバーのヘルスチェックを有効にします。

ヘルスチェックの間隔やタイムアウトは、以下のパラメータで設定できます。

  • inter: ヘルスチェックの間隔(デフォルト: 2000ms)
  • rise: サーバーが健康と判定されるまでの連続成功回数(デフォルト: 2)
  • fall: サーバーが不健康と判定されるまでの連続失敗回数(デフォルト: 3)
  • timeout: ヘルスチェックのタイムアウト(デフォルト: 2000ms)

例えば、ヘルスチェックの間隔を5秒、タイムアウトを3秒に設定する場合は、以下のように記述します。

backend web_servers
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 192.168.1.10:80 check inter 5000ms rise 2 fall 3 timeout 3000ms
    server web2 192.168.1.11:80 check inter 5000ms rise 2 fall 3 timeout 3000ms

TCP/UDPヘルスチェック

TCP/UDPヘルスチェックは、TCP/UDP接続を試行し、接続の成功/失敗を確認することで、サーバーの健康状態を判定します。以下に、TCPヘルスチェックの設定例を示します。

backend mysql_servers
    balance roundrobin
    option tcp-check
    tcp-check connect port 3306
    tcp-check expect string 'MySQL'
    server mysql1 192.168.1.20:3306 check inter 5000ms rise 2 fall 3 timeout 3000ms
    server mysql2 192.168.1.21:3306 check inter 5000ms rise 2 fall 3 timeout 3000ms

この設定では、以下の点に注意してください。

  • option tcp-check: TCPレベルのヘルスチェックを有効にします。
  • tcp-check connect port 3306: TCPポート3306への接続を試行します。
  • tcp-check expect string 'MySQL': 接続後にサーバーからのレスポンスに’MySQL’という文字列が含まれることを期待します。

フェイルオーバー設定

フェイルオーバーを実現するには、バックエンドサーバーをプライマリとセカンダリに分け、プライマリサーバーがダウンした際にセカンダリサーバーに切り替えるように設定します。以下に、フェイルオーバーの設定例を示します。

backend web_servers
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 192.168.1.10:80 check port 8080 backup
    server web2 192.168.1.11:80 check

この設定では、以下の点に注意してください。

  • backup: web1サーバーをバックアップサーバーとして設定します。web2サーバーが健康な間は、web1サーバーにはリクエストが送信されません。
  • web2サーバーがダウンした際には、自動的にweb1サーバーにリクエストが送信されます。

HAProxyの運用と最適化

HAProxyを本番環境で運用するには、パフォーマンスチューニング、ログ管理、監視設定、セキュリティ対策などの運用管理が不可欠です。本セクションでは、HAProxyの運用と最適化に関する具体的な手法を解説します。

パフォーマンスチューニング

HAProxyのパフォーマンスを最大限に引き出すには、設定の最適化が必要です。主なチューニングポイントは以下の通りです。

  • 同時接続数の増加
  • メモリ使用量の最適化
  • CPU使用率の最適化
  • ネットワーク設定の最適化

同時接続数の増加

HAProxyの同時接続数は、maxconnパラメータで設定できます。この値を増やすことで、より多くの同時接続を処理できるようになります。

例えば、フロントエンドとバックエンドの同時接続数を10,000に設定する場合は、以下のように記述します。

frontend http-in
    bind *:80
    maxconn 10000
    default_backend web_servers

backend web_servers
    balance roundrobin
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check
    maxconn 10000

また、システム全体の同時接続数を増やすには、カーネルパラメータの調整が必要です。以下に、主なカーネルパラメータの設定例を示します。

# /etc/sysctl.confの編集
echo "net.core.somaxconn = 65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" | sudo tee -a /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 5000" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 15" | sudo tee -a /etc/sysctl.conf

設定の反映

sudo sysctl -p

メモリ使用量の最適化

HAProxyのメモリ使用量は、tune.bufsizetune.maxrewriteなどのパラメータで最適化できます。これらのパラメータを調整することで、メモリ使用量を削減し、パフォーマンスを向上させることができます。

例えば、バッファサイズを16KBに設定する場合は、以下のように記述します。

global
    tune.bufsize 16384
    tune.maxrewrite 1024

また、HAProxyのメモリ使用量を監視するには、stats機能を使用します。stats機能を有効にするには、設定ファイルに以下の行を追加します。

global
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners

次に、stats機能を使用してメモリ使用量を確認します。

echo "show info" | sudo socat /run/haproxy/admin.sock stdio | grep -i memory

CPU使用率の最適化

HAProxyはマルチスレッドアーキテクチャを採用しており、CPU使用率を最適化するには、nbthreadパラメータでスレッド数を設定します。スレッド数は、CPUコア数に合わせて設定することを推奨します。

例えば、8コアのCPUを搭載したサーバーでHAProxyを実行する場合は、以下のように記述します。

global
    nbthread 8

また、CPU使用率を監視するには、stats機能を使用します。

echo "show info" | sudo socat /run/haproxy/admin.sock stdio | grep -i cpu

ネットワーク設定の最適化

ネットワーク設定の最適化には、以下のような手法があります。

  • TCP Fast Openの有効化: TCP接続の確立時間を短縮します。
  • TCP_NODELAYの有効化: Nagleアルゴリズムを無効にし、小さなパケットの送信を即座に行います。
  • SO_REUSEPORTの有効化: 複数のHAProxyプロセスで同じポートを共有します。

例えば、TCP Fast OpenとTCP_NODELAYを有効にするには、以下のように記述します。

frontend http-in
    bind *:80
    tcp-request inspect-delay 5s
    tcp-request content accept if HTTP
    option tcp-smart-connect
    option tcpka
    option http-server-close

また、カーネルパラメータの調整も必要です。

# /etc/sysctl.confの編集
echo "net.ipv4.tcp_fastopen = 3" | sudo tee -a /etc/sysctl.conf

設定の反映

sudo sysctl -p

ログ管理と監視設定

HAProxyのログ管理と監視設定は、システムのトラブルシューティングやパフォーマンス分析に不可欠です。HAProxyでは、ログをsyslog経由で出力することができ、ログローテーションや監視ツールとの連携が可能です。

ログ設定

HAProxyのログ設定は、globalセクションで行います。以下に、ログ設定の例を示します。

global
    log /dev/log local0 info
    log /dev/log local1 notice

この設定では、以下の点に注意してください。

  • local0およびlocal1: syslogのファシリティ
    【編集・制作ポリシー】
    本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
    ABOUT ME
    たから
    サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営