달리는 두딘

[Linux] haproxy 설명 및 haproxy.cfg 설정 본문

지식노트

[Linux] haproxy 설명 및 haproxy.cfg 설정

디두딘 2023. 3. 9. 23:43

haproxy란?

haproxy는 고가용성, 고성능 TCP/HTTP 로드 밸런서 동작을 한다.

 

보통의 proxy 서비스는 TCP, load balance, routing 의 역할을 수행하지만 haproxy를 사용하게 된 이유는 다음과 같다.

1. 소스코드로 배포하여 임베디드 환경 등 플랫폼에 상관없이 사용할 수 있다. 
2. config file 기반 설정이 용이하고 config 메뉴얼 배포가 잘되어있다.
3. HTTP routing 이 가능하다.

 

가장 중요한 3. HTTP routing 이 중요한 이유는

외부에 특정 포트만 노출하고(e.g. 80) 그 포트로 http/ws/unix socket 등 다양한 프로토콜을 라우팅 하기 위함이다.

 

haproxy routing case

 

haproxy 가 80 포트로 대기하고 외부로부터 80 포트로 서로 다른 프로토콜이 접속하면 그에 대한 처리를 한다.

1) http (일반적인 웹 접근)
2) websocket (http header websocket upgrade 타입, ws 프로토콜 사용)
3) unix socket(일반적인 tcp 소켓 접근)

 

접속이 성사되면 각 header 또는 data를 분석하여 각각에 맞는 서비스로 전달한다.

1) http 프로토콜 > http header, 웹 서비스 요청으로 판단 > apache2 전달
2) websocket 프로토콜 > http header를 분석하여 ws 요청 판단 > websocket interface, websocket 서비스로 전달
3) unix socket 프로토콜 >  payload가 00000000(8bytes zero)이면 socket 요청으로 판단 > socket 프로세스 전달

 

각각의 세션은 모두 haproxy 가 관리한다.

 

위와 같은 설정들을 통해서 [웹 브라우저 - 인터페이스 - 프로세스] 같은 서로 다른 프로토콜과 계층간 통신이 가능해진다.

 

haproxy.cfg 파일 내용

# haproxy.cfg

global
    maxconn     4096
    nbproc      1

defaults

frontend all
    mode tcp
    bind  *:80

    tcp-request inspect-delay 500ms
    tcp-request content accept if HTTP

    # websocket
    acl is_websocket hdr(upgrade) -i websocket
    use_backend ws_backend if is_websocket

    acl is_socket payload(0,4) -m bin 00000000
    use_backend socket_backend if !HTTP is_socket

    default_backend www_backend
#frontend

backend www_backend
    mode        http
    option      httpclose
    option      forwardfor
    option      http-server-close
    no option   httpclose

    server apache2 localhost:8100 weight 1 maxconn 1024 check
# backend

backend ws_backend
    mode        tcp

    server ws_router_out localhost:2200 weight 1 maxconn 1024 check
# backend

backend socket_backend
    mode        tcp

    server ws_router_in localhost:2100 weight 1 maxconn 1024 check
# backend

 

linux netstat 명령을 통한 haproxy 세션 목록 확인

  • 외부 접근은 모두 80 포트로 이루어지고 각 세션은 internal socket 에 연결되어 있는 것을 확인할 수 있다.
  • lsof -p <포트번호> 를 이용하여 어떤 포트가 어떤 프로세스와 연결되어 있는지 확인할 수 있다.
muabow@muabow-WorkSpace:~# netstat -anpt | grep haproxy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1753/haproxy
tcp        0      0 127.0.0.1:36318         127.0.0.1:2200          ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8654     ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8655     ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8652     ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8653     ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8651     ESTABLISHED 1753/haproxy
tcp        0      0 192.168.46.11:80        192.168.47.159:8669     ESTABLISHED 1753/haproxy
muabow@muabow-WorkSpace:~#

 


 

더 자세한 내용은 해당 사이트를 참고

http://www.haproxy.org/

 

HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer

2.1 2019-11-25 2021-Q1 (unmaintained) 2.1.12 2021/03/18 git / web / dir / announce / bugs 1.9 2018-12-19 2020-Q2 (unmaintained) 1.9.16 2020/07/31 git / web / dir / announce / bugs 1.6 2015-10-13 2020-Q4 (unmaintained) 1.6.16 2021/03/19 git / web / dir / an

www.haproxy.org

 

 

출처

https://blog.muabow.com/245