天天看點

WEB伺服器負載均衡之HAProxy

    負載均衡 (Load Balancing) 負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的靈活性和可用性。

    負載均衡一般分為軟負載均衡與硬負載均衡,一般而言,硬體負載均衡在功能、性能上優于軟體方式,不過成本昂貴。硬體負載裝置國際與國内比較有名的是:F5、A10、深信服。

    今天我們來介紹軟體負載均衡中的免費開源的HAproxy。    

一、準備環境

3台伺服器:haproxy    web1    web2

IP位址:

192.168.1.70

192.168.1.77

192.168.1.78

二、安裝基礎及常用工具包

yum -y install yum-plugin* telnet nmap lrzsz gcc

三、WEB伺服器安裝與配置

web伺服器,根據自己需求選擇安裝,本實驗使用的是apache,您也可以選用tomcat nginx等web伺服器,具體的安裝與配置參閱本部落格其它文章。

四、安裝haproxy

wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz

tar xzvf haproxy-1.3.20.tar.gz

mv haproxy-1.3.20 /usr/local/haproxy

cd /usr/local/haproxy/

make TARGET=linux26

make install

安裝完成,驗證haproxy是否已經正常安裝:

# ./haproxy -v

 顯示如下内容,表示已經OK了

HA-Proxy version 1.3.20 2009/08/09

Copyright 2000-2009 Willy Tarreau <[email protected]>

五、配置haproxy

cd /usr/local/haproxy

vim haproxy.cfg

 貼入如下内容:

global

        log 127.0.0.1   local0

        maxconn 4096

        chroot /usr/local/haproxy

        uid 99

        gid 99

        daemon

        nbproc 10

        pidfile /usr/local/haproxy/haproxy.pid

        #debug

        #quiet

defaults

        log     127.0.0.1       local3

        mode    http

        #mode   tcp

        option httplog

        option httpclose

        option dontlognull

        option forwardfor

        option redispatch

        option originalto

        option abortonclose

        retries 2

        maxconn 2000

        balance roundrobin

        #balance source

        #balance leastconn

        stats   uri     /haproxy-stats

        stats auth admin:admin

        stats    refresh   5s

        #stats hide-version

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

        #timeout check 2000

#set haproxy servers ip adress and port;

listen web_proxy 0.0.0.0:80

#set mode of balance

        #balance source

#set haproxy servers check web servers status;

        #option httpchk GET /check.php

        #option httpchk HEAD /index.php

#set sticky sessions

        cookie SERVERID insert indirect nocache

        #cookie  SERVERID rewrite

#set web servers ip address and port

        server web1 192.168.1.77:80 cookie appinst1 check weight 1

        server web2 192.168.1.78:80 cookie appinst2 check weight 1

        #server web1 192.168.1.77:80 cookie app1inst1 check inter 2000 rise 2 fall 5

        #server web2 192.168.1.78:80 cookie app1inst2 check inter 2000 rise 2 fall 5

        #server web1 192.168.1.77:80 cookie web1 check

        #server web2 192.168.1.78:80 cookie web2 check

注:紅色部分更改為自己WEB伺服器的實際IP與端口即可;haproxy 還有超多的參數功能可以設定,上面的例子,是基本正常的設定,具體說明與用法可以參考文章末尾附上的網絡資料。

六、啟動haproxy

# /usr/local/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg

七、停止haproxy

# killall -9 haproxy

八、設定haproxy 啟動、停止、重新開機服務腳本

    如果您覺得上面的啟動與停止還可以接受,第八部分的内容就可以忽略了,下面是在/etc/init.d 目錄下建立haproxy 服務檔案,以便我們可以像平常那樣啟動、停止、重新開機服務;

vim /etc/init.d/haproxy

#! /bin/sh

# modify by anson

 set -e

 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin

 PROGDIR=/usr/local/haproxy

 PROGNAME=haproxy

 DAEMON=$PROGDIR/$PROGNAME

 CONFIG=$PROGDIR/$PROGNAME.cfg

 PIDFILE=$PROGDIR/logs/$PROGNAME.pid

 DESC="HAProxy daemon"

 SCRIPTNAME=/etc/init.d/$PROGNAME

 # Gracefully exit if the package has been removed.

 test -x $DAEMON || exit 0

 start()

 {

         echo -n "Starting $DESC: $PROGNAME"

         $DAEMON -f $CONFIG

         echo "."

 }

 stop()

 {

         echo -n "Stopping $DESC: $PROGNAME"

         haproxy_pid=$(cat $PIDFILE)

         kill -15 $haproxy_pid

         echo "."

 }

 restart()

 {

         echo -n "Restarting $DESC: $PROGNAME"

         $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)

         echo "."

 }

 case "$1" in

   start)

         start

         ;;

   stop)

         stop

         ;;

   restart)

         restart

         ;;

   *)

         echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2

         exit 1

         ;;

 esac

exit 0

賦予執行權限:

chmod +x /etc/init.d/haproxy

九、測試通路網站

打開浏覽器,輸入:http://192.168.1.70

正常顯示後端web伺服器的内容,停掉其中一台,還是能正常通路;

注:selinux iptables 一定要注意關閉或者開啟相應的服務端口;

小技巧:如果您想知道您現在通路的内容是哪一台伺服器傳回的呢?我是這麼操作的:

web1: echo "This is web1 servers" >> /var/www/html/web.php

web2: echo "This is web2 servers" >> /var/www/html/web.php

然後再打開浏覽器,輸入: http://192.168.1.70/web.php

看看顯示是哪台的内容即可知道,清掉緩存或者再多測試幾下,每次顯示都不太一樣,會在web1與web2中輪流顯示;哈哈,因為我們的配置檔案裡配置的是:balance roundrobin 即表示為輪詢方式。

參考網上資料:http://www.linuxidc.com/Linux/2012-07/65350.htm

http://haproxy.1wt.eu/

http://network.51cto.com/art/201103/249586.htm

轉載于:https://blog.51cto.com/63638790/1353962