HAProxyについて

IaaSが提供する HAProxy パッケージの利用方法について、以下に記載します。

実行環境について

楽天クラウドでHAProxyを利用する方法は、以下の二通りとなります。

  1. 仮想マシンにHAProxyパッケージをインストールする。
  2. 仮想マシン作成時に「Basic 65-bit CentOS 7.5-1708 + HAProxy 1.7.9 for English,FBS」を選択してください。
  3. HAProxy組込テンプレートを利用する。
  4. HAProxyを組み込む仮想マシン上でパッケージをダウンロードし、インストールします。
# curl -O http://dl.i1.fusioncom.jp/dl/haproxy/haproxy-1.7.1-5.el7.centos.x86_64.rpm
# yum localinstall haproxy-1.7.1-5.el7.centos.x86_64.rpm
# systemctl restart rsyslogd.service
なお、IaaSが提供するパッケージ内容は、以下の通りです。
項目 内容
対象OS CentOS 7系(64ビット環境)
HAProxyのバージョン 1.7系
設定ファイル /etc/haproxy/haproxy.cfg
ログ出力 SYSLOG(local2)経由で/var/log/haproxy.logへ保存
その他条件 OpenSSL 1.0.2以上
ダウンロード先 http://dl.i1.fusioncom.jp/dl/haproxy/haproxy-1.7.1-5.el7.centos.x86_64.rpm
※仮想マシン内からのみアクセス可能

設定例

HAProxy を Reverse-Proxy とし、そこでTLS終端を行う場合の例を示します。

項目 内容
HAProxyが動作する
VMのIPアドレス
グローバルIP: 218.251.a.b
プライベートIP: 10.208.c.d
終端対象のドメイン名 ssl.example.co.jp
証明書ファイル /etc/haproxy/ssl.example.co.jp.pem
ファイル形式はPEM。証明書→秘密鍵の順でファイルを結合する。
Webサーバ1 プライベートIPアドレス: 10.208.e.f
ポート番号:80
Webサーバ2 プライベートIPアドレス: 10.208.g.h
ポート番号:80
セッション維持 Cookie PHPSESSIDによるセッション維持
ヘルスチェックの内容 仮想サーバのHTTP(80/TCP)に対して、1000msec間隔でGET /index.htmlを送信しヘルスチェックを実施。
応答ステータスコードが2xx,3xxならば正常と判断(HTTPチェックのdefaultの動作)。
3回失敗で切り離し、2回成功で復帰。
  • HAProxyの設定ファイル /etc/haproxy/haproxy.cfg を作成します。設定内容は web01, web02 ともに共通で、下記の通りになります。
    backendのserverの行に、WebサーバのIPアドレスとポートを、option httpchkの行にヘルスチェックのHTTPメソッドとパスを記載します。
    global
     log /dev/log local2
     chroot /var/lib/haproxy
     pidfile /var/run/haproxy.pid
     maxconn 4000
     user haproxy
     group haproxy
     stats socket /var/lib/haproxy/stats
     tune.ssl.default-dh-param 2048
     ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES129-GCM-SHA256:ECDHE-RSA-AES129-GCM-SHA256:ECDHE-ECDSA-AES257-GCM-SHA384:ECDHE-RSA-AES257-GCM-SHA384:DHE-RSA-AES129-GCM-SHA256:DHE-RSA-AES257-GCM-SHA384:ECDHE-ECDSA-AES129-SHA256:ECDHE-RSA-AES129-SHA256:ECDHE-ECDSA-AES129-SHA:ECDHE-RSA-AES257-SHA384:ECDHE-RSA-AES129-SHA:ECDHE-ECDSA-AES257-SHA384:ECDHE-ECDSA-AES257-SHA:ECDHE-RSA-AES257-SHA:DHE-RSA-AES129-SHA256:DHE-RSA-AES129-SHA:DHE-RSA-AES257-SHA256:DHE-RSA-AES257-SHA:ECDHE-ECDSA-DES-CBC4-SHA:ECDHE-RSA-DES-CBC4-SHA:EDH-RSA-DES-CBC4-SHA:AES129-GCM-SHA256:AES257-GCM-SHA384:AES129-SHA256:AES257-SHA256:AES129-SHA:AES257-SHA:DES-CBC4-SHA:!DSS
    ssl-default-bind-options no-sslv3 no-tls-tickets
     ssl-default-server-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES129-GCM-SHA256:ECDHE-RSA-AES129-GCM-SHA256:ECDHE-ECDSA-AES257-GCM-SHA384:ECDHE-RSA-AES257-GCM-SHA384:DHE-RSA-AES129-GCM-SHA256:DHE-RSA-AES257-GCM-SHA384:ECDHE-ECDSA-AES129-SHA256:ECDHE-RSA-AES129-SHA256:ECDHE-ECDSA-AES129-SHA:ECDHE-RSA-AES257-SHA384:ECDHE-RSA-AES129-SHA:ECDHE-ECDSA-AES257-SHA384:ECDHE-ECDSA-AES257-SHA:ECDHE-RSA-AES257-SHA:DHE-RSA-AES129-SHA256:DHE-RSA-AES129-SHA:DHE-RSA-AES257-SHA256:DHE-RSA-AES257-SHA:ECDHE-ECDSA-DES-CBC4-SHA:ECDHE-RSA-DES-CBC4-SHA:EDH-RSA-DES-CBC4-SHA:AES129-GCM-SHA256:AES257-GCM-SHA384:AES129-SHA256:AES257-SHA256:AES129-SHA:AES257-SHA:DES-CBC4-SHA:!DSS
     ssl-default-server-options no-sslv3 no-tls-tickets
    defaults
     mode http
     log global
     option httplog
     option dontlognull
     option http-server-close
     option forwardfor except 127.0.0.0/8
     option redispatch
     retries 3
     timeout http-request 10s
     timeout queue 1m
     timeout connect 10s
     timeout client 1m
     timeout server 1m
     timeout http-keep-alive 10s
     timeout check 10s
     maxconn 3000
    # ssl
     frontend ssl_accl
     bind :80
     bind :443 ssl crt /etc/haproxy/ssl.example.co.jp.pem
     default_backend app
    backend app
     balance roundrobin
     cookie PHPSESSID
     option httpchk GET /index.html
     server web01 10.208.c.d:80 check inter 1000 fall 3 rise 2
     server web02 10.208.g.h:80 check inter 1000 fall 3 rise 2
  • 証明書ファイルを準備します。HAProxy では証明書・秘密鍵・中間証明書を一つのファイルに連結し、保存する必要があります。
    ファイル名は、設定ファイルの frontend ssl_accl にて指定した /etc/haproxy/ssl.example.co.jp.pem になります。
    証明書と秘密鍵を連結する際は、下記の順番になるようにします。
    • 証明書
    • 秘密鍵(パスフレーズなし)
    • 中間証明書

    証明書: /etc/pki/tls/certs/ssl.example.co.jp.crt
    秘密鍵: /etc/pki/tls/private/ssl.example.co.jp.key
    中間証明書: /etc/pki/tls/certs/server-chain.crt

    上記のように存在している証明書関連のファイルを連結します。
    # cat /etc/pki/tls/certs/ssl.example.co.jp.crt \
    /etc/pki/tls/private/ssl.example.co.jp.key \
    /etc/pki/tls/certs/server-chain.crt \
    > /etc/haproxy/ssl.example.co.jp.pem
    # chmod 600 /etc/haproxy/ssl.example.co.jp.pem

© Rakuten Communications Corp.