# 개인키와 인증서 통합 생성
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
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
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 파일은 기존 실습 참고 )
# 사용자 권한 설정
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
- 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
vi /etc/exports
/contents *(rw,sync,sec=sys)
# * : 접근을 허용할 대상, 모두
# 10.0.2.0/24: 특정 네트워크 대역
# 10.0.2.40/24: 특정 시스템 지정
# rw: 읽기-쓰기 허용
# sync: 빠른 동기화
# sec: 인증 방식: sys(기본 값, 생략 가능)
# 설정 변경 시 항상 실행
exportfs -r
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
# 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
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
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
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)