HAproxy

提供: ArchWiki
2024年9月10日 (火) 18:06時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎ヘルスチェック: 記事を追加)
ナビゲーションに移動 検索に移動

HAProxy は、高可用性、負荷分散、TCP および HTTP ベースのアプリケーションのプロキシを提供する、無料の非常に高速で信頼性の高いソリューションです。特にトラフィック量の多い Web サイトに適しており、世界で最もアクセス数の多い Web サイトの多くをサポートします。長年にわたり、これは事実上の標準のオープンソース ロード バランサーとなり、現在ではほとんどの主流の Linux ディストリビューションに同梱されており、多くの場合、クラウド プラットフォームにデフォルトでデプロイされています。

インストール

haproxy パッケージをインストールしてください。

実行

systemd を使って haproxy.service を有効化してください。HAProxy の設定は # systemctl reload haproxy.service を使うことで動的にリロードすることができます。

設定

サンプル設定は /etc/haproxy/haproxy.cfg にあります。必要に応じて編集して haproxy.service を起動してください。

一般的な設定

ACL

HAProxy は ACL に対応しており、テストを行なったり、テストの結果にあわせて特定のアクションを起こすことができます。典型的な ACL は以下のように記述します:

/etc/haproxy/haproxy.cfg
acl photo_page path_beg /photos

上記の場合、ユーザーのリクエストしたパスの先頭が /photos の場合に ACL がマッチします。

バックエンド

HAProxy では、バックエンドは転送されたリクエストを受信するサーバーあるいはサーバー群を示す用語です。様々な ロードバランスアルゴリズム に基づいてバックエンドで負担を分散させることができます:

  • ラウンドロビン
  • 静的ラウンドロビン (別名、加重ラウンドロビン)
  • 最小接続

例えば以下のようにバックエンドを記述します:

/etc/haproxy/haproxy.cfg
backend http-in
   balance roundrobin
   server s1 web1.example.com:80 check
   server s2 web2.example.com:80 check

フロントエンド

フロントエンドはどうやってバックエンドにリクエストを転送するか定義します。定義は以下からなります:

  • IP アドレスとポート
  • ACL
  • use_backend ルール

ヘルスチェック

バックエンドを check オプションで宣言すると、HAProxy は起動時・定期的にバックエンドが転送されたリクエストを処理できているかどうか確認します。バックエンドがヘルスチェックに通らなかった場合、健康状態に回復したと診断されるまで (つまりヘルスチェックに合格するまで) ローテーションから削除されます。

デフォルトでは、HAProxy はバックエンドと TCP 接続の確立を試行して健康度を確かめます。

check オプションで大量のバックエンドを宣言した場合、HAProxy は起動時に全てのバックエンドにクエリを投げるので、起動が遅くなることがあります。

systemd を使用したロギング

HAproxy を systemd の /dev/log 互換ソケットを使用するように設定するには、global セクションの下に次の設定を追加します。

log /dev/log local0 info

chroot オプションをグローバル設定で使用している場合、ソケットを chroot にバインドする必要があります。

これには systemd.mount(5) ユニットを使用します。次のコマンドでユニット名を生成します:

# systemd-escape --suffix=mount --path /var/lib/haproxy/dev/log

journald の起動後すぐに /dev/log を chroot にマウントしたいので、ユニットファイルを置換する を作成します:

/etc/systemd/system/var-lib-haproxy-dev-log.mount
[Unit]
Requires=systemd-journald.service
Description=/Expose Systemd Log for HAProxy

[Mount]
What=/dev/log
Where=/var/lib/haproxy/dev/log
Type=none
Options=bind

このマウントファイルが作成されたら、元のサービスユニットを拡張して、すべてが正しくマウントされるようにします。haproxy.service 用のドロップインファイルを使用し、次を追加します:

/etc/systemd/system/haproxy.service.d/override.conf
[Unit]
Requires=var-lib-haproxy-dev-log.mount

TLS/SSL 終端処理の実行

haproxy を TLS 終端装置として使用するには、frontend セクション内で次を設定します。

bind :80
bind :443 ssl crt /path/to/combined/cert
ノート: 証明書を生成するには、cat certificate-full-chain certificate-private-key > combined-cert コマンドを実行します。
ヒント: HTTP/2 をサポートに追加するには、bind :443 行の末尾に alpn h2,http/1.1 を追加します。
HTTP を HTTPS にリダイレクトする

frontend セクションに次を設定します。

redirect scheme https code 301 if !{ ssl_fc }

仮想ホストのような設定

foo と bar の 2 つのバックエンドがあり、それぞれ特定のドメインのリクエストのみを処理する必要があると仮定します。 これを実行するには、frontend セクションで次のように設定できます。

use_backend foo-backend if { hdr(host) -i foo.example.com || hdr(host) -i www.foo.example.com }
use_backend bar-backend if { hdr(host) -i bar.example.com || hdr(host) -i www.bar.example.com }

参照