728x90

HAProxy 로그 기록 방식 정의


 

vi /etc/rsyslog.conf

      6 #### MODULES ####
      ....
     14 # Provides UDP syslog reception
     15 $ModLoad imudp
     16 $UDPServerRun 514
     17 $AllowedSender UDP, 127.0.0.1

...

     47 #### RULES ####
...
     55 *.info;mail.none;authpriv.none;cron.none;local2.none    /var/log/messages
     56
     57 #HAProxy log
     58 local2.*                                                /var/log/haproxy.log
     
     
systemctl restart rsyslog

ls /var/log
# haproxy.log 파일이 아직 생성되지 않음

systemctl restart haproxy

# haproxy.log 파일이 생성됨
ls /var/log
haproxy.log

 

728x90
728x90

인증서 생성 및 웹 서버 연동


- 기존에 웹 서버 구성 시 http 대신 https를 사용하듯이

- 보안을 위해서 추가 구성 진행

- 로드밸런서 자체에 인증서 적용 진행

 

구성 순서

1. 로드밸런서 구성

2. 인증서 준비 (통합 인증서=개인키+인증서)

3. 설정에서 인증서 등록

 


인증서 통합 생성


 

# 개인키와 인증서 통합 생성
openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/haproxy.pem -out /etc/pki/tls/certs/haproxy.pem -days 365


# 정보 입력
Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:Seoul
Locality Name (eg, city) [Default City]:Seoul
Organization Name (eg, company) [Default Company Ltd]:goorm
Organizational Unit Name (eg, section) []:k8s
Common Name (eg, your name or your server's hostname) []:haproxy.goorm.com
Email Address []:root@goorm.com




# 접근 권한 변경: 나만 접근 가능하도록
chmod 600 /etc/pki/tls/certs/haproxy.pem
ls -l /etc/pki/tls/certs
total 4
-rw-------. 1 root root 1704 May 26 14:15 haproxy.pem

 


 

인증서 등록


vi /etc/haproxy/haproxy.cfg

      9 #---------------------------------------------------------------------
     10 # Global settings
     11 #---------------------------------------------------------------------
     12 global
		...
		...
     35     maxsslconn          40
     36     tune.ssl.default-dh-param 2048


     62 #---------------------------------------------------------------------
     63 # main frontend which proxys to the backends
     64 #---------------------------------------------------------------------
     65
     66 frontend loadbalancer
     67         ...
     68         bind *:443 ssl crt /etc/pki/tls/certs/haproxy.pem
     	...
        
        
systemctl restart haproxy

firewall-cmd --add-service=https
firewall-cmd --add-service=https --permanent

 

https://로드밸런서 IP 주소 접속

 

 

728x90
728x90

로드밸런서 상태 체크


- 브라우저/터미널을 통해 확인 가능

- 로드밸런서 자체의 상태 및 백엔드에 대한 정보 확인


브라우저로 확인


로드밸런서 상태 체크 설정

vi /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------

frontend loadbalancer
        bind *:80
        default_backend         web

        stats enable
        stats auth admin:123
        stats hide-version
        stats show-node
        stats refresh 60s
        stats uri /haproxy?stats

backend web
        balance         roundrobin
        server          web01 10.0.2.30:80 check
        server          web02 10.0.2.31:80 check

 

로드밸런서 주소/haproxy?stats 로 접속

사용자 이름: admin / 비밀번호: 123

 

 

 


터미널로 확인


 

yum install -y socat

vi /etc/haproxy/haproxy.conf
# 기본 설정 값
global
	stats socket /var/lib/haproxy/stats

systemctl restart haproxy
728x90
728x90

실습 환경


  LB WEB 1 WEB 2 NFS DB
IPv4 (enp0s8) 192.168.56.50 192.168.56.10 192.168.56.20 192.168.56.11 192.168.56.6
IPv4 (enp0s3) 10.0.2.50 10.0.2.30 10.0.2.31 10.0.2.40 10.0.2.10
HOSTNAME haproxy.goorm.com web01.goorm.com web02.goorm.com nfs.goorm.com master.goorm.com
DNS 8.8.8.8
GW 192.168.56.1
10.0.2.1
OS CentOS 7

 

 


아키텍처


 

 


구성 순서


 

1. 기본 웹서버 구성 (2대)
index.html 파일에 각 시스템의 호스트네임을 입력해두고 해당 시스템 접속 확인

2. haproxy 를 이용한 로드밸런서 구성
백앤드 서버를 1번에서 만든 웹서버 2대로 각각 지정
로드밸런서 서버로 접속해서 확인

3. NFS 연동 추가
1) 웹서버들의 /var/www/html 디렉토리를 NFS 서버에서 제공하도록 설정
2) 이 때, 구분을 위해 공유 디렉토리를 2개 설정해서 
각 시스템에 공유하기
ex) /content1 은 web01 에 공유
/content2 는 web02 에 공유

4. DB 연동
NFS 서버에서 제공하는 컨텐츠 파일을 php 파일로 작성해서
DB서버와 연동하기 ( php 파일은 기존 실습 참고 )

 

 


WEB 서버 구성


Apache


yum install -y httpd

systemctl enable --now httpd

firewall-cmd --add-service=http
firewall-cmd --add-service=http --permanent

echo "<h1>This Webserver hostname is $HOSTNAME</h1>" > /var/www/html/index.html

 

WEB1 주소로 접속: 192.168.56.10

 

WEB2 주소로 접속: 192.168.56.20

 

 


로드밸런서 구성


yum install -y haproxy

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

vi /etc/haproxy/haproxy.cfg

	 60 #---------------------------------------------------------------------
     61 # main frontend which proxys to the backends
     62 #---------------------------------------------------------------------
     63
     64 frontend lb
     65         bind *:80
     66         default_backend         web
     67         option                  forwardfor
     68
     69 backend web
     70         balance         roundrobin
     71         server          web01 10.0.2.30:80
     72         server          web02 10.0.2.31:80

systemctl enable --now haproxy
firewall-cmd --add-service=http

 

로드밸런서 주소로 접속: 192.168.56.50

 

 

 

 


NFS 서버 구성


NFS 서버

yum list nfs-utils

Installed Packages
nfs-utils.x86_64                                        1:1.3.0-0.68.el7.1                                         @updates
Available Packages
nfs-utils.x86_64                                        1:1.3.0-0.68.el7.2                                         updates


mkdir /content1 /content2

vi /etc/exports
/content1       10.0.2.30/32(rw,sync)
/content2       10.0.2.31/32(rw,sync)

exportfs -r
exportfs

/content1       10.0.2.30/32
/content2       10.0.2.31/32

echo "<h1>This is NFS Server with WEB1</h1>" > /content1/index.html
echo "<h1>This is NFS Server with WEB2</h1>" > /content2/index.html

systemctl enable --now nfs-server
firewall-cmd --add-service=nfs
firewall-cmd --add-service=nfs --permanent

vi /etc/sysconfig/nfs
14 RPCNFSDARGS="-V4.2"

 

WEB 클라이언트

ls -lZd /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

# WEB1
vi /etc/fstab
10.0.2.40:/content1     /var/www/html   nfs     rw,sync,sec=sys,v4.2,context="unconfined_u:object_r:httpd_sys_content_t:s0"     0       0

# WEB2
10.0.2.40:/content2     /var/www/html   nfs     rw,sync,sec=sys,v4.2,context="unconfined_u:object_r:httpd_sys_content_t:s0"
     0       0
     
mount -a

 

WEB1 주소로 접속: 192.168.56.10

 

WEB2 주소로 접속: 192.168.56.20

 

로드밸런서 주소로 접속: 192.168.56.50

 

 


 

DB 서버 구성


패키지 설치 및 기본 보안 설정

yum install -y mariadb-server

systemctl enable --now mariadb

mysql_secure_installation

 

사용자 및 테이블 구성

 

# 사용자 권한 설정
MariaDB [(none)]> GRANT select,insert ON *.* TO remote@'%' identified by '123';
MariaDB [(none)]> flush privileges;

# 데이터베이스 설정
MariaDB [(none)]> CREATE database examdb;
MariaDB [(none)]> use examdb;
MariaDB [examdb]> CREATE table test_tab ( id int(2), name varchar(5) );
MariaDB [examdb]> INSERT INTO test_tab(id,name) VALUE(1,'KIM');
MariaDB [examdb]> SELECT * FROM test_tab;
+------+------+
| id   | name |
+------+------+
|    1 | KIM  |
+------+------+

 


 

PHP 구성


WEB 1


 

 

php 동작 확인, 부울 값 활성화

# php 패키지 설치 및 설정 파일 수정
yum install -y php php-pear php-mbstring php-fpm php-mysql

vi /etc/httpd/conf.d/php.conf
      4 <FilesMatch \.php$>
      5         SetHandler "proxy:fcgi://127.0.0.1:9000"
      
systemctl restart httpd php-fpm

# 부울 값 활성화
semanage boolean -l | grep httpd_can_network_connect_db
httpd_can_network_connect_db   (off  ,  off)  Allow httpd to can network connect db

semanage boolean -m httpd_can_network_connect_db --on

semanage boolean -l | grep httpd_can_network_connect_db
httpd_can_network_connect_db   (on   ,   on)  Allow httpd to can network connect db

NFS


 

 

/content1에서 작업

info.php 파일 생성

echo "<?php phpinfo(); ?>" > /content1/info.php

 

웹 브라우저에서 접속 확인

http://192.168.56.10/info.php

 

 

db.php 파일 생성

vi /content1/db.php

<?php
$conn = mysqli_connect('10.0.2.10','remote','123','examdb');

$sql = "SELECT * FROM test_tab";

$result = mysqli_query($conn,$sql);
  while($row = mysqli_fetch_array($result)){
    echo $row['id'].''.$row['name'].'<br>';
  }
?>

 

 

웹 브라우저에서 접속 확인

http://192.168.56.10/info.php

 

728x90
728x90

실습 개요

로드밸런서

- 작업 부하에 대한 부분을 분산해주는 역할

- 일반적으로 네트워크 트래픽에 대한 로드밸런싱 구성

- L4 로드밸런서와 L7 로드밸런서로 구분 가능

- 인증서 관리에 대한 편의 제공 (SSL/TLS 설정)

- proxy 서버를 통한 기능 구현 가능(nginx, pen, squid, haproxy 등)

 

구성 순서

1. 패키지 설치: haproxy

2. 서비스 설정: /etc/haproxy/haproxy.conf

3. 서비스 활성화: haproxy

4. 방화벽 설정: http(웹 서비스를 설정하는 시스템은 아니지만 실제 접속하는 사용자들이 80 포트로 요청하기 때문)

 

 


haproxy 구성

패키지 설치

yum install -y haproxy

 

서비스 설정

1. 원본 파일 수정 전 복사

ls /etc/haproxy/
haproxy.cfg

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

 

2. 설정 파일 수정

vi /etc/haproxy/haproxy.cfg


60 #-----------------------------------------------------------
61 # main frontend which proxys to the backends
62 #-----------------------------------------------------------
63
64 frontend lb
65         bind *:80
66         default_backend         web
67         option                  forwardfor
68
69 backend web
70         balance         roundrobin
71         server          web01 10.0.2.30:80 check

 

서비스 활성화

systemctl enable --now haproxy

 

방화벽 설정

firewall-cmd --add-service=http

 

 

728x90
728x90

실습 개요


NFS 서버와 WEB 연동

 

NFS란

- Network File System

- 리눅스/유닉스에서 사용하는 표준 프로토콜

- 네트워크로 파일/디렉토리 공유 시 사용

- NAS 방식에 해당

- 보안 방식 구성을 위해 kerberos 서비스와 연동

 

구성 순서

서버

1. 패키지 설치

2. 디렉토리 준비

3. 설정

 1) 디렉토리 공유 설정

 2) 서비스 설정

4. 서비스 활성화

5. 방화벽 설정

 

클라이언트

1. 패키지 설치

2. 마운트


NFS 서버 구성 (서버)


패키지 설치 확인

yum list nfs-utils

nfs-utils.x86_64             1:1.3.0-0.68.el7.1             @updates
Available Packages
nfs-utils.x86_64             1:1.3.0-0.68.el7.2             updates

 

디렉토리 생성

[root@nfs ~]# mkdir /contents
[root@nfs ~]# ls -ld /contents/
drwxr-xr-x. 2 root root 6 May 25 14:32 /contents/

 

설정

nfs 설정 파일 확인

[root@nfs ~]# ls -l /etc/sysconfig/nfs
-rw-r--r--. 1 root root 1679 Jul 22  2021 /etc/sysconfig/nfs
[root@nfs ~]# ls -l /etc/nfs.conf
-rw-r--r--. 1 root root 1023 Jul 22  2021 /etc/nfs.conf

 

디렉토리 공유 설정

vi /etc/exports
/contents	*(rw,sync,sec=sys)

# * : 접근을 허용할 대상, 모두
# 10.0.2.0/24: 특정 네트워크 대역
# 10.0.2.40/24: 특정 시스템 지정
# rw: 읽기-쓰기 허용
# sync: 빠른 동기화
# sec: 인증 방식: sys(기본 값, 생략 가능)

# 설정 변경 시 항상 실행
exportfs -r

 

서비스 활성화

 systemctl enable --now nfs-server

 

방화벽 설정

firewall-cmd --add-service=nfs
firewall-cmd --add-service=nfs --permanent

 


WEB 서버 (클라이언트)

 


마운트 설정

/etc/fstab 설정 파일 수정

vi /etc/fstab
10.0.2.40:/contents     /var/www/html   nfs     rw,sync,sec=sys 0	0

# NFS 서버의 IP:공유 디렉토리 경로
# /var/www/html: 마운트포인트

 

마운트 확인

mount | grep /var/www/html
10.0.2.40:/contents on /var/www/html type nfs4 (rw,relatime,sync,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.2.30,local_lock=none,addr=10.0.2.40)

# nfs 서버에서 작업
echo "test nfs with web" > /contents/index.html

# web 서버에서 확인
cat /var/www/html/index.html
test nfs with web

 

=> 여기까지 NFS 서버와 연결은 성공

=> 그러나, httpd와 nfs 연동은 안됨 (SELinux 설정이 원인)

 

웹 브라우저 접속 시 접근 불가 에러: SELinux 설정 원인

## 클라이언트에서 확인: 컨텍스트 값이 변경되지 않아서 연동에 실패함

# 컨텍스트 확인(nfs_t)
ls -lZd /var/www/html
drwxr-xr-x. root root system_u:object_r:nfs_t:s0       /var/www/html

# SELinux 기본 값 적용
semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
restorecon -Rv /var/www/html

# 값이 변경되지 않음(nfs_t)
# 4.1 버전은 클라이언트에서 마운트해서 사용할 경우 변경 불가
# => 4.2 버전으로 변경 필요
ls -lZd /var/www/html
drwxr-xr-x. root root system_u:object_r:nfs_t:s0       /var/www/html

 

 


NFS-WEB 연동


SELinux 설정 변경

클라이언트에서 마운트 해제 후 컨텍스트 확인

# 마운트 해제
umount /var/www/html

# 컨텍스트 확인(httpd_sys_content_t)
ls -lZd /var/www/html
...
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
...

 

서버에서 NFS 버전 설정

/etc/sysconfig/nfs 설정 파일

# 4.1에서 4.2로 버전 변경
vi /etc/sysconfig/nfs
14 RPCNFSDARGS="-V4.2"

# 서비스 재시작
systemctl restart nfs-server

 

클라이언트에서 마운트 설정

1) NFS 버전 지정: v4.2

2) context 항목 지정: 기존의 html 파일의 컨텍스트

# 마운트 설정 파일 수정(컨텍스트 추가)
vi /etc/fstab
10.0.2.40:/contents     /var/www/html   nfs     rw,sync,sec=sys,v4.2,context="unconfined_u:object_r:httpd_sys_content_t:s0"  0	0

# 마운트
mount -a

 

 

웹 서비스 연동 완료

 

 

728x90
728x90

 

실습 개요


 

Webserver
- http / https 프로토콜을 이용
- 정적인 페이지 + 동적인 페이지를 제공 (컨텐츠)
- 구성방식 : Apache , Nginx , IIS ...
- 페이지 : html , css , php , python ...

-> LAMP ( Linux + Apache + MariaDB + PHP )


WEB Server


Apache 기본 구성


패키지 설치 및 서비스 시작

# WEB 서버
yum install -y httpd      
systemctl enable --now httpd       
firewall-cmd --add-service=http --permanent    
firewall-cmd --add-service=http
echo "test web page" > /var/www/html/index.html

# 다른 가상 머신에서 접속 확인
[root@storage ~]# curl 10.0.2.40
test web page

 


PHP 구성


추가 패키지 설치

php, php-mbstring, php-pear, php-fpm, php-mysql(DB 연동)

yum install -y php php-mbstring.x86_64 php-fpm php-mysql php-pear

 

 

언어를 위한 설정 파일 수정 (DB 연동)

/etc/httpd/conf.d/php.conf

vi /etc/httpd/conf.d/php.conf
      4 <FilesMatch \.php$>
      5         SetHandler "proxy:fcgi://127.0.0.1:9000"

 

 

서비스 재시작 및 활성화

httpd (재시작), php-fpm (활성화)

systemctl restart httpd php-fpm

 

 

서비스를 제공할 스크립트 작성

1. /var/www/html/info.php

 

# /var/www/html/info.php
echo "<?php phpinfo(); ?>" > /var/www/html/info.php

systemctl restart httpd php-fpm

 

 

웹 브라우저에서 접속하여 php 기본 페이지 확인: Web 서버 IP/php 설정 파일 이름

 

 

여기까지 작업이 완료되었다면 HTTP + PHP 서비스가 정상적으로 작동되고 있음

 

 

2. /var/www/html/db.php

1) 사전 작업: DB 서버에 데이터가 저장된 테이블과 사용자 설정 필요

[root@master ~]# mysql -u root -p

MariaDB [(none)]> GRANT select ON *.* TO remote@'%' identified by '123';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> SELECT user,host FROM mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| remote  | %         |
| replica | %         |
| root    | %         |
| root    | 127.0.0.1 |
| root    | ::1       |
| root    | localhost |
+---------+-----------+

MariaDB [(none)]> SELECT * FROM examdb.test_tab;
+------+------+--------+
| id   | name | locate |
+------+------+--------+
|    1 | kim  | seoul  |
+------+------+--------+
1 row in set (0.00 sec)

 

2) db.php 파일 생성

vi /var/www/html/db.php

<?php
$conn = mysqli_connect('10.0.2.10', 'remote', '123', 'examdb');

$sql = "SELECT * FROM test_tab";
$result = mysqli_query($conn, $sql);
  while($row = mysqli_fetch_array($result)){
    echo $row['id'].' '.$row['name'].' '.$row['locate'].'<br>';
  }
?>

 

* DB 연결 에러: WEB 서버의 SELinux 설정이 원인

 

방화벽 확인 (문제 없음)

firewall-cmd --list-services
dhcpv6-client mysql ssh

 

포트 설정 확인 (문제 없음)

semanage port -l | grep 3306
mysqld_port_t                  tcp      1186, 3306, 63132-63164

 

파일 컨텍스트 확인 (문제 없음)

ls -Z /var/lib/mysql
...
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 examdb
...

 

부울 컨텍스트 확인 (문제: off > on)

# WEB 서버에서 작업 필요

semanage boolean -l | grep httpd_can_network_connect_db
httpd_can_network_connect_db   (off  ,  off)  Allow httpd to can network connect db

semanage boolean -m httpd_can_network_connect_db --on

semanage boolean -l | grep httpd_can_network_connect_db
httpd_can_network_connect_db   (on   ,   on)  Allow httpd to can network connect db

 

 

웹 브라우저에서 접속: WEB 서버의 IP/db.php

 

728x90
728x90

/etc/my.cnf 설정 파일 수정


Master DB


/etc/my.cnf 설정 파일 수정

vi /etc/my.cnf

[mysqld]
server-id=10
log-bin=mariadb-bin	# 바이너리 기록
autocommit=0
...

 

서비스 재시작

systemctl restart mariadb.service

 

DB 사용자 설정

 

[사용자 생성 + 권한 설정]

GRANT 권한 ON 데이터베이스.테이블 TO 사용자@'호스트'

mysql -u root -p

# replica 사용자에게 모든 데이터베이스의 모든 테이블에 대한 권한 지정 
# @'localhost': 로컬 호스트만
# @'%': 모든 사용자

GRANT replication slave ON *.* TO replica@'%' identified by '123';

# 사용자 설정에 대한 변경 값 적용
flush privileges

 


Slave DB


/etc/my.cnf 설정 파일 수정

vi /etc/my.cnf

[mysqld]
server-id=20
log-bin=mariadb-bin
read_only=1
report-host=slave.goorm.com

 

서비스 재시작

systemctl restart mariadb

 


데이터 백업 구성


 

 

 

Master DB: 데이터 백업 전에 DB 잠금 설정

MariaDB [(none)]> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 |      460 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# Position 번호 확인

 

Master DB: 논리적 백업 (새로운 터미널에서 작업)

mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql
Enter password:

# 생성된 파일 확인
ls
mysql_dump.sql

 

Master DB: 원래 터미널에서 잠금 해제

MariaDB [(none)]> unlock tables;

 

 

Master DB: 백업 파일을 Slave DB로 복사

scp mysql_dump.sql root@10.0.2.20:/tmp

 

 

Slave DB: 백업 데이터 복원

[root@slave ~]# mysql -u root -p < /tmp/mysql_dump.sql
	-> 복원만 하는 작업 (로그인 아님)
[root@slave ~]# mysql -u root -p
	-> 설정을 위해 로그인

 

Slave DB: 마스터 지정 및 설정

# IP주소, 사용자 이름/패스워드 , log_file / log_pos 는 
# 마스터에서 show master status; 로 확인 후 입력

MariaDB [(none)]> change master to master_host='10.0.2.10' ,
-> master_user='replica', master_password='123', 
-> master_log_file='mariadb-bin.000001',
-> master_log_pos=460;

MariaDB [(none)]> start slave;

 

 

Slave DB: 설정 확인

MariaDB [(none)]> show slave status \G

 

 


데이터 동기화 확인


Master DB: 데이터 수정

[root@master ~]# mysql -u root -p
Enter password:

MariaDB [(none)]> USE testdb;
MariaDB [testdb]> INSERT INTO first_tab VALUE(5,'n');                 
Query OK, 1 row affected (0.00 sec)
MariaDB [testdb]> COMMIT;
Query OK, 0 rows affected (0.04 sec)

MariaDB [testdb]> SELECT * FROM first_tab;
+------+------+
| id   | name |
+------+------+
|    1 | k    |
|    2 | a    |
|    5 | n    |
+------+------+
3 rows in set (0.00 sec)

 

* 만약 커밋을 하지 않으면 변경 사항이 저장되지 않기 때문에 서로 데이터가 다르게 보일 수 있음

 

Slave DB: 수정된 데이터 확인

MariaDB [(none)]> use testdb;
MariaDB [testdb]> SELECT * FROM first_tab;
+------+------+
| id   | name |
+------+------+
|    1 | k    |
|    2 | a    |
|    5 | n    |
+------+------+
3 rows in set (0.00 sec)

 

 

좌: Master DB, 우: Slave DB

 

728x90

+ Recent posts