본문 바로가기
Personal Projects/소셜 북마크 서비스 🙂

[개인] 소셜 북마크 - 인프라 설계 및 구축 2. 서비스 환경 구축

by Aaron-Kim 2022. 1. 12.

인프라 설계 및 구축 2. 서비스 환경 구축

인프라 두 번째 시간으로 오라클 클라우드에서 제공하는 무료 VM 인스턴스 2대로

실제 서비스 환경을 구축하겠습니다.

 

 

 

VM 인스턴스 하나는 Web Server (Nginx) - Web Application Server (Node.js) 로 활용하고

다른 VM 인스턴스는 DB 서버 (MySQL)로 구축하겠습니다.

 

우선 오라클 클라우드를 선택하게 된 이유는 상시 무료입니다.

가상 머신 2대를 주고 사용 시간 제한이 없으며 공인 IP도 무료입니다.

제가 전에 인프라를 두 번 정도 구축해본 경험이 있는 네이버 클라우드는 1년 무료이지만 3개월이 지나면

매월 4,032원 공인 IP 가격이 청구됩니다. 오라클 클라우드가 여러모로 장점이 많으니 다들 한 번씩

사용해보시면 좋을 것 같습니다.

 

2021년 12월에 CenOS 8 기술 지원이 종료되어 실 서비스에서는 2024년까지 지원되는 CentOS 7을 사용했습니다.

 

오라클 클라우드 기본적인 서비스 구축 절차는 다음과 같습니다.

 

  1. 구획 생성
    • 저는 VM 인스턴스 2대를 이용하므로 구획과 VCN, 공용 IP 등 모두 다 2개씩 나눠서 구축했습니다.
  2. 네트워크 설정 (네트워크 포트 설정, ACG)
    • http, https, mysql, mysqlx 포트 설정해서 네트워크 방화벽을 열어 놓습니다.
  3. VM Instance 생성
  4. 서버에 필요한 패키지 설치 (Nginx, MySQL,...)
  5. 도메인 세팅 + 고정 IP 설정
  6. HTTPS 설정
  7. 방화벽 설정 (서버 방화벽 열기)

 

도메인은 제가 전에 호스팅 KR에서 사놓은 것을 활용하겠습니다. (도메인)

소셜 북마크와 상관없는 네이밍이지만 개인 토이 프로젝트이므로 우선 진행을 하고,

나중에 기회가 생긴다면 그때 교체하겠습니다.


[Web Server - Web Application Server (VM 인스턴스)]

제 컴퓨터 OS가 윈도우라서 Putty를 사용하여 SSH private key를 이용해 실 서비스 서버에 접속해서
다음과 같이 필요한 패키지들을 설치 및 설정을 하였습니다.

(나중에 Putty 없이 도커 컨테이너로 띄워놓고 실 서비스 서버, 개발용 서버 양쪽 연동하면서 작업할 예정입니다.)

 

  • Epel-release (Extra Packages for Enterprise Linux) ✔
  • Nginx ✔
    • vi 에디터를 활용하여 yum 외부 저장소 (repository) 등록하고 Nginx 설치
    • YUM: RedHat 계열 리눅스 배포판에서 사용하는 패키지 설치 및 관리 도구
          RPM (Redhat Package Manager) Package Dependency 개선, Yellowdog Updater Modified
    • 최근에는 DNF (Dandified dnf)를 많이 사용합니다.
    • CentOS 7에서 dnf 사용해본 결과, dnf는 CentOS 8부터 잘 적용되는 것 같습니다.
    • 저는 Nginx를 실 서비스 서버에서는 systemctl 명령어를 이용하여 데몬(daemon)으로 띄웠습니다.
  • Volta ✔
  • PM2 by Volta ✔
  • Node (@, LTS), NPM by Volta ✔
  • rsync, rcp setting ✔
    • FTP처럼 파일 전송용입니다.
    • 이후 개발 환경을 도커로 구축하고 연동해서 개발 환경 - 실 서버 간의 배포(업로드) 및 내려받기가 가능합니다.
  • Let's Encrypt SSL (HTTPS certbot) Agent ✔
    • 무료 HTTPS 인증서
    • certbot, python3-certbot-nginx
    • 90일 주기 만료이므로 crontab을 이용하여 자동 갱신 쉘 스크립트 작성
    • 매 2달 1일 새벽 5시마다 자동 갱신 세팅 완료 (분 시 일 월 주, &1 - 표준 출력)
0 5 1 */2 * /usr/bin/certbot renew >> /etc/nginx/cert.log 2>&1

[DB 서버 (VM 인스턴스)]

  • MySQL 8 ✔

 

// mysql 자동으로 설정된 root password 확인
grep 'temporary password' /var/log/mysqld.log

// 이후 mysql 보안 강화 위한 설정
mysql_secure_installation

 

// MySQL Workbench 8.0으로 외부에서 접속하기 위해 DB 서버 포트 개방
sudo iptables -I INPUT 1 -p tcp --dport 3306 -j ACCEPT

 

// vi /etc/my.cnf 에 추가
// MySQL 인코딩 및 collation 설정

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqldump]
default-character-set = utf8mb4

[mysqld]
skip-character-set-client-handshake
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

 

// DB 서버 사양이 낮아서 한번에 접속할 수 있는 수를 100으로 설정해서 줄이기 (mysql 데몬)
show variables like '%max_connection%';
set global max_connections=100;

 

MySQL 설치 후 mysql_secure_installation을 진행하여 보안을 강화합니다.

mysql -u root -p로 들어가서 소셜 북마크 서비스에 사용할 데이터베이스를 생성하고 user도 따로 만들어서

권한을 할당했습니다. 이후 MySQL Workbench 8.0 에도 연동을 다 마쳤습니다.

 

(참고로 Node에 대한 포트는 별도로 개방하지 않고, Nginx에서 Node로 포트포워딩을 해서 이용합니다.)


다음 시간에는 실 서비스 환경과 비슷하게 개발 환경을 구성하기 위해 docker를 이용하겠습니다.

docker로 개발 환경 구축을 완료하면 이미지를 떠서 dockerhub으로 이미지 배포를 하고

이후 API 서버 연동 및 구축하면서 시간이 된다면 YAML 파일을 이용해서

docker-compose (여러 컨테이너 한 번에 띄우고 죽이는 도커 에코시스템 통합 기능) 관련 부분까지도 다뤄보겠습니다.

(이미지 배포 시에는 당연히 보안적인 부분 잘 체크해서 세팅하고 올려놓을 예정입니다.)


[Reference]

dyeott.com (소셜 북마크 서비스 도메인)

시니어코딩 (유튜브) - 오라클 클라우드

시니어코딩 (유튜브) - 리눅스, 도커

반응형

댓글