티스토리 뷰
□ 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로 인하여 적용되는걸 볼 수 있습니다.
'DevOps' 카테고리의 다른 글
Spring boot Thread Pools 에러 (0) | 2020.06.03 |
---|---|
[NBP Cloud] jupyterhub install (1) | 2020.05.27 |
[NBP] ELK Service 구성 (filebeat, logstash, elasticsearch, kibana) (0) | 2020.04.21 |
[NBP_Cloud] web / was 분리해서 구성해보기 - 4 (2) | 2020.01.28 |
[NBP_Cloud] web / was 분리해서 구성해보기 - 3 (0) | 2020.01.28 |
댓글