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

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
各セクションの詳細な説明は以下の通りです。
| セクション | 説明 |
|---|---|
| global | HAProxyの全体的な設定。ログ設定、ユーザー、プロセス管理などを含む |
| 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.bufsizeやtune.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




