개인적으로 LXD 를 쓸때나, 집에 네트워크를 구성할때 HAProxy 를 종종 씁니다. 가장 간단하면서 강력한 프록시형식의 로드밸런서이자 L7 라우터 이기 때문입니다. 기실 엣지 라우터에서도 이놈을 설치를 할수 있는데, 그렇게 쓰면 NAT 환경에서 뒷단을 쉽게 한개의 IP로 각각의 서버를 서비스 할수 있게 됩니다.
예를 들어서 어떤 IP 1.2.3.4 라는게 있다고 생각 해 봅시다. 여기에 foo.com 이라는 도메인을 연결 합니다. 근데 lxd 나 docker 또는 NAT 환경에서 각 프라이빗 IP(예제로 10.0.0.1/24를 가정 해봅시다.) 를 연결 할때에 10.0.0.2 는 asdf.foo.com 이라는 서브 도메인으로 10.0.0.3 에는 defg.foo.com 이라는 걸로 연결 한다고 가정 해봅시다. 이게 꽤 쉽게 됩니다. (물론 nginx 나 다른 것들도 다 가능은 합니다. 당연하죠. 근데 haproxy 가 그런 서버들과 달리 로우 소켓이나 SNI 헤더라던가... 여튼 더 폭넓은 설정이 가능합니다.
우분투 14.04 기준으로 1.5 버전 이상을 가지고 설명 합니다. 설정 변경후 service haproxy restart 를 해줘야 합니다.
설치(루트권한)
apt-add-repository -y ppa:vbernat/haproxy-1.5 && apt-get update && apt-get install -fy haproxy
아래는 /etc/haproxy/haproxy.cfg 의 예제 일부 입니다...
#default 와 global 부분은 생략.# 아래는 유저 인증이 없는 페이지를 유저 인증을 걸어 줌userlist group1user user_id insecure-password plain_text_password_herefrontend httpbind :80option http-server-closeoption forwardfor# 아래는 조건을 걸어 줍니다.# hdr_beg(host)는 헤더의 Host 필드(Virtual Host)가 특정 단어로 시작 되는 경우 -> true로 매칭이 됩니다.acl acs_asdf hdr_beg(Host) -i asdf. hdr_beg(Host) -i pref.acl acs_def hdr_beg(Host) -i def.# hdr(Host) 는 전역 일치acl acs_web hdr(Host) -i www.foo.com -i foo.com# 아래는 인증이 없는 페이지를 인증을 걸어 줍니다.acl auth_ok http_auth(group1)# 아래는 acs_prefix1 에 대해서 인증을 강제로 걸어줌.http-request auth realm BasicAuth if acs_asdf !auth_ok# 만일에 조건이 매칭되면 특정 백엔드를 사용 함# 인증이 성공 하고 acs_prefix1 이 맞다면...use_backend asdf if acs_asdf auth_ok# 이 경우는 인증이랑 무관하게 접속use_backend def if acs_defuse_backend web if acs_web# 위 조건중 하나도 안걸리면 디폴트로 갑니다.default_backend default# HTTPS 도 동일 합니다.frontend https# PEM 파일을 /etc/haproxy/default.pem 경로에 생성해서 넣어 줍니다. 뭐 이건 아실거라 믿고 설명 생략 합니다.bind :443 ssl crt /etc/haproxy/default.pem ciphers AESGCM+AES128:AES128:AESGCM+AES256:AES256:RSA+RC4+SHA:!RSA+AES:!CAMELLIA:!aECDH:!3DES:!DSS:!PSK:!SRP:!aNULL no-sslv3option http-server-closeoption forwardforrspirep ^Location:\ http://(.*)$ Location:\ https://\1rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomainsacl acs_asdf hdr_beg(Host) -i asdf. hdr_beg(Host) -i pref.acl acs_def hdr_beg(Host) -i def.acl acs_web hdr(Host) -i www.foo.com -i foo.comacl auth_ok http_auth(group1)http-request auth realm BasicAuth if acs_asdf !auth_okuse_backend asdf if acs_asdf auth_okuse_backend def if acs_defuse_backend web if acs_webdefault_backend default# 기본backend defaultserver default 10.1.1.225:1000 checkbackend asdfserver asdf1 10.1.1.2:80 checkbackend defserver def1 10.1.1.3:80 checkbackend webserver web 10.1.1.1:1234 check# 아래는 HTTPS를 지원하는 백엔드. 사실 이게 HTTP 프론트 엔드에 연결해도 됨...backend backendhttpsserver httpbackend1 10.11.0.30:443 ssl check verify none
À̳𵵠¾µ¼ö ÀÖ´Ù°í ÇÏ´õ±º¿ä..
½Ã°£³¯¶§ µû¶óÇغÁ¾ß°Ú½À´Ï´Ù.
°¨»çÇÕ´Ï´Ù!
reverse°¡ µÇ¸é 1°³ÀÇ °¡»ó¼¹ö ip·Î ¼ö¸¹Àº vmÀ» µ¹¸± ¼ö ÀÖÀ»°Å °°½À´Ï´Ù.