CloudStackでHAproxyを利用する

概要

3回にわたってCloudStackのVMを使ってLVS(Linux Virtual Server)を構成してみました。

  • ipvsadmを利用

CloudStackでLVS(Linux Virtual Server) - mukkun0824’s blog

  • Ldirectordを利用

CloudStackでLVS(Linux Virtual Server) -Ldirectordを利用編 - mukkun0824’s blog

CloudStackでLVS(Linux Virtual Server) -keepalivedを利用編 - mukkun0824’s blog

今回は、今までのようなL4のトランスポート層の話ではなく、L7のアプリケーション層での処理になります。したがって、バックエンド側での作業がほぼ必要なく、今までの方法よりは設定は楽です。HAproxyはその名の通りhttpリクエストを代理受付してくれます。

参考

https://www.server-world.info/query?os=CentOS_7&p=haproxy&f=1

構成

構成は全く前回と同じですが、今回はHAproxyの設定とログの設定を行います。HAproxyサーバーがhttpリクエストを処理してくれるので、送信元のヘッダ情報をバックエンド側に表示させる必要があります。これをforwarderの設定といいますが、「X-Forwarded-For」の設定もHAproxy上とバックエンドサーバーのhttpd.confで行います。まあVIPを設定する必要もないのですが、前回のまま付けています。

                         (internet)
                             |
                             | グローバルIP
                   +---------+-----------+
                   |  Virtual Router     |
                   +---------+-----------+
                             | 192.168.0.1/24 GW
                             |
                             |
                             |
                         eth0|192.168.0.223/24
                      eth0:0 |192.168.0.100/24
                       +-----------+
                       |  HAproxy  |
                       |           |
                       +-----+-----+
                             |
+------------+               |                 +------------+
|  Backend01 |192.168.0.62/24| 192.168.0.243/24|  Backend02 |
| Web Server +------------+--------------------+ Web Server |
|            |eth0                        eth0 |            |
+------------+                                 +------------+

HAProxyインストール・設定

念のためhostsに追加しておきます

[root@mukkun-haproxy-server ~]# cat /etc/hosts
192.168.0.223 mukkun-haproxy-server
192.168.0.62 mukkun-backend-1
192.168.0.243 mukkun-backend-2


yum -y install haproxy
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org

設定ファイルを編集します

vi /etc/haproxy/haproxy.cfg
global
      # ログの出力先とログレベル
    log         127.0.0.1 local2 info
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
      # プロセス毎の最大接続数
    maxconn     256
      # 実行ユーザー/グループ
    user        haproxy
    group       haproxy
      # デーモンとして起動
    daemon

defaults
      # レイヤー7で負荷分散
    mode               http
      # ログ設定は global を継承
    log                global
      # HTTP リクエストログ取得
    option             httplog
      # バックエンドが応答しない場合のタイムアウト時間
    timeout connect    10s
      # クライアントサイドのタイムアウト時間
    timeout client     30s
      # サーバーサイドのタイムアウト時間
    timeout server     30s

# フロントエンドを定義 ( http-in の箇所は任意の名前 )
frontend http-in
      # 80ポートで待ち受け
    bind *:80
      # デフォルトのバックエンドを定義
    default_backend    backend_servers
      # X-Forwarded-For ヘッダーを渡す
    option             forwardfor

# バックエンドを定義
backend backend_servers
      # ラウンドロビンで負荷分散
    balance            roundrobin
      # バックエンドサーバーを定義
    server             mukkun-backend-1 192.168.0.62:80 check
    server             mukkun-backend-2 192.168.0.243:80 check

サービス起動します

systemctl start haproxy

ログを取得できるようにrsyslog修正

vi /etc/rsyslog.conf

15,16行目:コメント解除, 17行目:追記
$ModLoad imudp
$UDPServerRun 514
$AllowedSender UDP, 127.0.0.1

54行目:以下のように変更
*.info;mail.none;authpriv.none;cron.none,local2.none   /var/log/messages
local2.*                                                /var/log/haproxy.log

サービス再起動します。

systemctl restart rsyslog

BackEndServer:設定

バックエンドサーバーのhttpもログ変更

vi /etc/httpd/conf/httpd.conf
# 196行目:変更
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

サービス再起動します。

systemctl restart httpd

これで前と同じようにグローバルIPでWebアクセスすると2台に負荷分散されます。