IDC 내에서 외부 인터넷 사용이 제한된 곳의 CentOS7 호스트에 HAProxy를 설치하고 운영하는 것에 대하여 정리한 문서입니다.
HAProxy 설치하기
HAProxy를 CentOS에서 설치하는데는 크게 두 가지 방법이 있습니다. "yum"을 이용하는 방법과 소스를 이용하여 직접 빌드하고 설치하는 방법이 있습니다.
본 문서에서는 "HAProxy" 최신 소스를 이용하여 직접 설치하는 방법에 대하여 주로 설명합니다.
yum을 통한 설치
yum(Yellow dog Update)을 이용해 haproxy 패키지를 손쉽게 설치할 수 있습니다.
1 | sudo yum install haproxy - y
|
하지만 위와 같이 설치하면, 1.5.18-8.el7 버전이 설치됩니다.
1 2 3 | haproxy - v
HA - Proxy version 1.5 . 18 2016 / 05 / 10
Copyright 2000 - 2016 Willy Tarreau <willy@haproxy.org>
|
가장 최신 버전을 설치하기 위해서는 "HAproxy.org":http://www.haproxy.org/ 에서 최신 소스를 받아서 직접 빌드하고 설치를 해야만 합니다.
소스를 이용한 직접 빌드 설치
외부 인터넷 사용이 가능한 CentOS7 VM
IDC 내에서 외부 인터넷 사용이 제한된 곳의 CentOS7 호스트에서는 "yum" 등 인터넷 사용이 제한되어, 직접적으로 HAProxy를 설치할 수 없고, 외부 인터넷 사용이 자유로운 동일 버전의 CentOS가 운영되는 VM에서 필요한 패키지 및 소스를 다운로드 받아서 설치해야 합니다.
아래와 같이 HAProxy 최신 소스 및 HAProxy를 빌드하는데 필요한 패키지들을 다운로드 받습니다.
1 2 3 4 5 6 7 8 9 | $ mkdir - p / root / rpms / haproxy
$ curl - o / root / rpms / haproxy / haproxy - 1.9 . 8.tar .gz http: / / www.haproxy.org / download / 1.9 / src / haproxy - 1.9 . 8.tar .gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2320k 100 2320k 0 0 257k 0 0 : 00 : 09 0 : 00 : 09 - - : - - : - - 518k
$ yum - y install make gcc perl pcre - devel zlib - devel openssl - devel - - downloadonly - - downloaddir = / root / rpms / haproxy
$ cd / root / rpms
$ tar cf haproxy - 20190801.tar haproxy /
|
개발자 PC
CentOS7 VM에서 haproxy 설치를 위하여 tar로 묶어 놓은 파일을 다운로드 받고, IDC내 HAproxy를 설치하려는 호스트에 업로드합니다.
1 2 | $ scp root@CentOS7_VM: / root / rpms / haproxy - 20190801.tar .
$ scp haproxy - 20190801.tar root@IDC_HOST: / home / nfs / rpms
|
IDC내 HAProxy 서버 호스트
다음과 같이 HAproxy 설치를 위하여 묶어 놓은 파일을 풀어 줍니다.
다음과 같이 HAProxy 빌드하는데 필요한 패키지들을 설치합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 경고: cpp - 4.8 . 5 - 36.el7_6 . 2.x86_64 .rpm: Header V3 RSA / SHA256 Signature, key ID f4a80eb5: NOKEY
준비 중...
Updating / installing...
1 :perl - HTTP - Tiny - 0.033 - 3.el7
2 :perl - parent - 1 : 0.225 - 244.el7
3 :perl - Pod - Perldoc - 3.20 - 4.el7
4 :perl - podlators - 2.5 . 1 - 3.el7
5 :perl - Pod - Escapes - 1 : 1.04 - 294.el7_6
6 :perl - Text - ParseWords - 3.29 - 4.el7
7 :perl - Encode - 2.51 - 7.el7
8 :perl - Pod - Usage - 1.63 - 3.el7
9 :perl - Carp - 1.26 - 244.el7
10 :perl - Exporter - 5.68 - 3.el7
11 :perl - Filter - 1.49 - 3.el7
12 :perl - File - Path - 2.09 - 2.el7
13 :perl - PathTools - 3.40 - 5.el7
14 :perl - Scalar - List - Utils - 1.27 - 248.e
15 :perl - Socket - 2.010 - 4.el7
16 :perl - Storable - 2.45 - 3.el7
17 :perl - Time - HiRes - 4 : 1.9725 - 3.el7
18 :perl - File - Temp - 0.23 . 01 - 3.el7
19 :perl - Time - Local - 1.2300 - 2.el7
20 :perl - constant - 1.27 - 2.el7
21 :perl - libs - 4 : 5.16 . 3 - 294.el7_6
22 :perl - macros - 4 : 5.16 . 3 - 294.el7_6
23 :perl - Pod - Simple - 1 : 3.28 - 4.el7
24 :perl - Getopt - Long - 2.40 - 3.el7
25 :perl - threads - 1.87 - 4.el7
26 :perl - threads - shared - 1.43 - 6.el7
27 :perl - 4 : 5.16 . 3 - 294.el7_6
28 :mpfr - 3.1 . 1 - 4.el7
29 :libmpc - 1.0 . 1 - 3.el7
30 :cpp - 4.8 . 5 - 36.el7_6 . 2
31 :zlib - devel - 1.2 . 7 - 18.el7
32 :pcre - devel - 8.32 - 17.el7
33 :libverto - devel - 0.2 . 5 - 4.el7
34 :libsepol - devel - 2.5 - 10.el7
35 :libselinux - devel - 2.5 - 14.1 .el7
36 :libkadm5 - 1.15 . 1 - 37.el7_6
37 :libcom_err - devel - 1.42 . 9 - 13.el7
38 :keyutils - libs - devel - 1.5 . 8 - 3.el7
39 :krb5 - devel - 1.15 . 1 - 37.el7_6
40 :kernel - headers - 3.10 . 0 - 957.12 . 2.el
41 :glibc - headers - 2.17 - 260.el7_6 . 5
42 :glibc - devel - 2.17 - 260.el7_6 . 5
43 :gcc - 4.8 . 5 - 36.el7_6 . 2
44 :openssl - devel - 1 : 1.0 . 2k - 16.el7_6 . 1
|
다음과 같이 HAProxy 최신 소스의 압축을 풀고, 소스를 빌드합니다.
HAProxy 2.0 부터는 "linux2628" 대신에 "linux-glibc" 로 "TARGET"이 변경됩니다.
1 | $ make TARGET = linux - glibc USE_PCRE = 1 USE_OPENSSL = 1 USE_ZLIB = 1
|
빌드된 HAProxy 소스를 다음과 같이 설치합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $ make install
`haproxy ' -> `/usr/local/sbin/haproxy'
`doc / haproxy. 1 ' -> `/usr/local/share/man/man1/haproxy.1'
install: creating directory ` / usr / local / doc'
install: creating directory ` / usr / local / doc / haproxy'
`doc / configuration.txt ' -> `/usr/local/doc/haproxy/configuration.txt'
`doc / management.txt ' -> `/usr/local/doc/haproxy/management.txt'
`doc / architecture.txt ' -> `/usr/local/doc/haproxy/architecture.txt'
`doc / peers - v2. 0.txt ' -> `/usr/local/doc/haproxy/peers-v2.0.txt'
`doc / regression - testing.txt ' -> `/usr/local/doc/haproxy/regression-testing.txt'
`doc / cookie - options.txt ' -> `/usr/local/doc/haproxy/cookie-options.txt'
`doc / lua.txt ' -> `/usr/local/doc/haproxy/lua.txt'
`doc / WURFL - device - detection.txt ' -> `/usr/local/doc/haproxy/WURFL-device-detection.txt'
`doc / proxy - protocol.txt ' -> `/usr/local/doc/haproxy/proxy-protocol.txt'
`doc / linux - syn - cookies.txt ' -> `/usr/local/doc/haproxy/linux-syn-cookies.txt'
`doc / network - namespaces.txt ' -> `/usr/local/doc/haproxy/network-namespaces.txt'
`doc / DeviceAtlas - device - detection.txt ' -> `/usr/local/doc/haproxy/DeviceAtlas-device-detection.txt'
`doc / 51Degrees - device - detection.txt ' -> `/usr/local/doc/haproxy/51Degrees-device-detection.txt'
`doc / netscaler - client - ip - insertion - protocol.txt ' -> `/usr/local/doc/haproxy/netscaler-client-ip-insertion-protocol.txt'
`doc / peers.txt ' -> `/usr/local/doc/haproxy/peers.txt'
`doc / close - options.txt ' -> `/usr/local/doc/haproxy/close-options.txt'
`doc / SPOE.txt ' -> `/usr/local/doc/haproxy/SPOE.txt'
`doc / intro.txt ' -> `/usr/local/doc/haproxy/intro.txt'
|
기본적인 설치가 완료된 후에 다음과 같이 설치된 haproxy의 버전을 확인합니다.
1 2 | $ haproxy - version
HA - Proxy version 1.9 . 8 2019 / 05 / 13 - https: / / haproxy.org /
|
HAProxy 서비스를 정상적으로 실행하기 위해서는 haproxy 계정을 시스템 계정으로 등록되어 있어야 합니다.
다음과 같이 "haproxy" 계정을 등록합니다.
1 2 | $ groupadd - - gid 980 haproxy
$ useradd - - gid 980 - - uid 980 - r haproxy
|
HAProxy 설정 파일을 초기화합니다.
1 2 3 4 | $ mkdir - p / etc / haproxy \
&& touch / etc / haproxy / haproxy.cfg \
&& touch / etc / haproxy / domain2backend. map .cfg \
&& chown - R haproxy:haproxy / etc / haproxy /
|
HAProxy 라이브러리 디렉토리 및 상태 파일을 초기화합니다.
1 2 3 | $ mkdir - p / var / lib / haproxy \
&& touch / var / lib / haproxy / stats \
&& chown - R haproxy:haproxy / var / lib / haproxy
|
"haproxy"에 대한 심볼릭 링크를 설정합니다.
1 | $ ln - s / usr / local / sbin / haproxy / usr / sbin / haproxy
|
HAProxy 서비스를 설치합니다.
1 2 3 4 5 6 7 8 9 | $ cp . / examples / haproxy.init / etc / init.d / haproxy \
&& chmod 755 / etc / init.d / haproxy \
&& chkconfig haproxy on
$ systemctl status haproxy
● haproxy.service - SYSV: HA - Proxy is a TCP / HTTP reverse proxy which is particularly suited for high availability environments.
Loaded: loaded ( / etc / rc.d / init.d / haproxy; bad; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd - sysv - generator( 8 )
|
환경설정
HAPorxy 기본 설정
일반적으로 "home1.wb.com", "home2.wb.com"와 같이 두 도메인에 대한 매핑 설정을 위하여 아래와 같이 "haproxy.cfg" 파일을 작성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | $ 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
|
환경설정값이 유효한지 확인한다.
1 2 | $ / usr / sbin / haproxy - f / etc / haproxy / haproxy.cfg - c
Configuration file is valid
|
HAProxy 서비스를 활성화합니다.
1 2 3 | $ systemctl enable haproxy
haproxy.service is not a native service, redirecting to / sbin / chkconfig.
Executing / sbin / chkconfig haproxy on
|
HAProxy 서비스를 시작합니다.
1 | $ systemctl start haproxy
|
서비스가 정상적으로 구동하고 있는지 *:8888 포트로 접속하여 확인합니다.
동적으로 도메인 매핑 추가하는 방법
HAProxy를 이용하여 서비스해야할 backend 및 도메인이 동적으로 변경된다면 앞서 작성한 기본 설정과 같은 정적 구성으로는 불가능합니다.
동적으로 도메인을 매핑하여 처리하기 위해서는 "frontend main" 단에서 "acl" 및 "use_backend" 항목들을 다음과 같이 변경하고, 도메인에 대한 실질적인 매핑은 설정한 매핑 파일에 설정하여 동적으로 동작할 수 있도록 합니다.
1 2 3 4 5 | frontend main
bind ::: 80 v4v6
option http - server - close
use_backend % [req.hdr(host),lower,map_dom( / etc / haproxy / domain2backend. map ,default)]
default_backend default
|
하지만, 도메인에 매핑될 backend 정보가 변경되면, "haproxy.cfg" 파일에 추가해 줄 수밖에는 없습니다.
1 2 3 4 5 6 7 8 9 | backend backend_4
balance roundrobin
server server1 192.168 . 56.204 : 8004 check
server server2 192.168 . 56.205 : 8004 check
backend backend_5
balance roundrobin
server server1 192.168 . 56.204 : 8005 check
server server2 192.168 . 56.205 : 8005 check
|
haproxy.cfg에서 설정한 것과 같이, 도메인별 매핑을 위한 파일(domain2backend.map)을 다음과 같이 작성합니다.
1 2 3 4 5 6 7 | $ vi / etc / haproxy / domain2backend. map
home1.wb.com backend_1
home2.wb.com backend_2
test4.wb.com backend_4
shop5.wb.com backend_5
|
위와 같이 "haproxy.cfg"에 신규 backend를 추가하고 도메인별 매핑을 위한 파일(domain2backend.map)에 신규 도메인을 추가한 이후에는 HAProxy 서비스를 재시작하지 않고, 동적으로 설정 다시 읽기는 다음과 같이 수행합니다.
1 | / usr / local / sbin / haproxy - f / etc / haproxy / haproxy.cfg - p / var / run / haproxy.pid - sf $(cat / var / run / haproxy.pid)
|
위와 같이 하면, 아주 일부 사용자의 연결이 불안정할 수 있습니다.
HAProxy 설치 관련 참고글