본문 바로가기

Cloud/Oracle Cloud Infrastructure

14. OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 - 웹서버 (rsync)

2019/01/15 - [Cloud/Oracle Cloud Infrastructure] - 13. OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 - 웹서버

3단계. 웹서버 구성

rsync 설정

rsync 설정은 rsync 데몬으로 사용할 있고, xinetd 통해 실행할 수도 있다. 실제 리눅스 운영 환경에서는 xinetd 많이 사용하므로 이번 테스트에서는 xinetd 이용해서 설정해 본다. 웹서버#1 rsync 서버로, 웹서버#2 rsync 클라이언트로 설정하여, 웹서버#2에서 웹서버#1 컨텐츠를 rsync 끌어오는 방식으로 구성해 것이다.

먼저 rysnc xinetd 설치되어 있는 확인한다. rysnc 설치되어 있으나, xinetd 추가 설치가 필요하다. YUM으로 xinetd 설치한다. 혹시 rsync 설치되어 있지 않다면, rsync YUM으로 설치한다.

[opc@web1 ~]$ rpm -qa | grep rsync

rsync-3.1.2-4.el7.x86_64

[opc@web1 ~]$ rpm -qa | grep xinetd

[opc@web1 ~]$ sudo yum install xinetd -y

Loaded plugins: langpacks, ulninfo

ksplice-uptrack                                                                                                                                       |  951 B  00:00:00

ol7_UEKR5                                                                                                                                             | 1.2 kB  00:00:00

:

:

:

Installed:

  xinetd.x86_64 2:2.3.15-13.el7

 

Complete!

 

rsync 데몬이 정상 작동하는 테스트해 본다. 비어 있는 파일을 하나 만들어서 로컬에 파일을 복제해 본다.

[opc@web1 ~]$ touch 1.txt

[opc@web1 ~]$ rsync -azvh 1.txt 2.txt

sending incremental file list

1.txt

 

sent 94 bytes  received 35 bytes  258.00 bytes/sec

total size is 0  speedup is 0.00

[opc@web1 ~]$ ls

1.txt  2.txt

 

rsync 로컬에서 정상 작동하는 것을 확인했으니, 웹서버#2에서 웹서버#1 rsync 파일을 끌어오는 것을 수행해 본다. 여기서부터 테스트는 권한 관련 이슈를 피하고, 설명을 단순화하기 위해 root 유저로 실행한다.

xinetd 통해 rsync 사용할 것이므로 웹서버#1에서 아래와 같은 내용으로 “/etc/xinetd.d/rsync” 설정 파일을 만들었다. disable 옵션을 “no” 하는 것에 유의한다.

[opc@web1 ~]$ sudo su

[root@web1 opc]# vi /etc/xinetd.d/rsync

[root@web1 opc]# cat /etc/xinetd.d/rsync

service rsync

{

   disable = no

   socket_type     = stream

   wait            = no

   user            = root

   server          = /usr/bin/rsync

   server_args     = --daemon

   log_on_failure  += USERID

}

 

rsync 자체의 설정 파일도 웹서버#1 “/etc/rsyncd.conf”으로 만든다. 테스트에서는 “websync” 라는 서비스 이름을 사용했고, host allow 옵션에서 rsync 클라이언트가 웹서버#2 IP 주소를 입력했다.

[root@web1 opc]# vi /etc/rsyncd.conf

[root@web1 opc]# cat /etc/rsyncd.conf

[websync]

path = /var/www/html

uid = root

gid = root

use chroot = yes

read only = no

hosts allow = 10.0.4.2

max connections = 3

timeout = 600

 

rsync 설정을 마치고, xinetd 서비스를 재시작한다.

[root@web1 opc]# service xinetd restart

Redirecting to /bin/systemctl restart xinetd.service

 

rsync 사용할 TCP, UDP 873 포트를 OS에서도 개방해 준다.

[root@web1 opc]# firewall-cmd --permanent --add-port=873/tcp

success

[root@web1 opc]# firewall-cmd --permanent --add-port=873/udp

success

[root@web1 opc]# firewall-cmd --reload

success

 

rsync 서버 역할을 하는 웹서버#1에서 873 포트를 개방해도 SELinux enforcing 상태에서 rsync 정상 작동하지 않는 경우가 있다. 아래와 같이 SELinux disabled 상태로 변경해서 이를 피할 수도 있다. SELinux enforcing 상태에서 rsync 사용하기 위해서는 SELinux 파라미터 변경이 필요하다. 상세 내용은 [참조. SELinux disable 시키지 않고 rsync 수행하는 방법] 참고한다.

[root@web1 opc]# setenforce 0

[root@web1 opc]# vi /etc/sysconfig/selinux

[root@web1 opc]# cat /etc/sysconfig/selinux

:

:

:

SELINUX=disabled

:

:

:

 

웹서버#1 /var/www/html 만든 파일을 웹서버#2에서 정상적으로 rsync 동기화 되는지를 확인할 차례다. 우선 웹서버#2에서 웹서버#1 rsync 포트로 통신이 되는 확인한다. 여기서는 telnet으로 확인했다. 만일 설치되어 있지 않다면 YUM으로 설치한다. 웹서버#2에서 아래와 같이 확인한다.

[opc@web2 ~]$ sudo su

[root@web2 opc]# telnet 10.0.3.2 873

Trying 10.0.3.2...

Connected to 10.0.3.2.

Escape character is '^]'.

@RSYNCD: 31.0

:

:

:

 

테스트를 위해 웹서버#1 파일을 생성한다.

[root@web1 opc]# touch /var/www/html/rsynctest.txt

[root@web1 opc]# ls -al /var/www/html/rsynctest.txt

-rw-rw-r--. 1 opc opc 0 Jan  4 07:36 /var/www/html/rsynctest.txt

 

웨서버#2에서 rsync 수행한다. 전송 받을 위치에서 rsync 명령은 다음과 같은 포맷으로 이루어진다.

rsync [옵션] [전송받을 서버]::[서비스명] [저장 디렉토리]

[root@web2 opc]# ls -l /var/www/html/

total 0

[root@web2 opc]# rsync -avz 10.0.3.2::websync /var/www/html

receiving incremental file list

./

rsynctest.txt

 

sent 50 bytes  received 131 bytes  362.00 bytes/sec

total size is 0  speedup is 0.00

[root@web2 opc]# ls -l /var/www/html/

total 0

-rw-rw-r--. 1 opc opc 0 Jan  4 07:36 rsynctest.txt

 

웹서버#1 인스턴스 재부팅 이후에 xinetd rsync 자동으로 기동되도록 systemctl 명령으로 설정한다. 웹서버#2에서도 rsync 대해 systemctl 명령으로 설정한다.

[root@web1 opc]# systemctl enable xinetd

[root@web1 opc]# systemctl enable rsyncd

Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

 

 

참조. SELinux disable 시키지 않고 rsync 수행하는 방법

오라클 리눅스 7.6에서는 SELinux에서는 기본값으로 rsync 파일을 읽고, 쓰는 것을 차단한다. 이를 조절할 있는 SELinux 파라미터는 rsync_export_all_ro, rsync_full_access 등이 있다.

       “rsync_export_all_ro = off”: 기본값으로 rsync 파일을 읽는 것을 차단

       “rsync_full_access = off”: 기본값으로 rsync 파일을 읽고, 쓰는 것을 차단

 

setsebool 명령으로 파일 읽기/쓰기 차단을 해제할 있다. 이번 테스트와 같이 웹서버#1 파일을 읽어서 웹서버#2에서 동기화 시키는 경우, 아래와 같이 SELinux enforcing 상태로 변경해도, rsync_export_all_ro 파라미터를 on으로 변경하여 파일 읽기를 허용하면 정상적으로 앞서 수행했던 rsync 작동한다.

 

[root@web1 opc]# setenforce 1

[root@web1 opc]# setsebool -P rsync_export_all_ro 1

[root@web1 opc]# getsebool -a | grep rsync

postgresql_can_rsync --> off

rsync_anon_write --> off

rsync_client --> off

rsync_export_all_ro --> on

rsync_full_access --> off

 

 

rsync 설정

이제 웹서버#1 /var/www/html 디렉토리 아래 파일들이 웹서버#2 정기적으로 동기화되도록 crontab 등록할 차례다. 웹서버#2에서 crontab 열어서, rsync 5분마다 웹서버#1 파일을 가져와 동기화하도록 작업을 등록했다.

[opc@web1 ~]$ crontab -e

*/5 * * * * rsync -avz --delete 10.0.3.2::websync /var/www/html >> /tmp/rsync.log 2>&1

 

crontab에서 지정한 로그를 확인한다. 웹서버#1에서 새로 만든 파일도 정상적으로 동기화되고 있음을 확인할 있다.

[root@web2 opc]# tail -f /tmp/rsync.log

receiving incremental file list

 

sent 24 bytes  received 84 bytes  216.00 bytes/sec

total size is 0  speedup is 0.00

:

:

[root@web2 opc]# ls -al /var/www/html

total 8

drwxrwxr-x+ 2 root root 52 Jan  4 07:56 .

drwxrwxr-x+ 4 root root 33 Jan  2 10:51 ..

-rw-r--r--. 1 root root  0 Jan  4 07:56 rsynctest_2nd.txt

-rw-rw-r--. 1 opc  opc   0 Jan  4 07:36 rsynctest.txt


 

참조. 자주 사용되는 rsync 옵션

       -a: archive mode. 아카이브 모드 전송. 권한, 속성, 심볼릭 링크 등을 그대로 전송.

       -v: verbose. 전송 정보에 대한 자세한 출력

       -z: 데이커를 압축하여 전송

       -r: 하위 디렉토리까지 포함하여 전송

       --delete: 전송 보낼 위치에서 삭제된 파일은 전송 받을 위치에서도 삭제

       --progress: 전송 진행 상태를 출력

 



 

작성자: 정영균


OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 시리즈

1. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Intro

2. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN

3. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN

4. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (인터넷게이트웨이)

5. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (라우트테이블)

6. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (시큐리티리스트)

7. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (서브넷)

8. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버

9. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (시큐리티 리스트)

10. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (인스턴스)

11. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (웹서버 연결)

12. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (NAT 설정)

13. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버

14. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (rsync)

15. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정)

16. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정파일시스템)

17. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정파일시스템마운트)

18. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서

19. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (아파치웹서버)

20. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (로드밸런서생성)

21. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (백엔드서버)

22. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (리스너)

23. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스

24. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템)

25. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (데이터베이스구성)

26. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템연결)

27. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템연결)

28. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (백업)

29. OCI 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 – 데이터베이스 (DR 구성)