[ 구성 ] 

HAProxy 서버 ( Public VIP ) * 1EA

( CentOS 7 EPEL yum install HAProxy 1.5.18 )

하단에 공인망 스위치와 사설스위치 각각 1대씩.

사설단에 연결된 192.168.0.15 / 16  이  WEB1 , WEB2 

 

[ Configure 기본 ] 

# cat /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                        # Syslog. UDP 514 Open 필요.

    chroot      /var/lib/haproxy                #서비스 Jail 경로. 수퍼유저로 프로세스 실행시, 모든 동작은 이 안에서만 수행됌. 보안 상승.
    pidfile     /var/run/haproxy.pid            # 실행 피드명
    maxconn     4000                            # 프로세스 당 최대 연결 수치
    user        haproxy                         # Manage ID
    group       haproxy                         # Manage Group
    daemon                                      # BackGround Mode Process

    # 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                                #front , back , listen 에 관련된 전역 섹션
    mode                    http                   # http 프로토콜을 사용하는 로드밸런싱 모드
    log                     global                      # 로그는 global 의 설정에 따른다.
    option                  httplog                     # 기본 Log 는 SIP,DIP와 Name 만 표기하므로, 이 옵션을 사용하여 디테일을 높임.
    option                  dontlognull                 # 로그 비대화 방지를 위해, Probe(정찰,스캔)같은 잡다한 기록을 HAProxy Log 화하지 않는 옵션.
    option http-server-close                            # 클라이언트와 리얼서버 연결 종료시, 디폴트로 유휴대기하지 않고, 서버에서 Handshake 를 종료하여, 더 빠른 새로운 세션을 준비할 수 있도록 함. 디폴트 옵션에 선언되어 있어도, 인스턴스 별로 no옵션으로 제외처리 가능함.
    option forwardfor       except 127.0.0.0/8          # 서버에 대한 응답을 HAProxy 가 받기 때문에(VIP), 리얼서버 IP를 HTTP헤더에 표기하기 위한 옵션.
    option                  redispatch                  # mode HTTP에서 Cookie에 지정된 Real 서버가 다운되면, 외부 클라이언트가 쿠키를 플러시하기 전에는 서비스에 문제를 일으킬 수 있으므로, 이 옵션을 줘서, 프록시의 지속성을 무시하고 쿠키, 세션 재분배를 실행하게 된다. retries 값이 0보다 커야 한다.
    retries                 3
    timeout http-request    10s                         # Request 시의 헤더에만 적용. DoS 방어를 위해, HTTP 요청 타임아웃시간 설정. ( 클라이언트의 연결 타임아웃과는 무관한, 서버(HAProxy) 의 옵션이다 )
    timeout queue           1m                          # 서버의 maxconn 에 도달시, 무한정 보류상태로 두지 않고 HTTP 503 응답을 보내면서 연결을 버리기까지의 시간.
    timeout connect         10s                         # TCP 패킷손실을 막기 위한 Real 서버로의 연결 최대 지연시간 설정. ( Backend 에 적용되나, 전역 설정 가능 )
    timeout client          1m                          # 외부 클라이언트의 요청이나 데이터와의 연결 최대 시간. request 와 같이 사용하여, 서버 안정성을 구현.
    timeout server          1m                          # 서버가 데이터를 승인하거나, 전송해야 할 때의 연결 최대 시간.
    timeout http-keep-alive 10s                         # 클라이언트의 요청에 따른 응답 전송 후, 다음 요청까지의 대기 시간. http-request 가 선행함.
    timeout check           10s                         # timeout server 와 동일하거나 작은 값을 가져야 한다.
    maxconn                 3000                        # 프로세스당 최대 연결 개수

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80                     # 클라이언트의 연결을 받는 부분 처리. WAF 기능에 가깝다.
    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                   # acl 에서 정의한 style 들을 backend static으로 보낸다.
    default_backend             web                             # 위의 조건 이외는 backend web 으로 보낸다.

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static                                  # 프론트엔드에서 acl 연결하는 실제 리얼서버 설정.
    balance     roundrobin
    server      static 192.168.0.15:80 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend web                     # 실제 접속시 로드밸런싱하는 서버
    balance     roundrobin                      # 순차적으로 로드밸런싱
    server  web1 192.168.0.15:80 check
    server  web2 192.168.0.16:80 check

#내부 사설서버들 반드시 방화벽 해제하던지, 포트 허용해둘 것.


#listen                         # 프론트/백엔드의 연결의 포트/옵션등을 정의함. TCP 제어나 Proxy 에 주로 사용.


listen stats # "stats"라는 이름으로 listen 지정
    bind *:9000 # 접속 포트 지정
    stats enable
    stats realm Haproxy Statistics  # 브라우저 타이틀
    stats uri /haproxy_stats  # stat 를 제공할 URI
    #stats auth Username:Password # 인증이 필요하면 추가한다

 

HAProxy Configure 메뉴얼 보시면 아시겠지만, 정말 Flow 이해에 좋습니다. 

너무나도 다양한 옵션이 있으나, 우선 이 정도로도 "동작" 은 합니다.

참고 해주시면 되겠습니다.

 

블로그 이미지

늙은M군

개인 저장공간입니다. 해당 일부 과정들을 공인 인터넷 환경에서 악성적으로 응용할 시 피해가 발생할 수 있으며, 그에 대해 책임은 사용자에게 있습니다!! 주의해주세요.

,