HAPROXY

os/UNIX_LINUX 2017. 4. 4. 12:44
반응형


로드벨런싱 (HAProxy)

http://repository.egloos.com/5850347


[ 목표 시스템 구성도 ]

[ 패키지 설치 ]
# yum install haproxy  => 버전 haproxy-1.5.2-2.el6.x86_64
or
# wget http://www.haproxy.org/#down

[ 환경설정 ]
추가하거나 바꾼 부분만 표시한다.
# vi /ec/haproxy/haproxy.cfg
global
   log 127.0.0.1 local0
   log 127.0.0.1 local1 notice

defaults
   option httpchk GET /index.html HTTP/1.0 =>L7스위치 설정 적용(특정 페이지 접속 체크)
   # option httpchk HEAD /index.html HTTP/1.1\r\nHost:\ domain.com
frontend  main *:80  => HAProxy서버 데몬 포트(사용자가 접속하는 포트)
   default_backend app => 아래 backend 이름을 설정하여 해당 설정을 적용한다.

backend app
   balance     roundrobin   => 분배방식
   server  app1 192.168.0.200:80 check => app1번서버(다양한 옵션이있음)
   server  app2 192.168.0.300:80 check => app2번서버(다양한 옵션이있음) 
   app1, app2의 IP는 /etc/hosts에 등록한다.

[ 서비스 실행 ]
# /etc/init.d/haproxy [ start|stop ]

[ 테스트 ]
app1, app2번 서버의 웹서비스를 하나씩 따로 중지하고 테스트해본다.
app서버 웹페이지에 해당 장비가 표시될 수 있게하면 확인이 쉽다.

[ 지원하는 분배 방식 ]
roundrobin
static-rr
leastconn
first
source 
uri
url_param  
hdr(<name>)
rdp-cookie

[ 도움말 ]

 

=================================================================================

=================================================================================

 

 

http://ddakker.tistory.com/358

 

wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.17.tar.gz
tar xvzf haproxy-1.5.17.tar.gz
 
 
uname -r
 
yum install wget gcc gcc-c++ autoconf automake make openssl openssl-devel pcre-devel zlib
 
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
make install
 
cp examples/haproxy.init /etc/init.d/haproxy
cp examples/examples.cfg /etc/haproxy/haproxy.cfg
 
chmod 755 /etc/init.d/haproxy
 
 
service haproxy start (or /etc/init.d/haproxy start)
 
 
 
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
 
# id
# 101 ~ 200 = HTTP
# 201 ~ 300 = TCP
# 501 ~ 600 = TEST
 
 
frontend searchWas
        bind 192.168.0.151:80
        option  httplog
        default_backend searchWas
 
backend searchWas
        id      101
        stats   enable
        stats   hide-version
        balance roundrobin
        # For Sticky Session
        appsession JSESSIONID len 30 timeout 3h request-learn prefix
        option  httplog
        option  httpchk GET /info.jsp
        option  http-server-close
        option  forwardfor
    server search01 192.168.0.101:8080 check inter 2000 fastinter 500 downinter 5000 rise 3 fall 1
    server search02 192.168.0.102:8080 check inter 2000 fastinter 500 downinter 5000 rise 3 fall 1
 
listen aqmp_real 192.168.0.151:5672
        id              201
        mode            tcp
        balance         roundrobin
        timeout client  3h
        timeout server  3h
        option          clitcpka
        server mq11 192.168.0.101:5672 check inter 5s rise 2 fall 3
        server mq21 192.168.0.101:5672 check inter 5s rise 2 fall 3
 
listen stats 0.0.0.0:40000       #Listen on all IP's on port 9000
    mode http
    balance
    timeout client 5000
    timeout connect 4000
    timeout server 30000
 
    #This is the virtual URL to access the stats page
    stats uri /haproxy_stats
 
    #Authentication realm. This can be set to anything. Escape space characters with a backslash.
    stats realm HAProxy\ Statistics
 
    #The user/pass you want to use. Change this password!
    #stats auth admin:admin
 
    #This allows you to take down and bring up back end servers.
    #This will produce an error on older versions of HAProxy.
    stats admin if TRUE
     
ip addr show
service rsyslog restart
service keepalived restart
service haproxy restart
 
 
 
cp /etc/haproxy/haproxy.cfg /etc/haproxy/bak_haproxy.cfg   
cp /etc/keepalived/keepalived.conf /etc/keepalived/bak_keepalived.conf
 
vi /etc/keepalived/keepalived.conf
     
vi /etc/haproxy/haproxy.cfg
 
 
vi /etc/rsyslog.conf
/etc/rsyslog.d/haproxy.conf
    local2.*    /var/log/haproxy.log
 
global_defs {
        router_id HAProxy1
}
 
vrrp_script haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
}
 
 
vrrp_instance VI_1 {
        debug 2
        virtual_router_id 50
        advert_int 1
        priority 101
        state MASTER
        interface eth0
        virtual_ipaddress {
                192.168.0.151 dev eth0
        }
 
        track_script {
                haproxy
        }
 
        notify_master "/etc/keepalived/master.sh"
        notify_backup "/etc/keepalived/backup.sh"
}
 
! Configuration File for keepalived
 
global_defs {
        router_id HAProxy2
}
 
vrrp_script haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
}
 
 
vrrp_instance VI_1 {
        debug 2
        virtual_router_id 50
        advert_int 1
        priority 100
        state BACKUP
        interface eth0
        virtual_ipaddress {
                192.168.0.151 dev eth0
        }
 
        track_script {
                haproxy
        }
}
 
yum install rubygems
gem update
gem update --system
 
gem install haproxyctl
 
haproxyctl "enable server wasSearch/search01"
haproxyctl "disable server wasSearch/search01"
 
curl -d "s=search01&action=maint&b=#101" http://192.168.0.151:8080/haproxy_stats
curl -d "s=search01&action=ready&b=#101" http://192.168.0.151:8080/haproxy_stats

[참조] http://bryan.wiki/243

[참조] https://www.percona.com/blog/2014/10/03/haproxy-give-me-some-logs-on-centos-6-5/


 

==================================================================================

==================================================================================


http://livegs.tistory.com/43 

HAproxy 설치하기

HAproxy는 고가용성 프록시를 의미합니다. 

이름에서도 알 수 있다시피 High Availability proxy 입니다

C 언어로 작성되었으며 무료 오픈소스 프로그램입니다. 

HAproxy는 TCP / HTTP 로드 밸런서로 프록시 솔루션에 사용됩니다. 

HAproxy의 일반적인 용도는 웹서버, DB 서버 등 부하를 분산시키는 용도로 많이 사용되고 있습니다.

BSD, 리눅스, 솔라리스 등에서 사용할 수 있으며, 물론 윈도우는 안됩니다. (-0-;)

(여담이지만, 윈도우는 뭐 다 돈이네요 ;;;)


**********************************************************************************************************

* 환경

OS : Ubuntu 16.04.1 LTS

HAproxy : 1.6.7

WebServer : Apache/2.4.18 (Ubuntu)

VM : VirtualBox 5.1.2


* 참고

sudo 로 진행하지 않고 root 로 진행합니다.

**********************************************************************************************************

* 준비사항

VM 환경에서 진행되며, 로드밸런서이기 때문에

HAproxy 를 설치할 VM 하나, 웹서버 VM 2개를 먼저 준비합니다.

VM 을 만드는 부분은 여기서 설명하지 않습니다.

VM 의 상세 내역은 아래와 같습니다.


VM

OS

IP

Hostname

HAproxy

Ubuntu 16.04.1 LTS 64bit

172.16.1.5

HAproxy

 Webserver01

Ubuntu 16.04.1 LTS 64bit

172.16.1.15

webserver-01

Webserver02

Ubuntu 16.04.1 LTS 64bit

172.16.1.16

webserver-02

 


**********************************************************************************************************


1. Apache 설치

# apt-get install apache2 

  - 모든 VM 에 apache 를 모두 설치합니다.


2. HAproxy 저장소 등록 및 업데이트

# apt-add-repository ppa:vbernat/haproxy-1.6

# apt-get update


3. HAproxy 설치

# apt-get install haproxy


4. haproxy.cfg 수정

# vi /etc/haproxy/haproxy.cfg


global

        #log /dev/log   local0

        #log /dev/log   local1 notice

        log 127.0.0.1 local2

        chroot /var/lib/haproxy

        stats socket /run/haproxy/admin.sock mode 660 level admin

        stats timeout 30s

        user haproxy

        group haproxy

        daemon

 . . .


위처럼 log 를 주석처리 해주고 log 127.0.0.1 local2 를 입력해 줍니다.


5. rsyslog.conf 파일 수정

# vi /etc/rsyslog.conf


$ModLoad imudp

$UDPServerRun 514 


파일에 위 부분이 주석처리 되어 있다면 주석을 풀어주시고 없다면 입력해 줍니다.


6. haproxy.conf 파일 생성하고 내용 추가

# vi /etc/rsyslog.d/haproxy.conf


 

local2.*        /var/log/haproxy.log

 

 


7. rsyslog 서비스 재시작

# service rsyslog restart


8. haproxy.cfg 수정

# vi /etc/haproxy/haproxy.cfg


defaults

        log     global

        mode    http

        option  httplog

        option  dontlognull

        option  http-server-close

        option  forwardfor except 127.0.0.0/8

        option  redispatch

        retries 3

        timeout http-request    20

        timeout queue            86400

        timeout connect          86400

        timeout client             86400

        timeout server             86400

        timeout http-keep-alive 30

        timeout check             20

        maxconn                    50000 


frontend LB

        bind 172.16.1.5:80

        reqadd X-Forwarded-Proto:\ http

        default_backend bkLB


backend bkLB

        mode http

        stats enable

        stats hide-version

        stats uri /stats

        stats realm Haproxy\ Statistics

        stats auth haproxy:admin

        balance roundrobin

        option httpchk

        option httpclose

        option forwardfor

        cookie LB insert

        server webserver-01 172.16.1.15:80 cookie webserver-01 check

        server webserver-02 172.16.1.16:80 cookie webserver-02 check



10. HAproxy 재시작

# service haproxy restart


11. 시스템 시작시 자동으로 시작하기 위해 파일 수정

# vi /etc/default/haproxy


ENABLED=1 

 



12. 정상적으로 동작하는지 확인하기 위해 웹서버 index.html 를 수정

- webserver-01 에서

# mv /var/www/html/index.html /var/www/html/index.html.backup

# vi /var/www/html/index.html

webserver-01 

 


- webserver-02 에서

# mv /var/www/html/index.html /var/www/html/index.html.backup

# vi /var/www/html/index.html

webserver-02


13. 로드밸런싱이 되는지 확인

# curl 172.16.1.5

webserver-01

# curl 172.16.1.5

webserver-02

# curl 172.16.1.5

webserver-01

# curl 172.16.1.5

webserver-02


위 처럼 roundrobin 형식으로 정상적으로 나오는지 확인


14. HAproxy 통계 페이지 확인

- 웹브라우저에서 172.16.1.5/stats 를 입력

  로그인 화면에서 haproxy / admin 으로 로그인

 

* 참고

hosts 파일 수정


127.0.0.1       localhost

127.0.1.1       HAproxy


# The following lines are desirable for IPv6 capable hosts

::1     localhost ip6-localhost ip6-loopback

ff02::1 ip6-allnodes

ff02::2 ip6-allrouter


172.16.1.15  webserver-01

172.16.1.16  webserver-02 


==================================================================================

==================================================================================

 


http://cyuu.tistory.com/category/haproxy


==================================================================================

==================================================================================


http://livegs.tistory.com/44

 

==================================================================================

==================================================================================

http://coffeenix.net/board_view.php?bd_code=1771

 

제  목 : HAProxy로 로드밸런싱(LB, 이중화) 구성
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2015.3.10(화)

HAProxy는 L4(TCP), L7(HTTP) 네트웍 스위치를 대체할 수 있는 로드 밸런싱(load balancing), HA(high availability)용 오픈소스다. 예를 들어 웹서버가 여러대가 있고, 이 서버를 로드 밸런싱한다면 웹서버 앞단에 HAProxy서버를 셋팅한다. 여러대 웹서버 중 1대가 장애발생해도 서비스에는 지장이 없다. HAProxy는 바로 서버 장애를 인지하고 해당서버를 서비스에서 제외시키기 때문이다.

 

 

1. HAProxy 기본 설정

 
global
   log 127.0.0.1   local1         # Linux
   # log /var/run/log   local1      # FreeBSD

   #
   maxconn 4096
   uid 99
   gid 99
   daemon

defaults
   log   global
   mode   http
   # option  httplog
   option  dontlognull

   retries   3
   redispatch
   maxconn   4000
   contimeout 5000

listen   wwwlb 0.0.0.0:80
   option   httpchk
   option   httpclose
   option   forwardfor

   balance   roundrobin
   server   www1 10.10.10.1:80 check inter 3000 rise 2 fall 1
   server   www2 10.10.10.2:80 check inter 3000 rise 2 fall 1
 


설정 중 몇가지만 살펴보자.

1) 로그 설정

 
global
   log 127.0.0.1   local1         # Linux
   # log /var/run/log   local1      # FreeBSD
defaults
   log   global
   # option  httplog
 


log 설정은 지정한 IP 또는 소켓(예. /dev/log 또는 /var/run/log)으로 로그를 보낸다. local1 뒤에는 로그레벨을 지정할 수 있는데, local1 notice라고 지정했다면 emerg~notice 레벨을 로그로 남긴다. notice 레벨만 syslog로 보내고 싶다면 local1 notice notice처럼 notice를 2번 적어주면 된다. 뒤에 있는 notice는 최소레벨을 의미한다. 즉, notice~notice 범위의 레벨을 의미하므로 오직 notice 레벨만 syslog로 보내는 것이다.
option httplog 설정은 클라이언트 IP, URL, 상태코드, bytes 등의 웹로그까지 syslog로 보내도록 한다.

syslog(또는 rsyslog)도 위와 매칭되도록 설정한다.

 
# local1.=info            /var/log/haproxy_access.log
local1.notice            /var/log/haproxy.log
 


HAProxy start/stop 정보와 서버가 DOWN, UP 등의 상태 변경 정보 등이 notice레벨에 해당한다. 웹로그는 info레벨이다. 요청이 너무 많을 경우 웹로그량(haproxy_access.log)이 급속히 커지므로 로그를 남길 것인지 잘 판단하길 바란다.

2) listen 설정

 
option   httpchk
option   forwardfor
 


option httpchk는 HTTP요청으로 서비스 헬스체크를 하겠다는 뜻이다. 추가설정없이 option httpchk만 설정하면 OPTIONS 메쏘드로 웹요청을 한다.
특정 URL을 체크하고 싶다면 아래처럼 설정하면 된다. OPTIONS 메쏘드 체크보다는 좀 더 나은 방법이다. HEAD 메쏘드로 체크하면 웹서버 응답이 없는 것 외에 404 에러가 발생하는 경우도 해당 서버를 서비스에서 제외시킨다.

 
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>

(예) option httpchk HEAD / HTTP/1.0
(예) option httpchk HEAD / HTTP/1.1\r\nHost:\ w.coffeenix.net
(예) option httpchk HEAD / HTTP/1.1\r\nUser-Agent:\ Health\ Check/HaProxy1\r\nHost:\ w.coffeenix.net
 


option forwardfor는 백단의 웹서버(위에서는 www1, www2)에 X-Forwarded-For 헤더를 넣어서 전달한다. X-Forwarded-For 헤더에 실제 요청한 클라이언트 IP가 저장된다.

 
server  www1 10.10.10.1:80 check inter 3000 rise 2 fall 1
 


www1 서버가 정상적으로 동작중인지를 3초(3000)간격으로 체크(check inter 3000)한다. 접속이 한번이라도 안된다면 해당 서버를 서비스에서 제외(fall 1)시킨다. 만약 두번 연속 체크해서 모두 정상적인 응답이 온다면 다시 서비스에 추가(rise 2)시킨다. rise를 지정하지 않으면 디폴트로 2를, fall을 지정하지 않으면 3이 디폴트 값이다.

 
(예) check inter 3000 fastinter 1000 rise 3 fall 2
 


평상시에는 inter 3000 설정에 따라 3초 간격으로 서비스를 체크한다. 해당 서버가 다운이 되었을 때, rise 3 설정에 따라 3번 연속 체크해서 정상이면 서비스에 추가한다. 이때 fastinter 1000이 실력발휘를 한다. 3번 체크하는 동안에 1초간격으로 서비스를 체크하게 된다. 따라서 좀 더 빨리 서비스에 추가될 수 있다.

balance 설정은 여러개가 있는데 자주 사용하는 2개만 살펴보면.
roundrobin은 순차적으로 요청을 넘겨준다. 첫번째 요청은 1번서버로, 다음은 2번서버로, 그 다음은 다시 1번서버로.
leastconn은 요청을 가장 적게 받은 서버로 요청을 넘겨준다. 1번 서버가 100개 요청받아 처리중이고, 2번서버가 80개 받아 처리중이라면, 요청이 들어올 때 2번서버로 보낸다.


2. 동일 클라이언트는 동일한 서버로 접속되도록 설정 (sticky 설정)

동일한 클라이언트가 항상 같은 서버로만 요청을 보낼 필요가 있을 때는 쿠키 체크와 클라이언트 IP 체크 등 2가지 방법으로 해결할 수 있다.

1) 쿠키로 세션 유지

 
listen   wwwlb 0.0.0.0:80
... 생략 ...
   balance   roundrobin
   cookie  SVID insert indirect nocache
   server   www1 10.10.10.1:80 cookie w1 check inter 3000 rise 2 fall 1
   server   www2 10.10.10.2:80 cookie w2 check inter 3000 rise 2 fall 1
 


클라이언트 요청이 들어오면, SVID 쿠키가 있는지를 검사한다. 클라이언트가 처음 요청할 때는 SVID 쿠키가 없을 것이므로 쿠키를 새로 만든다. 이 때 www1 서버로 접속하면 w1 쿠키값을 굽고, www2 서버로 접속하면 w2 쿠키값을 굽는다. 한번 요청했던 클라이언트에서 다음 요청을 할 때는 SVID 쿠키가 있으므로 쿠키값에 맞는 서버로 요청을 보낸다. 따라서 처음에 w1서버로 요청이 들어왔다면 다음에도 계속 w1서버로 요청을 보낼 수 있게 된다.

 
cookie  SVID insert indirect nocache maxlife 10m
 


동일한 서버로 접속하는 것을 10분만 유지하려면 위처럼 cookie 유지시간(maxlife 10m)을 지정할 수 있다.

HAProxy서버가 '클라이언트 -> HAProxy 서버 -> 웹서버들'과 같은 구성으로 되어 있을 때, SVID 쿠키는 클라이언트 <-> HAProxy 서버 구간에만 유지가 되고, 뒷단의 웹서버로는 전달되지 않는다. 로드밸런싱용으로만 사용하는 쿠키이므로 웹서버가 사용할 필요없으니깐.

 
클라이언트 <--- SVID 쿠키 ---> HAProxy <--- SVID 쿠키없음 ---> 웹서버들
 


2) 클라이언트 IP로 세션 유지

 
listen   wwwlb 0.0.0.0:80
... 생략 ...
   balance   source
   hash-type consistent
   server   www1 10.10.10.1:80 check inter 3000 rise 2 fall 1
   server   www2 10.10.10.2:80 check inter 3000 rise 2 fall 1
 


위처럼 balance와 hash-type을 설정하면 해시테이블을 사용해서 클라이언트 IP별로 특정서버로만 접속되도록 할 수 있다.


3. HAProxy의 통계 모니터링 페이지

 
listen   stats_page 0.0.0.0:8080
   stats   enable
   stats   uri /
   stats   auth ID:비밀번호
 


HAProxy의 통계 모니터링 페이지(Statistics Report, stats page)는 8080같이 서비스와는 별개의 포트로 설정하는게 보다 안전하다.


4. 웹서버 로그에 Proxy IP대신 클라이언트 IP 남기기

클라이언트 -> HAProxy 서버 -> 웹서버로 요청이 들어올 때, 웹서버 로그에는 HAProxy서버의 IP가 남게된다. 요청한 클라이언트 IP는 X-Forwarded-For 헤더에 들어있는데, nginx, apache 웹서버는 이 헤더값을 뽑아내 Proxy IP를 클라이언트 IP로 변경해주는 모듈이 있다.

1) nginx

http_realip 모듈은 기본으로 설치되지 않으므로 configure할 때 --with-http_realip_module 옵션을 추가한 후 컴파일한다.

 
set_real_ip_from  10.10.10.10;
real_ip_header    X-Forwarded-For;
 


10.10.10.10은 HAProxy서버의 IP이고, HAProxy서버가 여러대일 때는 IP를 한줄에 하나씩 추가해준다. 192.168.0.0/24처럼 대역폭으로 지정할 수도 있다.

2) apache

아파치에 mod_rpaf 모듈이 클라이언트 IP 변환기능을 제공한다. 자세한 설정법은 다음글을 읽어보시길.

* apache에서 Proxy IP를 real IP로 바꾸기 (글 좋은진호, 2010.2)
  http://coffeenix.net/board_view.php?bd_code=1701


5. 참고자료

* HAProxy version 1.5.11 Configuration Manual
  http://cbonte.github.io/haproxy-dconv/configuration-1.5.html

* Module ngx_http_realip_module
  http://nginx.org/en/docs/http/ngx_http_realip_module.html

* L4/L7 스위치의 대안, 오픈 소스 로드 밸런서 HAProxy
  http://helloworld.naver.com/helloworld/textyle/284659

* FreeBSD에서 CARP와 HAProxy로 이중화(HA) 구성 (글 좋은진호, 2015.2)
  http://coffeenix.net/board_view.php?bd_code=1770

 


==================================================================================

==================================================================================

  

 http://sncap.tistory.com/513


Haproxy를 이용한 https Redirect

==================================================================================

==================================================================================

 

http://arisu1000.tistory.com/27739

HAPROXY 설정 및 실행

 

http://cafe.naver.com/androidphone/109

오픈소스로드밸런서 Haproxy!!

http설정 및 https설정

 

반응형
Posted by 공간사랑
,