리눅스

HAproxy 수동 설치와 설정 공부 내용

나뭇빛자루 2021. 6. 17. 13:29
반응형

1. 설치

 

일반 설치 방법

설치 yum install -y haproxy

 

HAProxy 수동설정 (yum 이나 apt는 버전이 바뀌거나 안맞기 때문에 수동 추전)

 https://upcloud.com/community/tutorials/haproxy-load-balancer-centos/
http://www.haproxy.org/
여기서 원하는 버전을 선택해 URL을 따준다.


yum install gcc pcre-devel tar make -y
wget  아까 복사한UR?L
tar xzvf haproxy.tar.gz /풀위치


풀어준 위치 안으로 들어가서 make 해준다 타겟에 리눅스 값을 넣어준다.
make TARGET=linux-glibc
make install

세팅될 디렉터리들 생성해준다.
sudo mkdir -p /etc/haproxy
sudo mkdir -p /var/lib/haproxy 
sudo touch /var/lib/haproxy/stats

다른 유저들도 사용가능하도록 설정 
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
데몬설정 넣어줘야함 systemctl
cp ~/haproxy-2.0.7/examples/haproxy.init /etc/init.d/haproxy
sudo chmod 755 /etc/init.d/haproxy
sudo systemctl daemon-reload

유저 생성해주고
useradd -r haproxy

마지막 버전 확인
haproxy -v

 

haproxy -f /etc/haproxy/haproxy.cfg -c
기본 설정 파일 경로 cat /etc/haproxy/haproxy.cfg

 


HAProxy 란  SW 로드밸런서 임
들어가기 앞서 로드벨런서의 기능
1. NAT : 사설 IP를 공인 IP주소로 바꾸는데 사용하는 통신망의 주소 변조기
2. DSR : LB 사용시 서버에서 클라이언트로 되돌아가는 경우 목적지 주소를 스위치의 IP주소가 아닌 클라이언트 IP주소로 전달해서 네트워크 스위치를 거치지 않고 클라이언트 바로 찾아감
3. Tunneling : 인터넷상에서 눈에 보이지 않는 통로를 만들어 통신 가능
scale-out : 부하를 여러 서버에게 분산하는 경우 

HAProxy 는 고가용성 프락시로 TCP/HTTP 를 로드밸런서로 사용할 수 있습니다.
즉 L7 로드벨런서라고 볼 수 있다.
nginx 랑 다른점은 뭘까? nginx에서도 물론 Revers Proxy 기능과 로드벨런서 기능을 제공하지만
HAProxy는 여기에 Active Health Check 기능을 제공합니다.

동작방식 
기존에 프록시는 출발지에서 목적지 사이에 존재하고 클라이언트 앞에 존재한다.
Revers Proxy는 그 반대라고 보면된다. 실제 서버요청에 대해 서버 앞단에 존재하여 서버로 들어오는 요청을 대신 받아 실제 서버에게 전달하고 요청한 곳에 그 결과를 다시 전달하는 기술이다.
nginx를 이용해 로드밸런싱을 구성할 때 이와 같은 방법을 사용함
 
위 그림과 같이 이뤄짐 최초 접근시 이반적인 HTTP요청으로 전달함
HAproxy가 새로운 사용자를 인식하고 이사용자가 연결한 전용 인스턴스 쿠키 이름으로 전달해줌
재요청시 클라이언트가 주어주는 쿠기를 가지고 처음연결했던 인스턴스에 연결해주는 방식
순서대로 나열하면


1. 최초 접속시에는 쿠키 없이 일반 요청전달
2. 응답시 쿠키에 서버 정보 추가한 후 반환
3. 재요청시에는 HAProxy에서 쿠키 정보 확인후 최초 요청 서버로 전달
4. 다시 접근시에는 쿠키 추가 없이 전달(클라이언트가 가지고있는 쿠키 대체)


HAproxy에 mode가 중요한데 여기서 tcp랑 http 모드가 있다 이는 물리적으로 L4와 L7스위치 기능이고
L4 스위치는 real ip 를 vip로 묶어서 로드밸런싱을 하며
TCP와 UDP 포트정보를 확인해 해당 패킷이 사용하는 서비스 종류별로 처리한다.
TCP/UDP 포트를 이용하여 로드밸런싱과 포트 정보를  참조해 스위칭을 함

 

L7스위치는 
TCP/UDP 포트정보와 함께 패킷의 내용까지 참조해서 스위칭한다
포트 + 페이로드(실제 데이터,컨텐츠, 혹은 URL 해더 같은)를 분석함
HTTP의 url이나 쿠키정보 바이러스 패턴 분석 등 유리한 로드밸런싱이 가능하나 속도가 그만큼 느려진다
DDos 방어 , 패킷 필터링이 가능하고 / FTP파일 제목 등 정보로도 스위칭 가능
HTTP 해더 값에 따라 특정 문자열을 기준으로 로드밸런싱 가능함.


L4 스위치 적용된 것

mode를 http 로 하면 L7 로드벨런스 느낌으로 설정 가능하다.

그리고 acl을 지원하여
 
이런식으로 해더를 분석하여 서버별 부하 분산이 가능하다.
acl 문법은
acl [aclname] [criterion][,converter] [flags] [operator] [pattern] 이런식이며
-I 옵션은 대소문자 관계없이 매칭 가능
소스 및 대상 IP 주소 및 포트
SSL 핸드 셰이크 메타데이터
해더 / 쿠키 / URL 및 방법을 포함한 HTTP 메타 데이터 등  가능함

API 게이트웨이가 처리하는 몇 가지 기능이 있다.
고성능 / 부하분산 / HTTP 라우팅 / 보안/ 속도 제한 / 관찰 가능성 / 연결 대기열 / 회로차단 등

community Edition 의 경우 /etc/haproxy/haproxy.cfg에 있고
haproxy -c -f /etc/haproxy/haproxy.cfg 으로 번경 확인가능

HAPROXY 의 4가지 config 요소 들을 알아보겠음
첫 번째로 global , defaults, frontend, backend가 있음  

global 은 ha프락시 설정파일 첨에 있음 여기는 낮은 수준에서 HAproxy에 영향을 주는 프로세스 전체 보안 및 성능 조절을 할 수 있음
maxconn 연결할 수 있는 최대 연결 수 제한함
log 런타임에 발생하는 문제가 syslog에 기록되도록함 
user ,group : 1024 미만의 포트에서 수신하려면 프로세스가 루트이여야만한다.
stats socket : 런타임 API를 활성화 하여 서버 및 상태 확인을 동적으로 비활성화 하고 서버의 로드밸런싱 가중치를 변경하고 기타 유요한 레버를 끌어오는데 사용 할 수 있음 
https://www.haproxy.com/blog/dynamic-configuration-haproxy-runtime-api/  참고
nbproc, nbthread : 시작시 프로세스와 스레드의 수를 지정한다.
ssl-deault-bind-ciphers : bind 지시문이 기본적으로 사용할 ssl 암호를 열거함
ssl-default-bind-optins

defaults 구성이 증가할 때 여기를 디폴트를 사용하면 줄이는데 도움이 된다.
frontend와 backend섹션에 적용이 되며 다음 섹션 내에 이러한 설정을 재정의 할 수 있음
timeout [connect, client, server] s 접미사는 초를 나타내고 만료되는 시간을 나타냄
log
mode [tcp, http] : TCP수준이나 http수준의 LB모드를 정할 수 있음 frontend및 backend섹션에서 동일한 모드일 경우 defaults에만 먼저 기입하는게 좋다.
maxconn 최대 접속자 수를 정하는 것임 
frontend 는 백엔드 서버 앞에 HAproxy를 역방향 프록시로 배치하면 frontend 센션에서 클라이언트가 연결 할 수 있는 IP주소와 포트를 정의한다.
 
bind에 설정된 주소의 포트와 IP를 할당 한다. 
http-requset redirect 는 다른 URL을 시도해야 클라이언트에 응답한다. 암호화 되지 않은 HTTP를 통해 웹사이트를 요청하는 클라이언트는 사이트의 HTTPS버전으로 리디렉션 된다.
use_backend 의 경우 규칙을 추가할 때 쓰고, 주어진 조건이 참인 경우 응답할 서버의 백엔드 풀을 선택한다.  https://www.haproxy.com/blog/introduction-to-haproxy-acls/ 여기를 참조하셈
default_backend 는 use_backed가 다른곳으로 보내지 않을 때 기본적으로 보낼 서버 선택을 하고 이 둘이 라우팅 되지 않으면  503 오류를 반환 한다.

backend 센션은 부하  균형 및 행들 요청에 할당 되고 서버 그룹을 정의한다
 
balance에서는 로드밸런싱 제어 방법을 표기해줌 roundrobin이랑 leastconn(접속수적은) 등 있다
static-rr 서버에 부여된 가중치에 따라 분배
source 운영중인 서버의 가중치를 나눠 접속자 IP 해싱
uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠 분배
url_param : HTTP GET 요청에 대해서 특정 패턴으로 분배됨 없음 RR
hdr : HTTP 헤더에서 hdr()로 지정된게 있을때
rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배
cookie 쿠키 설정은 쿠키 기반 지속성을 활성화 한다. 이름의 초기 응답을 준 서버의 이름과 연결 할 수 있고 클라이언트 세선 동안에 해당 서버랑 계속 쿼리할 수 있음 server에서 쿠키설정해줘야함
option httpchk http의 상태를 점검하는 옵션으로 mode http가 아니면 사용 불가하다. 보통은 루트 경로에 요청을 보내 확인을 한다.
defaoult-server 설정은 server 상태 확인 최대 연결 활성화 등 같이 설정을 해 준다. 또 이러한 인수들은 각 server 에서 설정이 가능하다.
server 설정은 이름과 서버의주소:포트 로 구성이 된다. 
예시 : server [이름] IP:포트 cookie [이름] / check도 들어갈 수 있음
server ip:port cookie [쿠키이름] check inter [주기] rise [서버구동여부점검횟수] fail [설정횟수]
rise는 정상동작체크로 설정횟수 만족하면 정상간주
fail은 설정횟수 미만이면 fail 간주

api 게이트웨이 설정
api 게이트웨이는 API 서비스에 대한 로드밸런싱 , 보안, 속도 제한, 모니터링 등을 처리함
오픈소스 API 게이트웨이 
지능적으로 라우트 요청을하는 클라이언트와 백엔드 서비스 사이의 소프트웨어 계층이고 /cart 또는 /catalog에 대한 API 호출을 적절한 백엔드 서비스로 라우팅하는 것 외에도 로드밸런싱 보안 속도 제한 및 기타 교차 문제를 처리한다. 본질적으로 HAproxy 인스턴스 뒤에 모든 API를 배치하면 이러한 요구 사항을 오프로드 할 수 있음
 
- HTTP 라우팅
API 게이트웨이의 기본적할은 들어오는 클라이언트 요정을 적잘한 내부 서비스로 라우팅 하는 것이다! HAproxy는 URL 경로 쿼리 문자열 및 HTTP 헤더 부분을 포함하여 HTTP요청에서 찾은 모든 정보를 기반으로 라우팅할 수 있음.
frontend에서 설정 하여 백앤드로 뿌려주는 역할인데 밑에 예시를 들겠음
frontend my_web
bind :443 ssl crt /[인증서 위치.pem]
acl [acl규칙이름1] path_beg -i /위치1
acl [acl규칙이름2] path_beg -i /위치2
  use_backend [백앤드이름1] if [acl규칙이름1]
use_backend [백앤드이름2] if [acl규칙이름2]
backend [백앤드이름1]
server s1 IP:port
backend [백앤드이름2]
server s2 IP:port
멀티 웹사이트를 관리할 때 호스트 헤더를 확인하여 분리 가능
frontend api_gateway
bind :443 crt /[인증서위치.pem]
#해더에 대한 요청?인듯함 이렇게 설정을 하면됨
acl [acl규칙이름1] req.hdr(Host) -i -m dom www.yourwebsite1.com
acl [acl규칙이름2] req.hdr(Host) -i -m dom www.yourwebsite2.com
#디랙터리 접근에 대한 acl
acl [acl규칙이름3] path_beg -i /위치1
acl [acl규칙이름4] path_beg -i /위치2
#어디백엔드로 갈지 정하는 것
use_backend 백앤드이름1 if [acl규칙이름1] [acl규칙이름3]
use_backend 백앤드이름2 if [acl규칙이름2] [acl규칙이름4]

backend 백앤드이름1
server s1 IP:port
backend 백앤드이름2
server s1 IP:port
위 파일 뿐만 아니라 맵파일을 통해서 더 많이 쉽고 간편하게 관리를 할 수 있음
맵파일 예시
 
frontend 에서 설정
 
이러고 해당 backend 를 작성해 주면 될 거 같음 생각보다 map파일을 쓰면 config 파일 관리가 쉬워진다.

- 로드밸런싱
각 API 엔드 포인트의 성능과 복원력을 향상 시키려면 여러 노드 서비스를 복제하는 것이 좋음 다음 API 게이트웨이는 들어오는 클라이언트 요청간에 균형을 맞추 ㄹ 수 있음 서비스 유형 및 프로토콜에 맞게 로드밸런싱 알고림즘을 조정할 수 있음
roundrobin 은 빠르고 짧은 API호출을 위해 사용
leastconn은 수명이 긴 웹 소켓의 경우 알고리즘 사용
uri는 특정 기능을 처리하도록 최적화 된 백엔드 서버가 있는 경우 사용

roundrobin의 사용은 backend에서 사용함
backend test_api
balance roundrobin
server s1 ip:port
server s2 ip:port
여기서 HAporxy가 문제가 있을 경우 트래픽을 자동으로 다시 라우팅하도록 활성화 가능함
backend test_api
balance roundrobin
        option httpchk GET /health
server s1 ip:port check
server s2 ip:port check
option httpchk 지침은 모니터 방법 및 URL을 설정함 
maxconn을 써서 접속 제한을 할 수 있음 server s1 ip:port maxconn [제한할 숫자]

- rate limiting
APls의 쿼리를 재한 할 수 있음 하루에 요청 제한을 둔 상태
frontend api_gateway
    bind :443 ssl crt /etc/hapee-1.8/certs/cert.pem
    stick-table type string size 1m expire 24h store http_req_cnt

    acl exceeds_limit  url_param(apitoken),table_http_req_cnt(api_gateway) gt 1000

    http-request track-sc0 url_param(apitoken) unless exceeds_limit
    http-request deny deny_status 429 if exceeds_limit
이 설정이 넘어 서면 429 애러 표출한다. 
아래는 초당 하나 이상의 요청을 만들 수 없게 함
frontend api_gateway
    bind :443 ssl crt /etc/hapee-1.8/certs/cert.pem
    stick-table type string size 1m expire 24h store http_req_rate(10s)

    acl rate_abuse  url_param(apitoken),table_http_req_rate(api_gateway) gt 10

    http-request track-sc0 url_param(apitoken) unless rate_abuse
    http-request deny deny_status 429 if rate_abuse


rsyslog 에 haproxy 용 로그를 남기도록 설정한다. /etc/rsyslog.d/haproxy.conf 파일을 다음과 같이 구성한다.
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
$template Haproxy, "%msg%\n"
#rsyslog 에는 rsyslog 가 메세지를 수신한 시각 및 데몬 이름같은 추가적인 정보가 prepend 되므로, message 만 출력하는 템플릿 지정
# 이를 haproxy-info.log 에만 적용한다.

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

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

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

logroate 에 haproxy 설정을 추가한다. /etc/logrotate.d/haproxy 파일을 다음과 같이 구성한다. haproxy 는 재시작할 필요가 없으므로 rsyslog 를 재시작해준다./var/log/haproxy/*log {
    daily
    rotate 90
    create 0644 nobody nobody
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/systemctl restart rsyslog.service > /dev/null 2>/dev/null || true
    endscript
}

vi /etc/haproxy/haproxy.cfg
 

다른 설정 
global
    log         127.0.0.1 local2 info
 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    stats socket           /var/run/haproxy.sock mode 666 level admin
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
 
    stats socket /var/lib/haproxy/stats
 
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    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
 
listen stats
    bind :::8888 v4v6
    mode http
    stats enable
    stats hide-version
    stats uri /
    stats realm Haproxy\ Statistics
    stats auth user:password
 
frontend  main
    bind :::80 v4v6
    option                      http-server-close
    acl host_home1 hdr(host) -i home1.wb.com
    acl host_home2 hdr(host) -i home2.wb.com
    use_backend backend_1 if host_home1
    use_backend backend_2 if host_home2
    default_backend             default
 
backend default
    balance     roundrobin
    server  server1 192.168.56.204:8001 check
    server  server2 192.168.56.205:8001 check
 
backend backend_1
    balance roundrobin
    server  server1 192.168.56.204:8002 check
    server  server2 192.168.56.205:8002 check
 
backend backend_2
    balance roundrobin
    server  server1 192.168.56.204:8003 check
    server  server2 192.168.56.205:8003 check



이외에 흥미로운  URL

이건 도커 파일 써서 뭐 만드는데 신기해보인당 
https://m.blog.naver.com/wideeyed/221856790984
https://www.haproxy.com/blog/how-to-map-domain-names-to-backend-server-pools-with-haproxy/

설명 블로그 
https://dev-youngjun.tistory.com/97
소켓 통신 
http://blog.naver.com/PostView.nhn?blogId=wideeyed&logNo=220981848585&parentCategoryNo=&categoryNo=47&viewDate=&isShowPopularPosts=false&from=postView
최신버전 2.4의 변경점 
https://www.haproxy.com/blog/announcing-haproxy-2-4/
api 게이트웨이 설정 방법 
https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-1/

도커 2편 정리
https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-2-authentication/

속도 조절하기
https://www.haproxy.com/blog/introduction-to-haproxy-stick-tables/
https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/

도커 사용
https://hub.docker.com/_/haproxy

반응형