読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

【VPS1台でインフラ勉強】HAProxyでロードバランサーを構築

インフラ Linux HAProxy VPS vagrant ロードバランサ

前回の【VPS1台でインフラ勉強】サーバ複数台構成、Nginxでリバースプロキシ構築に続き、同様の環境を用いて、ロードバランサ構築を行った。
ロードバランサの構築にはHAProxyを利用した。

1. 環境

前回同様で、さくらVPSの1GBのプラン1台のみ。
・メモリ:1GB
・CPU:仮想2コア
・HDD:100GB
・OS:CentOS7
・サーバ仮想化:Vagrant(Utuntu13)
・ロードバランサ:HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer

2. 構成図

f:id:mosuke5:20141109170337p:plain

3. ロードバランサの構築

■ホストサーバ側の設定

#HAProxyインストール
$ sudo yum install haproxy

#設定はすごく簡単で以下のファイルのみ。実際に
$ sudo vim /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global

    log         127.0.0.1 local6 debug

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults

    ##ロードバランサの動作モード。tcpにするとL4ロードバランサになる。httpにするとL7ロードバランサ。
    mode                    http
    log                     global
    option              log-health-checks
    option                  httplog
    option                  dontlognull
    
    ##ヘルスチェック用のhtmlファイルをWebサーバ側に設置している。設置については後述。
    option httpchk GET /health_check.html HTTP/1.0\r\nUser-agent:\ Proxy-Check

    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

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    default_backend             hoge

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend hoge
    balance     roundrobin
    server      web10 192.168.33.10:80 check inter 3000 fall 2 rise 2
    server      web11 192.168.33.11:80 check inter 3000 fall 2 rise 2

L4, L7のロードバランサについては以下参照。
ロードバランサの本質(1):パケットフローから負荷分散の基本を理解する - @IT

ロードバランサ側でhttpのリクエストを返していないことを意味づけるためにapache, nginxを停止しておく。
(特に意味は無いが念押し確認のため)

$ sudo systemctl stop nginx
$ sudo systemctl stop httpd

HAProxyのログをsyslogに残すように設定する。
ただしメインのmessageではなく、独自のファイルに書くために以下の設定。

##ログの格納場所作成
$ sudo mkdir /var/log/haproxy

##syslogの設定変更
$ vim /etc/rsyslog.d/haproxy.conf
   $ModLoad imudp
   $UDPServerRun 514
   $template Haproxy,"%msg%\n"
   local6.* -/var/log/haproxy/haproxy.log;Haproxy

$ vim /etc/sysconfig/rsyslog
以下を追加
SYSLOGD_OPTIONS="-r"

## haproxyの起動
$ sudo systemctl start haproxy


■Webサーバの設定
仮想でのWebサーバ構築は省くが、Apache2をインストールしただけである。
仮想でのサーバ構築は前回を参照。
【VPS1台でインフラ勉強】サーバ複数台構成、Nginxでリバースプロキシ構築

## /var/www/html配下にヘルスチェック用のhtml設置
$ sudo touch health_check.html

4. 動作試験

ブラウザよりホストサーバへアクセス。
きちんとロードバランスされていることを確認。

HAProxy側のログは以下のとおり。

$ sudo tail -f /var/log/haproxy/haproxy.conf

##起動した時。L7のhealt checkが走っている
Proxy main started.
Proxy hoge started.
Health check for server hoge/web10 succeeded, reason: Layer7 check passed, code: 200, info: "OK", check duration: 33ms, status: 2/2 UP.
Health check for server hoge/web11 succeeded, reason: Layer7 check passed, code: 200, info: "OK", check duration: 12ms, status: 2/2 UP.

##webサーバ側でapacheを停止
Health check for server hoge/web11 failed, reason: Layer7 wrong status, code: 404, info: "Not Found", check duration: 13ms, status: 1/2 UP.
Health check for server hoge/web11 failed, reason: Layer7 wrong status, code: 404, info: "Not Found", check duration: 8ms, status: 0/2 DOWN.

##webサーバ側でhealth_check.htmlを削除した時も同様に
Health check for server hoge/web11 failed, reason: Layer7 wrong status, code: 404, info: "Not Found", check duration: 13ms, status: 1/2 UP.
Health check for server hoge/web11 failed, reason: Layer7 wrong status, code: 404, info: "Not Found", check duration: 8ms, status: 0/2 DOWN.

##webサーバ側でhealth_check.htmlを復活させた時
Health check for server hoge/web11 succeeded, reason: Layer7 check passed, code: 200, info: "OK", check duration: 8ms, status: 1/2 DOWN.
Health check for server hoge/web11 succeeded, reason: Layer7 check passed, code: 200, info: "OK", check duration: 6ms, status: 2/2 UP.
Server hoge/web11 is UP. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.

Webサーバ側のApacheログを見てみると。

$ sudo tail -f /var/log/apache2/access.log

##ロードバランサからのヘルスチェックが来ていることがわかる。
192.168.33.1 - - [09/Nov/2014:08:07:43 +0000] "GET /health_check.html HTTP/1.0" 200 276 "-" "Proxy-Check"
192.168.33.1 - - [09/Nov/2014:08:07:46 +0000] "GET /health_check.html HTTP/1.0" 200 276 "-" "Proxy-Check"
192.168.33.1 - - [09/Nov/2014:08:07:49 +0000] "GET /health_check.html HTTP/1.0" 200 276 "-" "Proxy-Check"
192.168.33.1 - - [09/Nov/2014:08:07:52 +0000] "GET /health_check.html HTTP/1.0" 200 276 "-" "Proxy-Check"

##Webからのアクセスが来た場合
##SorceのIPはロードバランサにIPになっているが、UserAgentなど書き込まれていることを確認。
192.168.33.1 - - [09/Nov/2014:08:10:06 +0000] "GET / HTTP/1.1" 200 488 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25"