개요
Haproxy 는 L4, L7 과 같은 하드웨어 로드밸런서를 대체하기 위한 오픈소스 소프트에어로 이름처럼 Reverse Proxy 를 기반으로 로드밸런싱을 하기에 매우 강력하고 또 가벼운 어플리케이션이다. HA (High Availability) 라는 이름처럼 고가용성을 위하여 설계되었다. Nginx 로드밸런싱과 다른 점은 헬스체크라고 볼 수 있는데, 특정 API 에 접근하여 서버 상태를 점검하고, 문제가 있으면 다른 node 로 트래픽을 넘겨줄 수 있는 기능을 한다.
여기서 리버스 프록시를 기반을 동작한다고 한다. 간단히 정리하고 넘어가야한다.
리버스 프록시
우선 이름으로 보면 역방향 프록시 라고 볼 수 있는데 말 그대로다. 프론트에서 프록시서버로 요청하면 프록시서버는 클라이언트의 요청을 숨겨진 백엔드 서버로 전달하여 리턴받은 값을 클라이언트로 전달하는 역할을 한다.
여기서 중요한것은 클라이언트는 백엔드 서버의 도메인을 모르며 리버스프록시 서버로 요청 한다는 것이다.
클라이언트는 그냥 리버스 프록시 서버가 하나의 서버인 줄 알고 요청하게된다.
포워드 프록시랑은 다르다, 포워드 프록시는 백엔드 서버의 응답을 클라이언트로 던지는 동작을 함으로써, 클라이언트는 백엔드의 존재를 알지만 프록시서버를 통해 응답을 받는 형태다.
포워드 프록시
리버스프록시의 반대로 클라이언트가 프록시서버를 통해 응답을 받는 형태로 설정 방법도 다르다, 포워드 프록시서버는 그냥 혼자 동작 하고 있으며 클라이언트가 포워드 프록시를 설정으로 가져가고 이를 통해 백엔드 서버로 요청하면 백엔드 서버는 포워드 프록시가 클라이언트인 줄 알고 응답하게된다.
config
주로 config파일 변경해가면서 구동 시키는게 간단한 사용 법인거 같다.
global
말그대로 글로벌 세팅이다, 보통 프록시 서버 자체의 글로벌 세팅을 적는다. 로그나 maxconnextion daemon구동인지 등등이 있다.
defaults
frontend든 backend등에서 쓰는 옵션중 default로 설정할 부분들을 설정한다. 보통 타임아웃이나 로깅 등등을 설정한다.
frontend {name}
frontend 단의 설정을 세팅한다, 프록시 서버 입장에서 클라이언트들에게 열어줄 포트나, ssl사용 여부, 프로토콜 방식 그리고 백엔드로 연결할 ACL(aAccess Control List) 등을 설정한다.
ACL
Access Control List의 약자로 네트워크에서 L3 위치에 속해 있으며 접근제어 목록이라는 말 그대로 외부 접근에 대한 필터링 조건식 등등을 걸 수 있다.
https://www.haproxy.com/blog/introduction-to-haproxy-acls/
use_backend
말그대로 뒤에 나올 설정된 백엔드를 사용할지 말지에 대한 선택인데, 조건식을 넣을 수도 있고 ACL을 이용할 수도 있다.
back_end
리버스 프록시를 진행하면서 백엔드로 넘길 정보들을 설정하는 구간이다. 여러개를 설정할 수 있으며 frontend에서 선택 당한 backend로 프록싱을 하는등의 설정을 할 수 있다.
ex) backend1, backend2 인 두개의 도메인을 갖고있는 서버에서의 HAProxy
global
daemon
maxconn 256
log 127.0.0.1 local0
tune.ssl.default-dh-param 2048
defaults
timeout connect 10s
timeout client 10m
timeout server 10m
timeout http-request 60s
timeout http-keep-alive 60s
log global
frontend http-in
mode http
option httplog
option forwardfor
bind *:80
bind *:443 ssl crt /usr/local/etc/haproxy/ssl.pem
reqadd X-Forwarded-Proto:\ https
redirect scheme https if !{ ssl_fc }
default_backend back2
acl restricted-access-outside-domain hdr(host) -i www.backend1.co.kr
acl is_use_back2 hdr_end(host) -i www.backend2.co.kr
#backend2 도메인으로 들어온 요청은 asm-auth라는 backend로 포워딩한다.
use_backend back2 if is_use_back2
#backend1로 들어온 요청은 https만 받는다 (http 거부)
http-request deny if restricted-access-outside-domain
backend back2
mode http
option forwardfor
#back2 라는이름의 로컬 5655 포트로 바인딩된 서비스를 헬스체크 하면서 http 모드로 포워딩하기위해 사용한다
server back2 127.0.0.1:5655 check
backend back1
mode http
option forwardfor
server back1 127.0.0.1:5656 check
- 해당 서버로 backend1의 도메인으로 요청 할 수도 있고, backend2의 도메인으로 요청 할 수도 있기 때문에 HAProxy에서 열어둔 80, 443 포트로 들어온 요청의 도메인 이름을 보고 그에 맞게 가려진 뒤의 서비스 포트로 넘겨준다. (직접적인 서비스포트로는 접근 불가하다.)