天天看點

Haproxy+keepalived 高可用負載

Haproxy+keepalived+apache

一、拓撲圖:

<a href="http://s1.51cto.com/wyfs02/M02/7F/1A/wKiom1cTiQyzwQ6xAAFY-jQlWtw236.jpg" target="_blank"></a>

二、編譯安裝haproxy(兩台機器一樣安裝)

解壓:tar zxvf haproxy-1.6.4.tar.gz

編譯:注意:下邊的等号前邊的參數必須大寫

cd haproxy-1.6.4

        make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy

        make install PREFIX=/usr/local/haproxy

安裝後,建立配置檔案和啟動檔案

    mkdir -p /usr/local/haproxy/etc/haproxy

    cp examples/acl-content-sw.cfg/usr/local/haproxy/etc/haproxy/haproxy.cfg

    cp examples/haproxy.init /etc/init.d/haproxy

    chmod +x /etc/init.d/haproxy

修改啟動檔案:

    vi /etc/init.d/haproxy

    修改BIN、CFG路徑

    BIN=/usr/local/haproxy/sbin/$BASENAME

    CFG=/usr/local/etc/$BASENAME/$BASENAME.cfg

三、編輯配置檔案(兩台機器一樣)

cd /usr/local/haproxy/etc/haproxy

cp haproxy.cfg haproxy.cfg.bak

vi haproxy.cfg

# This sampleconfiguration makes extensive use of the ACLs. It requires

# HAProxyversion 1.3.12 minimum.

global

        log        localhost   local3

        maxconn    250

        uid        71

        gid        71

        chroot     /usr/local/haproxy

        pidfile    /var/run/haproxy.pid

        daemon

        quiet

frontendhttp-in

        bind       :80

        mode       http

        log        global

        clitimeout 30000

        option     httplog

        option     dontlognull

        #option    logasap

        option     httpclose

        maxconn    100

        stats refresh 30s                      

        stats uri  /stats                            

        stats realm linuxidc-test-Haproxy    

        stats auth admin:admin123                 

        stats hide-version

        capture request  header Host           len 20

        capture request  header User-Agent     len 16

        capture request  header Content-Length len 10

        capture request  header Referer        len 20

        capture response header Content-Lengthlen 10

        # block any unwanted source IPaddresses or networks

        acl forbidden_src src      0.0.0.0/7 224.0.0.0/3

        acl forbidden_src src_port 0:1023

        block if forbidden_src

        # block requests beginning with http://on wrong domains

        acl dangerous_pfx  url_beg -i http://

        acl valid_pfx      url_reg -i ^http://[^/]*1wt\.eu/

        block if dangerous_pfx !valid_pfx

        # block apache chunk exploit, ...

        acl forbidden_hdrshdr_sub(transfer-encoding) -i chunked

        acl forbidden_hdrs hdr_beg(host)              -i apache- localhost

        # ... some HTTP content smugling andother various things

        acl forbidden_hdrs hdr_cnt(host) gt 1

        acl forbidden_hdrshdr_cnt(content-length) gt 1

        acl forbidden_hdrshdr_val(content-length) lt 0

        acl forbidden_hdrshdr_cnt(proxy-authorization) gt 0

        block if forbidden_hdrs

        # block annoying worms that fill thelogs...

        acl forbidden_uris url_reg -i.*(\.|%2e)(\.|%2e)(%2f|%5c|/|\\\\)

        acl forbidden_uris url_sub -i %00&lt;script xmlrpc.php

        acl forbidden_uris path_end -i/root.exe /cmd.exe /default.ida /awstats.pl .asp .dll

        # block other common attacks (awstats,manual discovery...)

        acl forbidden_uris path_dir -i chatmain.php read_dump.php viewtopic.php phpbb sumthin horde _vti_bin M

SOffice

        acl forbidden_uris url_reg -i(\.php\?temppath=|\.php\?setmodules=|[=:]http://)

        block if forbidden_uris

        # we rewrite the "options"request so that it only tries '*', and we

        # only report GET, HEAD, POST andOPTIONS as valid methods

        reqirep         ^OPTIONS\ /.*HTTP/1\.[01]$ OPTIONS\\\*\ HTTP/1.0

        rspirep         ^Allow:\ .* Allow:\ GET,\ HEAD,\POST,\ OPTIONS

        acl web   hdr_beg(host) -i www.abc.com

        use_backend     www  if web

backend www

        mode   http

        #source 192.168.11.13:0

        balance roundrobin

        cookie SERVERID

        server web01 192.168.1.13:80 checkinter 30000 fall 3 weight 10

        server web02 192.168.1.14:80 checkinter 30000 fall 3 weight 10

        # long timeout to support connectionqueueing

        contimeout      20000

        srvtimeout      20000

        fullconn 100

        redispatch

        retries 3

        option httpchk HEAD /

        option forwardfor

        option checkcache

        option httpclose

        # allow other syntactically validrequests, and block any other method

        acl valid_method method GET HEAD POSTOPTIONS

        block if !valid_method

        block if HTTP_URL_STAR !METH_OPTIONS

        block if !HTTP_URL_SLASH !HTTP_URL_STAR!HTTP_URL_ABS

        # remove unnecessary precisions on theserver version. Let's say

        # it's an apache under Unix on theFormilux Distro.

        rspidel         ^Server:\

        rspadd          Server:\ Apache\ (Unix;\Formilux/0.1.8)

# end ofdefaults

配置日志相關步驟

    haproxy.cfg 上邊已經配置

    log        localhost   local3

    vi /etc/rsyslog.conf

    去掉#号

$ModLoad imudp

       $UDPServerRun 514

    在local7.*下邊添加以下内容:

    local3.*                            /var/log/haproxy/haproxy.log

    vi /etc/sysconfig/rsyslog

    修改為:

    SYSLOGD_OPTIONS="-r -m 0"

    重新開機rsyslog和haproxy服務service rsyslog restart

    service haproxy restart

    日志檔案:/var/log/haproxy/haproxy.log

    檢視haproxy狀态資訊http://ip/stats 使用者密碼:admin:admin123

四、Web01和web02安裝httpd

    yum –y install httpd

    分别建立配置檔案:

    Web01: vi /var/www/html/index.html

       Wo shi 13.

    Web02: vi /var/www/html/index.html

            Wo shi 14.

    兩台都執行以下配置:

    關閉selinux

    vi /etc/sysconfig/selinux

    SELINUX=disabled

    重新開機

    service iptables stop

    chkconfig iptables off

    chkconfig httpd on

    service httpd start

    浏覽器測試是否都能打開web01和web02

五、編譯安裝keepalived

安裝相關包:

yum -y install openssl openssl-devel

解壓:

tar zxvf keepalived-1.2.20.tar.gz

編譯

cd keepalived-1.2.20

./configure --prefix=/usr/local/keepalived1.2.20

make

make install

配置啟動檔案:

cd /usr/local/keepalived1.2.20/

cp etc/rc.d/init.d/keepalived /etc/init.d/

vi /etc/init.d/keepalived

修改三處:

. /usr/local/keepalived1.2.20/etc/sysconfig/keepalived

config="/usr/local/keepalived1.2.20/etc/keepalived/keepalived.conf"

daemon keepalived -D -f $config

配置keepalived.conf檔案

cd etc/keepalived/

備份:cp keepalived.conf keepalived.conf.bak

vi keepalived.conf(注意兩個配置檔案有所不同)

192.168.0.11的keepalived.conf

! Configuration File for keepalived

global_defs {

        notification_email {

                [email protected]

        }

        notification_email_from [email protected]

        smtp_server mail.it.com

        smtp_connect_timeout 30

        router_id LVS_01

}

vrrp_script chk_haproxy {

        script "/usr/local/keepalived1.2.20/check_haproxy.sh"

        interval 2

        weight 2

vrrp_instance VI_1 {

    state MASTER

    interface eth2

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.0.222/24

192.168.0.12的keepalived.conf

    state BACKUP

    priority 99

ln -s/usr/local/keepalived1.2.20/sbin/keepalived /usr/sbin/

開啟路由功能

    net.ipv4.ip_forward= 1

    開啟IP轉發功能 

    net.ipv4.ip_nonlocal_bind= 1

    開啟允許綁定非本機的IP 

    如果使用LVS的DR或者TUN模式結合Keepalived需要在後端真實伺服器上特别設定兩個arp相關的參數。這裡也設定好。

    net.ipv4.conf.lo.arp_ignore= 1

    net.ipv4.conf.lo.arp_announce= 2

    net.ipv4.conf.all.arp_ignore= 1

    net.ipv4.conf.all.arp_announce= 2

建立防止haproxy服務關閉導緻keepalived不自動切換腳本

    cat /usr/local/keepalived1.2.20/check_haproxy.sh

        #!/bin/bash

        if [ $(ps-C haproxy --no-header | wc -l) -eq 0 ]; then

         /etc/init.d/haproxy  start

        fi

        sleep 2

           /etc/init.d/keepalived stop

啟動服務

    service keepalived restart

    ip addr檢視有沒有建立vip

<a href="http://s3.51cto.com/wyfs02/M02/7F/18/wKioL1cTjxLT-zzqAABc93eoi1Y371.png" target="_blank"></a>

    這時候備的keepalived是沒有vip位址的:

<a href="http://s1.51cto.com/wyfs02/M02/7F/1B/wKiom1cTjo7QW5-TAABZ9RzsaP0950.png" target="_blank"></a>

    當主keepalived斷掉,備keepalived接管vip(這裡停止服務模仿)

<a href="http://s1.51cto.com/wyfs02/M00/7F/18/wKioL1cTj3PCEXTQAAB6X__xaQg265.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M00/7F/1B/wKiom1cTjrejWOqrAAB-X-lh67Y036.png" target="_blank"></a>

    當keepalived切換的時候,ping會丢一個包:

當主keepalived關掉的時候,丢包:

<a href="http://s1.51cto.com/wyfs02/M01/7F/18/wKioL1cTkn_CNfeEAACPg0ogb0I917.png" target="_blank"></a>

當主keepalived恢複的時候,丢包:

<a href="http://s4.51cto.com/wyfs02/M02/7F/18/wKioL1cTkhuxiGaqAACUdQ6eDnM321.png" target="_blank"></a>

六、Haproxy本機測試www.abc.com通路

由于是測試沒有dns解析,臨時做hosts解析記錄:

<a href="http://s1.51cto.com/wyfs02/M02/7F/18/wKioL1cTkFeBsVglAAAdM8dKNRU191.png" target="_blank"></a>

測試:curl www.abc.com測試兩次,實作輪詢

<a href="http://s3.51cto.com/wyfs02/M02/7F/18/wKioL1cTkJWD9S1pAAAWTauoC_w348.png" target="_blank"></a>

Windows用戶端測試,添加hosts記錄

<a href="http://s4.51cto.com/wyfs02/M01/7F/1B/wKiom1cTkCWCItlLAAAyrkQNgtM190.png" target="_blank"></a>

浏覽器通路www.abc.com通路兩次,也成功實作輪詢

<a href="http://s3.51cto.com/wyfs02/M01/7F/18/wKioL1cTkQOz6ub_AAA06vBTBrU988.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M01/7F/1B/wKiom1cTkEexkdacAAAvdrx8QYY658.png" target="_blank"></a>

     本文轉自506554897 51CTO部落格,原文連結:http://blog.51cto.com/506554897/1764842,如需轉載請自行聯系原作者