티스토리 뷰

DevOps

[NBP] haproxy 구성

김한성 2020. 5. 14. 13:15

haproxy

 

  • Load Balancer로 활용할 수 있으며, 다양한 설정이 가능, nginx reverse proxy에 비해서 active health check가 가능하기 때문에 더 안정적으로 운영할 수 있음
  • HAProxy는 기존의 하드웨어 스위치를 대체하는 소프트웨어 로드 밸런서로, 네트워크 스위치에서 제공하는 L4, L7 기능 및 로드 밸런서 기능을 제공한다. HAProxy는 설치가 쉽고 또한 환경 설정도 어렵지 않으므로 서비스 이중화를 빠르게 구성하고 싶다면 HAProxy를 추천.
  • HAProxy는 기본적으로 reverse proxy 형태로 동작한다. 우리가 브라우저에서 사용하는 proxy는 클라이언트 앞에서 처리하는 기능으로, forward proxy라 한다. reverse proxy의 역할을 간단히 설명하면, 실제 서버 요청에 대해서 서버 앞 단에 존재하면서, 서버로 들어오는 요청을 대신 받아서 서버에 전달하고 요청한 곳에 그 결과를 다시 전달하는 것이다.

 

 

 

□ haproxy install

 

  • TARGET 정보는 README 파일 확인, SSL 읹으서를 활성화 하기 위해서 USE_OPENSSL를 enable,  systemd 를 통해서 서비스를 컨트롤 하기 위해서 USE_SYSTEMD도 활성화
$ yum install -y gcc openssl pcre-static pcre-devel systemd-devel openssl-devel

$ make TARGET=linux2628 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1 USE_SYSTEMD=1
  • 컴파일 완료했다면 make 명령어를 통해 설치 /usr/local/sbin/haproxy에 실행하일이 설치됨
$ sudo make install

install -d "/usr/local/sbin"
install haproxy  "/usr/local/sbin"
install -d "/usr/local/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1
install -d "/usr/local/doc/haproxy"
for x in configuration management architecture peers-v2.0 regression-testing cookie-options lua WURFL-device-detection proxy-protocol linux-syn-cookies network-namespaces DeviceAtlas-device-detection 51Degrees-device-detection netscaler-client-ip-insertion-protocol peers close-options SPOE intro; do \
        install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \
done
  • 정상적으로 설치되었는지 확인
sudo haproxy -v
  • haproxy 관련 디렉토리 및 권한 변경
$ ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

$ sudo cp -arp examples/haproxy.init /etc/init.d/haproxy

$ sudo chmod 755 /etc/init.d/haproxy

$ sudo chkconfig haproxy on
  • haproxy 데몬 구동할 haproxy 계정 만들기
$ sudo useradd -r haproxy
  • 관련 폴더 생성
$ sudo mkdir -p /etc/haproxy
$ sudo touch /etc/haproxy/haproxy.cfg
$ sudo chown -R haproxy:haproxy /etc/haproxy/


$ sudo mkdir -p /var/lib/haproxy
$ sudo touch /var/lib/haproxy/stats
$ sudo chown -R haproxy:haproxy /var/lib/haproxy
  • cfg 파일 생성
$ sudo vi /etc/haproxy/haproxy.cfg
  • haproxy start
$ sudo systemctl start haproxy

$ sudo systemctl status haproxy
  • cfg 정상인지 검사
cfg 파일 검사 아래처럼 나와야 정상임
[ncloud@krish-bastion haproxy-1.8.23]$ /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
  • haproxy.cfg 경로 이동
#haproxy 계정으로 접속

$ su - haproxy

$ cd /etc/haproxy
-bash-4.2$ pwd
/etc/haproxy
  • haproxy.cfg 설정 및 변경

참고 블로그: https://findstar.pe.kr/2018/07/27/install-haproxy/

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
  #haproxy는 로그를 남기기 위해서 file io를 직접 처리하지 않음, rsyslog로 UDP 전송
  log           127.0.0.1 local2
  #연결할 수 있는 최대 CONNECTION을 지정 default는 2000으로 설정
  maxconn       2000
  chroot        /var/lib/haproxy
  pidfile       /var/run/haproxy.pid
  #haproxy를 구동할 user 및 group 
  user          cloud
  group         cloud
  daemon


  stats socket  /var/lib/haproxy/stats


#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults

  # haproxy에서 log format은 총 5가지 (default, tcp, http, clf, custom)을 지원
  # 밑에 설정파일에서는 custom log format을 사용
  
  mode                  tcp
  log                   global
  timeout connect       5000ms
  timeout client        30000ms
  timeout server        30000ms
  # enable logging of null connections (헬스체크와 같이 시스템이 살아 있는지 확인하기 위해서 일정하게 접속하는 커넥션에 대한 로그 사용)
  option dontlognull


  #request-요청을 서버로 보낼 때 `X-Forwarded-For` 를 헤더에 추가한다
  option    forwardfor


  # 기본적으로 HAProxy 는 커넥션 유지 관점에서 keep-alive 모드로 동작을 하는데, 각각의 커넥션은 request-요청과 reponse-응답을 처리하고나서
  # 새로운 request을 받기까지 connection idle 상태(유휴상태)로 양쪽이 연결되어 있다.
  # 이 동작모드를 변경하려면 "option http-server-close" "option forceclose" "option httpclose" "option http-tunnel" 의 옵션이 가능한데,
  # "option http-server-close" 는 클라이언트 사이드에서 HTTP keep-alive를 유지하고 파이프라이닝을 지원하면서 서버 사이드에 커넥션을 닫는 형태를 설정한다.
  # 이는 클라이언트 사이드에서 최저 수준의 응답지연을 제공하고 "option forceclose" 와 비슷하게 서버사이드에서 리소스를 재활용할 수 있게 되어
  # backend 에서 빠르게 세션을 재사용할 수 있도록 해준다.
  option    http-server-close

  timeout   http-request  10s
  timeout   client        20s
  timeout   connect       4s
  timeout   server        30s
  timeout   http-keep-alive   10s

#---------------------------------------------------------------------
# CUSTOM Configs
#---------------------------------------------------------------------

## bastion
frontend bastion
  bind          *:80
  default_backend backend-bastion

backend backend-bastion
  balance roundrobin
  server pweb01 20.1.1.1:80 check
  server pweb02 10.1.1.1:80 check
  • 로그 남기기 (위의 haproxy.cfg의) 로그 남기는 부분을 참고해서 작성
log           127.0.0.1 local2
  • rsyslog 남기기
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
$template Haproxy, "%msg%\n"
#rsyslog 에는 rsyslog 가 메세지를 수신한 시각 및 데몬 이름같은 추가적인 정보가 prepend 되므로, message 만 출력하는 템플릿 지정
# 이를 haproxy-info.log 에만 적용한다.


# 모든 haproxy 를 남기려면 다음을 주석해재, 단 access log 가 기록되므로, 양이 많다.
#local2.*   /var/log/haproxy/haproxy.log


# local0.=info 는 haproxy 에서 에러로 처리된 이벤트들만 기록하게 됨 (포맷 적용)
local2.=info    /var/log/haproxy/haproxy-info.log;Haproxy


# local2.notice 는 haproxy 가 재시작되는 경우와 같은 시스템 메세지를 기록하게됨 (포맷 미적용)
local2.notice   /var/log/haproxy/haproxy-allbutinfo.log
  • haproxy test

아래 haproxy.cfg 파일 내용을 참고하여 아래 그림처럼 NBP에서 테스트 진행

frontend bastion
  bind          *:80
  default_backend backend-bastion


backend backend-bastion
  balance roundrobin
  server pweb01 20.1.1.1:80 check
  server pweb02 10.1.1.1:80 check

VM1: bastion(haproxy)

VM2: web01

VM3: web02

 

bastion VM 즉, haproxy가 설치되어있는 VM에만 공인아이피를 부여, 20.20.20.20 공인아이피로 접속하게되면 web01, web02 서버에 road balancer로 인하여 적용되는걸 볼 수 있습니다.

 

 

 

 

 

댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31