[타임딜 서버 챌린지] 인프라 구성하기

유재희·2023년 3월 3일
0

Architecture

Process


  • VPC 생성 192.168.1.0/26
  • Subnet 생성
    • public
    • private
    • admin
  • Was Instance 생성, 설정
  • Web Server Instance 생성, 설정
  • Bastions Server Instance 생성, 설정
  • DataBase Server Instance 생성, 설정
  • 도메인 설정
  • Nginx 설정
  • SSH 키 발급
  • was 서버 배포
  • https was 서버 접속

Details


1. 서버 생성 후 접속


VPC, Subnet 생성, 설정 후 각 Subnet에 인스턴스(서버)를 생성해줬다.

스펙

  • Bastion - 50GB, Ubuntu 20 , HighCPU
  • WAS - 50GB, Ubuntu 20, Standard
  • Nginx - 50GB, Ubuntu 20, HighCPU
  • DB - 50GB, Ubuntu 20,, HighCPU

네이버 클라우드 서버 접속 방법은 AWS와 차이가 있다.

  • 서버 관리 및 설정 변경 탭에서 생성한 key.pem 파일로 서버 접속 비밀번호를 확인할 수 있다.
ssh -l root -p [포트번호 (ex: 22)] [서버 IP주소]

쉘 프롬프트 포맷 변경

$ sudo vi ~/.bashrc
  USERNAME=BASTION (서버 별명)
  PS1='[\e[1;31m$USERNAME\e[0m][\e[1;32m\t\e[0m][\e[1;33m\u\e[0m@\e[1;36m\h\e[0m \w] \n\$ \[\033[00m\]'

$ source ~/.bashrc

2. Server 접속 설정


  • 관리자의 모든 22번 포트 연결은 Bastion 서버로 접속한다.
  1. 네이버 클라우드는 인증키 기반 접속이 아닌 User, Password 기반 인증 접속이다.
    Bastion Server의 공개키 활용 및 편리한 접근을 위해 인증키 기반 접속을 추가할 것이다.
    우선 각 서버들의 ACG(보안그룹)를 설정하자 → Bastion Server IP의 22번 포트 접속만 허용한다.

  1. Bastion Server의 공개키를 생성
## Bastion Server에서 공개키를 생성합니다.
bastion $ ssh-keygen -t rsa
bastion $ cat ~/.ssh/id_rsa.pub
  1. 네이버는 기본적으로 User/Password 인증 방식으로 서버접속을 허용하기 때문에 인증키를 활용한 접속 설정을 따로 해줘야한다.
    대상 Server의 root 디렉토리에 .ssh 디렉토리 생성 후 authorized_keys 파일을 생성하고 Bastion Server의 공개키를 입력해주자..
server $ mkdir ~/.ssh
server $ vi authorized_keys 
## 파일 내에 Bastion Server 공개키 저장
  1. /etc/ssh/sshd_config 파일내에 인증키 기반 접속 설정을 추가해준다.
server $ vi /etc/ssh/sshd_config

## 설정파일 내에 아래 설정들을 추가
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
  1. ssh 데몬 재실행
$ systemctl restart sshd.service
  1. Bastion Server에서 각 서버별 IP의 별칭을 설정한다.
bastion $ vi /etc/hosts
[서비스용IP]    [별칭]

## 다른 서버 접속시
bastion $ ssh [별칭]
💡 git clone시 https 주소로 연결이 안된다면 was의 아웃바운드 설정을 확인하자 80, 443 포트 오픈
  • WAS SERVER

자바 설치

wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz

tar zxvf jdk-19_linux-x64_bin_tar.gz

sudo mv jdk-19 /usr/share/
export JAVA_HOME=/usr/share/jdk-19.0.2

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

javac -version #확인

도메인 네임

3. Nginx 설정


Nginx Server

  • Docker 설치
$ sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker root && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • 추가적으로 docker-compose가 설치가 되지 않아서 아래 3개의 명령어를 다시 실행했음

  • 8번 줄 usermod docker 뒤에 호스트네임이 ubuntu로 되어있었다. 네이버 클라우드에선 default가 root.

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • letsencrypt 무료 인증서 발급
docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d '[내 도메인]' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

이메일 입력 후

  • ~/nginx/ 경로에 nginx.conf와 두개의 인증키를 복사해두었다.
$ cp /etc/letsencrypt/live/[도메인주소]/fullchain.pem ./
$ cp /etc/letsencrypt/live/[도메인주소]/privkey.pem ./
  • root/nginx/

  • Dockerfile은 단독으로 이미지 올릴때 사용했었음 필요x
  • nginx.conf
    events {}
    
    http {       
      upstream app {
        server [was ip]:8080;
      }
      
      # Redirect all traffic to HTTPS
      server {
        listen 80;
        return 301 https://$host$request_uri;
      }
    
      server {
        listen 443 ssl;  
        ssl_certificate /etc/letsencrypt/live/[도메인주소]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[도메인주소]/privkey.pem;
    
        # Disable SSL
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
        # 통신과정에서 사용할 암호화 알고리즘
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
    
        # Enable HSTS
        # client의 browser에게 http로 어떠한 것도 load 하지 말라고 규제합니다.
        # 이를 통해 http에서 https로 redirect 되는 request를 minimize 할 수 있습니다.
        add_header Strict-Transport-Security "max-age=31536000" always;
    
        # SSL sessions
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;      
    
        location / {
          proxy_pass http://app;    
        }
      }
    }
  • docker-compose.yml
  • 볼륨에 설정파일과 인증키를 넣어주었다.
version: '3.1'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/fullchain.pem:/etc/letsencrypt/live/ujtimedeal-api.n-e.kr/fullchain.pem
      - ./nginx/privkey.pem:/etc/letsencrypt/live/ujtimedeal-api.n-e.kr/privkey.pem
    container_name: reverse-proxy
docker-compose up -d
💡 DNS 연결 IP를 nginx IP로 변경해주어야함

Reference


서버 접속 설정

[Naver Cloud Platform] SSH 키 기반 접속 설정

2-1. [NCLOUD] 네이버 클라우드에서의 보안 – Server (ACG)

Nginx 설정

nginx, docker compose를 이용한 리버스 프록시 구성

[Docker] docker compose 사용법

Nginx Reverse Proxy 구성하기 (feat. Docker)

profile
몰라요

0개의 댓글