본문 바로가기

회고록(TIL&WIL)

TIL 2022.09.07 도메인연결(Route 53, DNS), HTTPS(let's encrypt)

EC2 서버에 도메인 적용하기

1. Route53 에서 도메인 등록(구매)

도메인 마다 가격이 책정되어있고 1년마다 갱신여부 원하는 대로 체크 후 주문하면 생성까지의 시간이 약간 걸림

2. 레코드 만들기

호스팅 영역에서 레코드를 생성하는데 value값으로 사용할 EC2 인스턴스의 고정 ip 를 입력

다른 레코드 추가해서 주소에 레코드 이름에 www를 추가하여 www를 붙였을 때도 라우팅 될 수 있도록 설정

3. django allowed host 에 도메인 추가하기

이 설정 없이 도메인에 접근할 경우 Bad Request 가 발생됨

EC2 인스턴스에 접속하여 설정파일에 리눅스환경에서 vim같은 작업툴을 이용해서 직접 엑세스 해서 (.env.prod 파일) DJANGO_ALLOWED_HOST 상수값에 앞서 만든 도메인들 추가해주기

그리고나서 docker-compose -f docker-compose.prod.yml down 후  up -d --build 다시해주기

HTTPS 적용

Let's encrypt 에서 무료로 ssl을 발급받아 https 적용해보기

Docker-compose.prod.yml 파일 수정

version: "3.8"
# ㄴ 사용하는 docker-compose 버젼

services: # 추가할 서비스들 web, db, nginx
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/static
      - media_volume:/usr/src/app/media
      # nginx의 volumes에도 추가해주기
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot      
    ports:
      - 80:80
      - 443:443
    depends_on:
      - web
      
  certbot:
    image: certbot/cerbot 
    # ㄴ certbot에서 지원하는 이미지
    volumes:
     - ./data/certbot/conf:/etc/letsencrypt
     - ./data/certbot/www:/var/www/certbot
     
 ...
 
nginx.conf 파일 수정
upstream SMOPS_PRAC {
    server: web:8000;
    # ㄴ 내부에서 nginx와 gunicorn이 통신할 떄 쓰이는 포트번호
}

server {
    listen 80;
    # ㄴ 외부와 통신할 때 쓰이는 포트
    server_name aeiusprac.link;
    # ㄴ 등록한 도메인
    location / {
        return 301 https://$host$request_url;
    }
    # ㄴ http로 호출이 되었을 때 https로 redirect 되도록 설정
    location / .well-known/acme-challenge {
        root /var/www/certbot;
    }
    # ㄴ let's encrypt certbot에서 요구하는 사항
}
server {
    listen 443 ssl;
    server_name aeiusprac.link;
    location / {
        # nginx에서 쓰는 default 세팅
        proxy_pass http://SMOPS_PRAC;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
    # nginx에서 정적파일들을 미리 가져올 수 있도록 설정
    location /static/ {
        alias /usr/src/app/static/;
    }
    location /media/ {
        alias /usr/src/app/media/;
    }

    # 아래의 내용들은 ssl 관련 세팅으로 4줄 전부 복붙해서 사용
    ssl_certificate /etc/letsencrypt/live/aeiusprac.link/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/aeiusprac.link/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl-dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

인증 스크립트 추가

아래의 링크로 들어가서 내용전체 복사하여 init-letsencrypt.sh 파일만들기

https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh

curl을 이용해서 붙여오는 방법이있다. 아래의 방법은 -L 커맨드를 이욯하는 방법인데 리눅스나 MacOS 환경에서 사용가능

curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh

가져온 스크립트 중 일부를 수정해야한다!

8 domains=(example.com www.example.com)
>> 해당 부분을 구매했던 도메인에 맞게 수정
...
11 email="" # Adding a valid address is strongly recommended
>> 이메일 작성

추가로 기본 docker-compose를 사용했다면 변경하지않아도 되지만
여러개의 docker-compose를 사용한다면 아래의 코드들도 변경을 해주어야한다.

33 docker-compose -f docker-compose.prod.yml run --rm --entrypoint "\
...
42 docker-compose -f docker-compose.prod.yml up --force-recreate -d nginx
...
46 docker-compose -f docker-compose.prod.yml run --rm --entrypoint "\
...
69 docker-compose -f docker-compose.prod.yml run --rm --entrypoint "\

이후 github push 완료 후 EC2 인스턴스 터미널에 접속하여 우선 docker-compose down

sudo docker-compose -f docker-compose.prod.yml down 한 뒤 재빌드

sudo docker-compose -f docker-compose.prod.yml build 

sudo chmod +x init-letsencrypt.sh  >스위치모드하여 권한을 실행가능하도록 설정

sudo ./init-letsencrypt.sh-+-

sudo docker-compose -f docker-compose.prod.yml up --build

후에 배포되어있는 사이트에 접속해서 https 적용 여부 확인