Linux,Unix,BSD

HAProxy-1.9.8 설치 (on CentOS 7)

채윤아빠 2019. 10. 4. 14:49
728x90
반응형



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 -/root/rpms/haproxy
$ curl -/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 설치를 위하여 묶어 놓은 파일을 풀어 줍니다.

1
2
# cd /home/nfs/rpms
# tar xf haproxy-20190801.tar

다음과 같이 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
# cd /home/nfs/rpms/haproxy
# mv haproxy-1.9.8.tar.gz ..
# rpm -Uvh *rpm --replacepkgs
경고: cpp-4.8.5-36.el7_6.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
준비 중...                         ################################# [100%]
Updating / installing...
   1:perl-HTTP-Tiny-0.033-3.el7       ################################# [  2%]
   2:perl-parent-1:0.225-244.el7      ################################# [  5%]
   3:perl-Pod-Perldoc-3.20-4.el7      ################################# [  7%]
   4:perl-podlators-2.5.1-3.el7       ################################# [  9%]
   5:perl-Pod-Escapes-1:1.04-294.el7_6################################# [ 11%]
   6:perl-Text-ParseWords-3.29-4.el7  ################################# [ 14%]
   7:perl-Encode-2.51-7.el7           ################################# [ 16%]
   8:perl-Pod-Usage-1.63-3.el7        ################################# [ 18%]
   9:perl-Carp-1.26-244.el7           ################################# [ 20%]
  10:perl-Exporter-5.68-3.el7         ################################# [ 23%]
  11:perl-Filter-1.49-3.el7           ################################# [ 25%]
  12:perl-File-Path-2.09-2.el7        ################################# [ 27%]
  13:perl-PathTools-3.40-5.el7        ################################# [ 30%]
  14:perl-Scalar-List-Utils-1.27-248.e################################# [ 32%]
  15:perl-Socket-2.010-4.el7          ################################# [ 34%]
  16:perl-Storable-2.45-3.el7         ################################# [ 36%]
  17:perl-Time-HiRes-4:1.9725-3.el7   ################################# [ 39%]
  18:perl-File-Temp-0.23.01-3.el7     ################################# [ 41%]
  19:perl-Time-Local-1.2300-2.el7     ################################# [ 43%]
  20:perl-constant-1.27-2.el7         ################################# [ 45%]
  21:perl-libs-4:5.16.3-294.el7_6     ################################# [ 48%]
  22:perl-macros-4:5.16.3-294.el7_6   ################################# [ 50%]
  23:perl-Pod-Simple-1:3.28-4.el7     ################################# [ 52%]
  24:perl-Getopt-Long-2.40-3.el7      ################################# [ 55%]
  25:perl-threads-1.87-4.el7          ################################# [ 57%]
  26:perl-threads-shared-1.43-6.el7   ################################# [ 59%]
  27:perl-4:5.16.3-294.el7_6          ################################# [ 61%]
  28:mpfr-3.1.1-4.el7                 ################################# [ 64%]
  29:libmpc-1.0.1-3.el7               ################################# [ 66%]
  30:cpp-4.8.5-36.el7_6.2             ################################# [ 68%]
  31:zlib-devel-1.2.7-18.el7          ################################# [ 70%]
  32:pcre-devel-8.32-17.el7           ################################# [ 73%]
  33:libverto-devel-0.2.5-4.el7       ################################# [ 75%]
  34:libsepol-devel-2.5-10.el7        ################################# [ 77%]
  35:libselinux-devel-2.5-14.1.el7    ################################# [ 80%]
  36:libkadm5-1.15.1-37.el7_6         ################################# [ 82%]
  37:libcom_err-devel-1.42.9-13.el7   ################################# [ 84%]
  38:keyutils-libs-devel-1.5.8-3.el7  ################################# [ 86%]
  39:krb5-devel-1.15.1-37.el7_6       ################################# [ 89%]
  40:kernel-headers-3.10.0-957.12.2.el################################# [ 91%]
  41:glibc-headers-2.17-260.el7_6.5   ################################# [ 93%]
  42:glibc-devel-2.17-260.el7_6.5     ################################# [ 95%]
  43:gcc-4.8.5-36.el7_6.2             ################################# [ 98%]
  44:openssl-devel-1:1.0.2k-16.el7_6.1################################# [100%]

다음과 같이 HAProxy 최신 소스의 압축을 풀고, 소스를 빌드합니다.

1
2
3
4
5
# mkdir -p /root/work/
# cd /root/work
# cp /home/nfs/rpms/haproxy-1.9.8.tar.gz .
# tar xf haproxy-1.9.8.tar.gz && cd haproxy-1.9.8
# make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1

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 -/etc/haproxy \
    && touch /etc/haproxy/haproxy.cfg \
    && touch /etc/haproxy/domain2backend.map.cfg \
    && chown -R haproxy:haproxy /etc/haproxy/

HAProxy 라이브러리 디렉토리 및 상태 파일을 초기화합니다.

1
2
3
$ mkdir -/var/lib/haproxy \
    && touch /var/lib/haproxy/stats \
    && chown -R haproxy:haproxy /var/lib/haproxy

"haproxy"에 대한 심볼릭 링크를 설정합니다.

1
$ ln -/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 -/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
 
#domainname  backendname
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 -/etc/haproxy/haproxy.cfg -/var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

위와 같이 하면, 아주 일부 사용자의 연결이 불안정할 수 있습니다.

HAProxy 설치 관련 참고글