CentOS 6.6 - HAProxyでWebサーバを冗長化してみた。

Webサイトの開設に伴い、レンタルサーバを借りることにしました。レンタルサーバには、他の人とサーバリソースをシェアする共用型とサーバリソースを専有して使える専用型があるそうです。

 

サーバをレンタルするにあたり、私には2の条件ありました。

1.root権限がある

2.月額費用が1万円以下

共用型では、条件①をクリアできませんでした。なので専用型を借りようとおもっていたのですが条件②をクリアできない・・・専用サーバって、初期費用とか月額費用とかお高いんですね。

 

root権限があって、値段が安いサーバ・・・VPSがあるじゃないか!!と気づきました。でも、VPSで単体構成だと心もとないような。。。

なので私は、VPSを複数借りてWebサイトを冗長構成にすることにしました。

冗長化には、「HAProxy」を使うことにしました。本投稿では、HAProxyの構築方法について紹介します。

 

作業環境
- さくらのVPS/512M
- カゴヤ・クラウド/VPS type A
- ConoHa/1G

3台で3000円以内に収まる

 

構成
バランシングサーバ(さくらのVPS)
- ホスト名:HAProxy
- IPアドレス:192.168.0.1
- CentOS 6.6
- 転送元Port:80番
Webサーバ1(ConoHa)
- ホスト名:Web01
- IPアドレス:192.168.0.2
- CentOS 6.6
- Apache 2.2.15
- Port:80番
- ドキュメントルート:/var/www/html
Webサーバ2(カゴヤ・クラウド)
- ホスト名:Web02
- IPアドレス:192.168.0.3
- CentOS 6.6
- Apache 2.2.15
- Port:80番
- ドキュメントルート:/var/www/html

実際は、全てグローバルIPアドレスで構築しています。

 

Webサーバをセットアップ

Webサーバは、2台の準備から始めます。

下記の手順に従って、同一構成のWebサーバを2台構築します。

※ホスト名、IPアドレスは変えてください。

Apacheをインストール

まず、Apacheをインストールします。

# yum install -y httpd

 

バーチャルホストの設定を追加

Apacheにネームベースのバーチャルホスト設定を追加します。

下記設定は、Webサーバに対してIPアドレスでアクセスがあった場合、ドキュメントルートが「/var/www/html」になる。

# vim /etc/httpd/conf.d/virtual.conf
NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName <サーバのIPアドレス>
    ErrorLog logs/error_Apache_log
    CustomLog logs/access_Apache_log combined
</VirtualHost>

 

Apacheを起動

Apacheを起動する。

# service httpd start
httpd を起動中: httpd: apr_sockaddr_info_get() failed for Apache0*
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

自動起動設定に追加する。

# chkconfig httpd on
# chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

 

テストページの作成

バーチャルホストで設定したドキュメントルートへ「index.html」を作成する。

# echo `hostname` >> /var/www/html/index.html

 

バランシングサーバ(HAProxy)をセットアップ

Webサーバ2台の構築が完了したので、次にバランシングサーバの構築をしていく。

HAProxy をインストール

HAProxyをインストールする

# yum install -y haproxy

 

バックアップを取得

HAProxyの設定ファイルへ手を加える前に、バックアップを取得しておく。

# cp -av /etc/haproxy/haproxy.cfg{,.old}

 

バランシングの設定を追加

「haproxy.cfg」にバランシングサーバの「*:80」ポートへのHTTPリクエストをWebサーバ2台の「80」ポートへ振り分けるよう設定を追加する。

# 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
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    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
    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

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
    default_backend             HA

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin
    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

#---------------------------------------------------------------------
#新規追加分
#---------------------------------------------------------------------
backend HA
     balance   roundrobin
     server  Web01 192.168.0.2:80 check
     server  Web02 192.168.0.3:80 check

※設定項目の「default_backend」は、新しく追加した「backend HA」に変更する。「frontend  main *:5000」は「frontend  main *:80」に変更する

 

HAProxyを起動

HAProxyを起動する。

# service haproxy start
haproxy を起動中:                                          [  OK  ]

自動起動設定に追加する。

# chkconfig haproxy on
# chkconfig --list haproxy 
haproxy        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

 

動作検証

バランシングサーバへアクセス

バランシングサーバ(Balancing)のIPアドレスにアクセスしてみる

# curl http://192.168.0.1
Web01 # curl http://192.168.0.1 Web02

振り分けられれば成功!!ブラウザで試しても同じ結果になるはず。

冗長化することにより、サーバメンテナンスなどでサービス停止(Webサイトが見れなくなる)がなくなった。めでたしめでたし