Server

oracle cloud 서버 사용기 - 계정 생성 | 인스턴스 생성 | NGINX 설치 | Docker 설치 | HTTPS 인증서 발급 및 연결

mean-ji 2022. 12. 21. 14:20
728x90

사이드 프로젝트를 Netlify 로 배포하고 운영하다보니, (nuxt 프로젝트)

블로그나 홈페이지 같은 정적 사이트가 아니라서 발생하는 문제가 있었습니다.

 

target을 server로 하고 배포하고 있어서 nuxt의 dynamic directory를 잡지 못하고 404로 반환하는 것이 가장 큰 문제였습니다.

이로인해 가장 중요한 홍보 수단이었던 카카오톡에서 og 태그들을 인식하지 못해

사용자들이 불편함을 겪을 것 같아 서버 이전을 고민했고, 런칭 초기인 지금 빨리 이전하는 게 맞겠다는 판단이 들었습니다.

 

오라클 클라우드에 인스턴스를 생성하여 NGINX로 웹서버를 구축하고 Docker로 프로젝트를 띄운 과정을 기록으로 남겨보았습니다. (+https 연결 과정도 남겨두었습니다.)

 

계정 생성

https://cloud.oracle.com/

 

무료 클라우드 이용할 수 있는 곳들 중 오라클 클라우드를추천 받아서 사용해 보았습니다.

EC2 생성 및 배포 경험이 있어서 비슷한 플로우로 사용할 수 있었습니다.

 

계정 생성을 하고 카드 등록을 해주면 되는데,

시키는 대로 하면 금방 마칠 수 있었습니다.

비자 카드로 해야 에러 안 난다고 다른 블로그에서 그랬는데 나는 비자 카드로 했을 때 에러가 나서

마스터 카드로 등록을 했습니다.

 

영어로 등록하는 게 좋다고 해서 영어로 등록했고,

집주소는 네이버 '영문주소'에서 찾아서 적었습니다.

 

영문주소 : 네이버 통합검색

'영문주소'의 네이버 통합검색 결과입니다.

search.naver.com

 

계정 생성에 성공하면 친절하게 튜토리얼 간단히 알려주는데 저는 그런 튜토리얼들은 다 읽어보는 스타일이라서 다 읽은 후,

바로 인스턴스 하나 생성해 보았습니다.

 

인스턴스 생성

무료로 생성 가능한 버전으로 설정이 되어있었고,

해당페이지에서 바로 서브넷과 VCN을 생성할 수 있어서 인스턴스 만들기도 금방할 수 있었습니다.

이 때 private key를 다운로드를 받아주어야 합니다.

 

인스턴스 ssh 접속

생성된 인스턴스의 디테일에 들어가면 public ip와 username이 있습니다.

키를 다운로드 받은 곳에 터미널을 위치시키고

ssh -i *.key username@123.123.123 (예시) 로 접속할 수 있었습니다.

 

인스턴스 디테일을 확인해보니 username은 opc였습니다.

 

 


무언가 설치하고 또 설치하고 그러는 과정 중에 꼬여서 그런지 제대로 안되는 상황이 발생해서 두번 정도 새로 인스턴스를 만들었습니다.😭

최종적으로 제대로 성공했던 순서대로 과정을 적어보았습니다.

 

인스턴스를 생성하고, (생성은 기본 설정되어 있는 무료 버전으로 생성, oracle linux 8) 가장 먼저 한 일은 yum update이었습니다.

(시간이 꽤 오래 걸리므로 가장 먼저 시작!)

sudo yum update

 

SWAP 설정

참고한 블로그를 살펴보니, 1GB 의 RAM이 부족할 수 있어 아래의 명령어를 통해 늘려주는 작업을 하면 좋다고 했습니다.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

서버를 재시작하여도 설정 값이 유지되도록 아래 파일에도 추가로 적어줄 것이 있었습니다.

sudo nano /etc/fstab
# 제일 하단에 이걸 추가하면 됩니다.

/swapfile swap swap defaults 0 0

nano라는 에디터는 이번에 처음 써 보았는데 맥 기준 ^O를 누르고 엔터를 치면 빠져나올 수 있었습니다 (vim의 :wq)

 

free -h 명령어로 설정 값이 잘 변했는지 확인할 수 있습니다.

 

 

Docker 설치

생각보다 도커 설치가 꽤 까다로웠던 기억이 나네요.

여러 자료를 찾고 시도해 보았는데 실패를 해서 ㅠㅠ 이 자료를 보고 설치에 성공했습니다.

 

아래의 명령어로 도커를 설치

sudo dnf install -y dnf-utils zip unzip
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf remove -y runc
sudo dnf install -y docker-ce --nobest

 

아래의 명령어로 도커를 시작

sudo systemctl enable docker.service
sudo systemctl start docker.service

 

도커 허브에 올린 프로젝트를 pull받고 run 하여 실행했습니다.

 

NGINX 설치

nginx 설치는 이 자료를 참고했습니다.

sudo dnf install -y nginx
sudo systemctl enable --now nginx.service
sudo systemctl status nginx

 

nginx 설정은 간단하게 

/etc/nginx.conf를 변경하여 사용했습니다.

server 80에 location을 http://127.0.0.1:3000으로 해놓고 실행하면 프로젝트 실행이 잘 되는 것을 확인할 수 있었습니다.

(저의 경우 nuxt 프로젝트를 도커에 run 한 상황이었습니다.)

 

++ 퍼블릭 ip로 제대로 연결 되었는지 확인하기 전에 서브넷에서 80번, 443번 포트를 열어주었습니다.

oracle cloud 인스턴스 상세 > 생성한 서브넷 클릭 > Security Lists에 있는 요소 클릭 > Add Ingress Rules로 세 번째 사진 처럼 작성

 

아래의 명령어로 80번 포트를 오픈해줍니다.

// 방화벽 오픈
firewall-cmd --zone=public --add-port=80/tcp --permanent

// 방화벽 재시작
firewall-cmd --reload

 

 

 

HTTPS 연결

배포를 위해 무료 도메인 생성 사이트인 내도메인.한국 에서 도메인을 등록하고,

도메인 수정 > [IP연결(A)] 에 인스턴스 퍼블릭 ip를 적어주었습니다.

 

그 다음은 certbot으로 LetsEncrypts로 무료 ssl 인증서를 발급해주었습니다.

위의 과정들로 퍼블릭 ip, 도메인이 준비되었습니다.

 

시작 전, 서버에서 아래의 명령어로 443 포트를 오픈해줍니다.

// 방화벽 오픈
firewall-cmd --zone=public --add-port=443/tcp --permanent

// 방화벽 재시작
firewall-cmd --reload

 

아래의 명령어로 Snap 설치를 진행합니다.

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

sudo yum install snapd
sudo systemctl enable snapd

sudo ln -s /var/lib/snapd/snap /snap
sudo systemctl start snapd

sudo snap install core; sudo snap refresh core

 

아래의 명령어로 Certbot을 설치하고 인증서를 발급받습니다.

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

certbot --version
sudo certbot certonly --nginx -d example.com

약관 동의에 Y를 해주고,

이메일을 물어보는데 이메일 적어주고 광고 수신 동의 에는 N을 해주었습니다.

 

인증서 발급이 성공적으로 되면

nginx.conf를 수정해줍니다.

server {
  listen 80;
  server_name example.com;
  
  location / {
    return 301 https://$host$request_uri;
  }
}

server {
    listen       443 ssl;
    server_name  example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / { 
        proxy_pass         http://127.0.0.1:3000;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

 

 

 

 

 

참고한 자료들

 

https://blog.ny64.kr/posts/oracle-cloud-swap-setup-and-nginx-installation/

https://oracle-base.com/articles/linux/docker-install-docker-on-oracle-linux-ol8

https://docs.oracle.com/en/learn/oracle-linux-nginx/#create-a-custom-nginx-configuration

https://bitgadak.tistory.com/6

728x90