-
TIL 2023.06.01내일배움캠프 2023. 6. 1. 19:20
01. 3주차에 배울 것
- gunicorn을 사용해 django 배포 환경 구축하기
- django와 postgresql 데이터베이스 연동하기
- nginx를 활용해 외부에서 내가 만든 서버에 접속할 수 있도록 설정하기
- 도메인 구매 및 네임서버 설정하기
- https 적용하기
🔑 이번주에는 내가 만든 서버를 다른사람이 접속할 수 있도록 배포하는 방법을 알아봅니다.
02. postgresql 컨테이너 생성하기
🔑 docker를 사용해 django에서 사용될 postgresql 컨테이너를 생성하는 방법을 알아봅니다.
- postgresql이란?
- 💡 오픈 소스 데이터베이스로, Oracle DB, MySQL 등 상용 라이센스를 가지고 있는 데이터베이스와는 다르게 무료로 사용 가능합니다.Oracle DB, Mysql, Microsoft SQL에 이어 네번째로 사용량이 많은 데이터베이스입니다.
- 또한 장고에서는 기본 데이터베이스로 postgresql을 사용하는 것을 권장하고 있습니다.
- 원하는 docker 이미지를 찾는 방법
- 💡 docker에서 사용 가능한 이미지들은 https://hub.docker.com 에서 제공하고 있습니다.사이트 접속 후 원하는 이미지를 검색하면 해당 이미지의 정보를 확인할 수 있습니다.
- docker-compose.yml
version: '3.8' volumes: postgres: {} # postgresql에서 사용 할 볼륨 지정 services: postgres: container_name: postgres image: postgres:14.5 volumes: - postgres:/var/lib/postgresql/data/ environment: # postgresql 컨테이너에서 사용할 환경변수 지정해주기 - POSTGRES_USER=user # 데이터베이스 사용자 지정 - POSTGRES_PASSWORD=P@ssw0rd # 사용자 비밀번호 지정 - POSTGRES_DB=django # 데이터베이스 이름 지정 restart: always
- 컨테이너가 잘 생성됐는지 확인해보기
- 💡 컨테이너를 생성한 이후 postgresql이 정상적으로 실행됐는지 확인해 보겠습니다.
- sudo docker compose up -d
- 위와 같이 docker compose logs 명령어를 활용하면 컨테이너를 생성하고 서비스를 실행하는 과정에서 문제가 없는지 확인할 수 있습니다.
- sudo docker compose logs
03. gunicorn을 사용해 django 프로젝트 컨테이너 생성하기
🔑 django 프로젝트를 배포할 때는 runserver가 아닌 gunicorn과 같은 서비스를 활용해 배포하게 됩니다. gunicorn을 사용해 django를 실행시키는 방법을 알아봅니다.
- gunicorn이란?
- 💡 django 프로젝트를 실행할 때 사용되는 runserver와 같이, 사용자의 요청을 받아 django에 작성한 코드를 실행시켜 주도록 하는 역할을 해줍니다.단순하게 생각해서 배포용으로 사용되는 runserver라고 생각해도 무관합니다.
- runserver가 아닌 gunicorn을 사용해 배포하는 이유
- 💡 기본적으로 runserver는 배포용이 아닌 개발용으로 사용되는 명령어이며, [공식 문서](https://docs.djangoproject.com/en/4.1/ref/django-admin/#runserver)에서도 runserver로 배포하는 것을 권장하지 않고 있습니다.또한 runserver는 기본적으로 싱글 스레드에서 동작하지만, gunicorn은 멀티 스레드로 동작하도록 설정할 수 있기 때문에 많은 요청을 더 효율적으로 처리할 수 있습니다.
- 이외에도 runserver에 비해 속도, 안정성 등 다양한 장점을 가지고 있기 때문에 배포 환경에서는 gunicorn을 사용하는 것을 권장하고 있습니다.
- 소스코드 다운받기
git clone https://github.com/sparta-course/drf-project.git ./django
- django 프로젝트를 배포하기 전 설정할 것
- settings.py
ALLOWED_HOSTS = ['*'] STATIC_ROOT = BASE_DIR / "static"
- timezone 설정하기
- 💡 Linux를 처음 설치하면 대부분 표준 시간대가 협정 세계시(UTC)로 설정되어 있습니다. 프로젝트를 배포할 때는 timezone을 한국 시간대(KST)로 변경해 주는 것이 좋습니다.리눅스에서 date 명령어를 사용하면 현재 적용된 timezone 정보를 확인할 수 있으며, 아무런 설정도 하지 않았을 경우 UTC로 설정되어 있는 것을 확인할 수 있습니다.
- sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
- 설정 후 다시 date 명령어를 확인해보면 KST로 바뀐 것을 확인할 수 있습니다.
- timezone을 변경해주기 위해, 기존 timezone 설정을 Asia/Seoul로 덮어씁니다.
- settings.py
- backend/Dockerfile
# python 3.10.8버전 이미지를 사용해 빌드 FROM python:3.10.8 # .pyc 파일을 생성하지 않도록 설정합니다. ENV PYTHONDONTWRITEBYTECODE 1 # 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다. ENV PYTHONUNBUFFERED 1 # /app/ 디렉토리를 생성합니다. RUN mkdir /app/ # /app/ 경로를 작업 디렉토리로 설정합니다. WORKDIR /app/ # requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다. COPY ./django/requirements.txt . # 프로젝트 실행에 필요한 패키지들을 설치합니다. RUN pip install --no-cache-dir -r requirements.txt # gunicorn을 사용하기 위한 패키지를 설치합니다. RUN pip install gunicorn
docker-compose.yml
version: '3.8' services: backend: container_name: backend build: ./backend/ # drf_project.wsgi는 프로젝트 경로에 맞게 지정해야 합니다. entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000" ports: - 80:8000 volumes: - ./backend/django/:/app/ - /etc/localtime:/etc/localtime:ro # host의 timezone 설정을 컨테이너에 적용합니다. # ro 은 읽기 전용(read only) 속성으로 볼륨을 설정하는 것을 의미합니다. restart: always
entrypoint 명령어 파헤쳐보기
- 💡 docker-compose.yml을 작성하며 entrypoint에 django 프로젝트를 실행시키기 위한 명령어를 사용했습니다.
- sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn project_name.wsgi --workers=5 -b 0.0.0.0:8000"
sh -c
: 컨테이너에서 뒤에 작성한 명령어를 실행시킬 수 있도록 해줍니다.python manage.py collectstatic --no-input
: 배포를 위해 static 파일을 모아줍니다. 해당 명령어를 실행시키기 위해서는 settings.py에 STATIC_ROOT가 정의되어 있어야 합니다.gunicorn project_name.wsgi --workers=5 -b 0.0.0.0:8000
: gunicorn을 사용해 django 프로젝트를 실행시킵니다.project_name
: django 프로젝트 이름을 입력합니다. 이름을 다르게 입력할 경우 에러가 발생합니다.--workers=5
: django를 실행시킬 process 갯수를 입력합니다. 일반적으로 cpu 코어 갯수 * 2 + 1만큼 지정해줍니다.(ex - 2코어라면 2*2+1=5)-b 0.0.0.0:8000
: 8000번 포트로 실행시킵니다.
python manage.py migrate
: django에 연결된 db를 migrate 해줍니다.&&
: 특정 명령어를 실행한 이후 다음 명령어를 실행시켜 줍니다.- 해당 명령어는 아래와 같이 나눠서 해석할 수 있습니다.
- 컨테이너가 잘 동작하는지 확인해보기
- 💡 django 프로젝트가 정상적으로 실행 됐는지 확인해보겠습니다.sudo docker compose up --build -d웹브라우저에서 접속해보기
- sudo docker compose logs
04. nginx를 사용해 웹서버 컨테이너 생성하기
🔑 nginx란 무엇인지 알아보고, 사용자들이 외부에서 접근하도록 설정하는 방법을 알아봅니다.
- nginx란?
- nginx는 클라이언트의 request 요청을 처리해주는 웹 서버(web server)입니다.reverse proxy, 로드밸런싱, 캐싱 등의 기능을 지원하며, 클라이언트의 요청을 nginx가 받은 후 service(django) 데이터를 넘겨주는 역할을 해줍니다.
- nginx를 사용하는 이유
- 💡 로드밸런싱을 활용해 트래픽을 분산할 수 있습니다.SSL 기능을 사용해 데이터를 안전하게 전달할 수 있습니다.콘텐츠를 캐싱하여 동일한 요청에 대해 더 빠른 속도로 처리할 수 있게 해줍니다.
- reverse proxy 기능을 통해 client에서 서버에 직접적으로 접근하는 것을 막아줍니다.
- docker-compose.yml
version: '3.8' services: nginx: container_name : nginx image: nginx:1.23.2 ports: - "80:80" # http 포트포워딩 - "443:443" # https 포트포워딩 restart: always
컨테이너가 잘 동작하는지 확인해보기
- 💡 nginx가 정상적으로 실행됐는지 확인해보겠습니다.
- sudo docker compose up -d
- 웹브라우저에서 접속해보기
- sudo docker compose logs
05. nginx / postgresql / django 연동하기
🔑 이전 강의에서 생성한 컨테이너들을 연동해서 배포 환경을 구성합니다.
- nginx 설정파일 만들기
- 💡 nginx 디렉토리 내 default.conf에 아래 내용으로 파일을 생성해줍니다.
server { listen 80; server_name _; # 모든 도메인 혹은 ip로 들어오는 요청에 대해 처리해 줍니다. location / { # nginx로 요청이 들어왔을 때 proxy_pass http://backend:8000/; # backend 컨테이의 8000번 포트로 전달합니다. } location /static/ { # 브라우저에서 /static/ 경로로 요청이 들어왔을 때 alias /static/; # /static/ 경로에 있는 파일들을 보여줍니다. } location /media/ { # 브라우저에서 /media/ 경로로 요청이 들어왔을 때 alias /media/; # /media/ 경로에 있는 파일들을 보여줍니다. } }
- backend/Dockerfile
# python 3.10.8버전 이미지를 사용해 빌드 FROM python:3.10.8 # .pyc 파일을 생성하지 않도록 설정합니다. ENV PYTHONDONTWRITEBYTECODE 1 # 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다. ENV PYTHONUNBUFFERED 1 # /app/ 디렉토리를 생성합니다. RUN mkdir /app/ # /app/ 경로를 작업 디렉토리로 설정합니다. WORKDIR /app/ # requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다. COPY ./django/requirements.txt . # 프로젝트 실행에 필요한 패키지들을 설치합니다. RUN pip install --no-cache-dir -r requirements.txt # gunicorn과 postgresql을 사용하기 위한 패키지를 설치합니다. RUN pip install gunicorn psycopg2
- django settings.py 설정해주기
import os # 환경변수에 따라 DEBUG모드 여부를 결정합니다. DEBUG = os.environ.get('DEBUG', '0') == '1' # 접속을 허용할 host를 설정합니다. ALLOWED_HOSTS = ['backend', ] # postgres 환경변수가 존재 할 경우에 postgres db에 연결을 시도합니다. POSTGRES_DB = os.environ.get('POSTGRES_DB', '') if POSTGRES_DB: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': POSTGRES_DB, 'USER': os.environ.get('POSTGRES_USER', ''), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''), 'HOST': os.environ.get('POSTGRES_HOST', ''), 'PORT': os.environ.get('POSTGRES_PORT', ''), } } # 환경변수가 존재하지 않을 경우 sqlite3을 사용합니다. else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # CORS 허용 목록에 ec2 ip를 추가합니다. CORS_ORIGIN_WHITELIST = ['http://$ec2_public_ip'] # ex) CORS_ORIGIN_WHITELIST = ['http://43.201.72.190'] # CSRF 허용 목록을 CORS와 동일하게 설정합니다. CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
- 디렉토리 구조
path : /home/ubuntu/
├── backend
│ ├── Dockerfile
│ └── django # project directory
├── docker-compose.yml
└── nginx
└── default.conf
- docker-compose.yml
version: '3.8' volumes: postgres: {} django_media: {} django_static: {} services: postgres: container_name: postgres image: postgres:14.5 volumes: - postgres:/var/lib/postgresql/data/ environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=P@ssw0rd - POSTGRES_DB=django restart: always backend: container_name: backend build: ./backend/ entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000" volumes: - ./backend/django/:/app/ - /etc/localtime:/etc/localtime:ro - django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다. - django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다. environment: # django에서 사용할 설정들을 지정해줍니다. - DEBUG=1 - POSTGRES_DB=django - POSTGRES_USER=user - POSTGRES_PASSWORD=P@ssw0rd - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 depends_on: - postgres restart: always nginx: container_name : nginx image: nginx:1.23.2 ports: - "80:80" - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다. - django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다. depends_on: - backend restart: always
- 배포 환경의 통신 구조
- 💡 배포 환경의 구조를 그려보자면 아래와 같습니다.가장 먼저 사용자는 EC2의 nginx에 request 요청을 하게 됩니다.이후 gunicorn에서는 django로, django에서는 필요에 따라 데이터베이스에 쿼리를 날려 개발자가 작성한 코드를 실행하게 됩니다.
- nginx에서는 사용자의 요청을 받아 .conf 파일에서 설정한 서버로 요청을 전달합니다.
06. env를 사용해 중요한 정보들 관리하기
🔑 데이터베이스 계정 정보 등 중요한 정보들을 env파일로 관리하는 방법을 알아보겠습니다.
- .env 작성하기
DEBUG=1
POSTGRES_DB=django
POSTGRES_USER=user
POSTGRES_PASSWORD=P@ssw0rd
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
- docker-compose.yml
version: '3.8' volumes: postgres: {} django_media: {} django_static: {} services: postgres: container_name: postgres image: postgres:14.5 # 만약 .env 파일을 다른 이름으로 사용할 경우 env_file 옵션을 사용해 불러올 수 있습니다. # env_file: # - prod.env volumes: - postgres:/var/lib/postgresql/data/ environment: - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_DB restart: always backend: container_name: backend build: ./backend/ entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000" volumes: - ./backend/django/:/app/ - /etc/localtime:/etc/localtime:ro - django_media:/app/media/ - django_static:/app/static/ environment: # - DEBUG - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_HOST - POSTGRES_PORT depends_on: - postgres restart: always nginx: container_name : nginx image: nginx:1.23.2 ports: - "80:80" - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다. - django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다. depends_on: - backend restart: always
07. 더 작은 이미지로 배포하기
🔑 docker 이미지는 용량 최적화를 위해 컨테이너 실행에 필요한 최소한의 파일만 들어있는 slim 이미지를 지원하고 있습니다.
- slim 이미지의 종류와 특징
- 💡 아래 예제는 python 이미지 기준이며, 이미지마다 지원하는 버전은 차이가 있습니다.동일한 docker 이미지라 하더라도 태그에 따라 이미지의 용량이 달라집니다.기본 python 이미지다만, 용량이 작은 이미지를 사용할 때는 외부 패키지를 설치할 때 필요한 의존성 파일들이 존재하지 않아 에러가 발생할 수 있습니다.
- 이미지의 태그별 특징
buster, jessie, stretch
- debian에서 만든 linux를 기반으로 만들어진 이미지입니다.
- buster, jessie, stretch는 os의 codename입니다. (링크)
- python:3.8과 python:3.8-buster는 동일합니다. (약 300~350mb)
slim
- 실행에 필요한 환경만 만들어둔 이미지입니다.
- 이미지가 기본이미지에 비해서는 작습니다. (약 40~50mb)
- 보통 python 실행환경에서 가장 많이 쓰이는 이미지
alpine
- 용량이 작고, 보안에 집중한 alpine-linux 기반으로 만들어진 이미지입니다.
- 보통 이미지들 중에서 가장 작다는 특징을 가지고 있습니다. (약 15~20mb)
- python기준으로 봤을 때, pip install을 할 때 불리한 점이 있습니다.
- 이미지의 태그별 특징
- 내가 사용하는 이미지에 어떤 종류의 태그가 존재하는지 확인이 필요할 때는 docker hub 이미지 페이지의 tags에서 확인 가능합니다.
- 가장 작은 용량의 python alpine 이미지
- 가령 python 이미지의 경우 가장 큰 이미지와 가장 작은 이미지의 용량이 300mb 이상 차이납니다.
- backend/Dockerfile
# python 3.10.8-slim버전 이미지를 사용해 빌드 FROM python:3.10.8-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN mkdir /app/ WORKDIR /app/ # slim 이미지에서 postgresql 패키지를 설치하기 위해 필요 명령어 추가 RUN apt update && apt install libpq-dev gcc -y COPY ./django/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt RUN pip install gunicorn psycopg2
- docker-compose.yml
version: '3.8' volumes: postgres: {} django_media: {} django_static: {} services: postgres: container_name: postgres image: postgres:14.5-alpine # alpine 이미지를 지정해줍니다. volumes: - postgres:/var/lib/postgresql/data/ environment: - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_DB restart: always backend: container_name: backend build: ./backend/ entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000" volumes: - ./backend/django/:/app/ - /etc/localtime:/etc/localtime:ro - django_media:/app/media/ - django_static:/app/static/ environment: - DEBUG=1 - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_HOST - POSTGRES_PORT depends_on: - postgres restart: always nginx: container_name : nginx image: nginx:1.23.2-alpine # alpine 이미지를 지정해줍니다. ports: - "80:80" - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - django_media:/media/ - django_static:/static/ depends_on: - backend restart: always
09. 도메인을 사용해 배포 서버에 접속하기
🔑 도메인을 사용해 배포 서버에 접근할 수 있도록 설정합니다.
- freenom nameserver 설정하기
- 💡 freenom에서 구매한 도메인을 AWS의 route53 서비스를 사용해 적용해 보겠습니다.AWS 접속 및 로그인 후 route53 서비스에 접속합니다.freenum에서 구매한 도메인을 입력해주고, 호스팅 영역 생성 버튼을 클릭합니다.호스팅 영역에서 도메인을 클릭하고 들어와서 값/트래픽 라우팅 대상에 있는 값들을 확인한 후 freenom 페이지로 이동합니다.Management Tools → Nameserver를 클릭합니다.이후 Change Nameservers 버튼을 누르면 Nameserver 설정이 끝납니다.
- ※설정 후 도메인이 반영되는데 까지는 짧게는 수십분에서 최대 24시간까지 걸릴 수 있습니다.
- Use custom nameservers을 클릭하고, AWS의 호스팅 영역에서 확인했던 NS 유형의 값/트래픽 라우팅 대상에 있는 값들을 입력해 줍니다.
- Service → My domains를 눌러 마이페이지에 들어간 후 Manage Domain 버튼을 클릭합니다.
- 호스팅 영역을 생성하면 호스팅 영역에서 지정된 도메인을 확인할 수 있습니다.
- 호스팅 영역 생성 버튼을 클릭합니다.
- route53 설정하기
- 💡 이제 route53에서 구매한 도메인에 접속했을 때 지정한 서버로 접속할 수 있도록 설정해 보겠습니다.route53 → 호스팅 영역에서 도메인을 클릭합니다.레코드 이름을 빈칸으로 두고, 값에 ec2의 퍼블릭 ip를 입력한 후 레코드 생성 버튼을 클릭합니다.
- ec2 퍼블릭 ip 확인하는 방법
- 💡 ec2 서비스에서 인스턴스(실행 중) 버튼을 눌러 들어갑니다.도메인을 연결해줄 인스턴스 id를 클릭하고 퍼블릭 ip를 확인합니다.
- 레코드 생성 버튼을 클릭합니다.
동일한 방법으로 레코드 이름에 www를 입력하고, 레코드 유형을 CNAME으로 변경한 후 값에 구매한 도메인을 입력한 후 레코드 생성 버튼을 클릭합니다. 이후 레코드 목록에서 설정 한 레코드들을 확인할 수 있습니다. </aside>
- nginx/default.conf
server { listen 80; server_name www.spartacodingclub.tk; # www.spartacodingclub.tk 도메인으로 들어오는 요청을 처리해줍니다. location / { proxy_pass http://backend:8000/; } location /static/ { alias /static/; } location /media/ { alias /media/; } } server { listen 80; server_name spartacodingclub.tk; # www가 없는 url로 요청 했을 때 return 301 http://www.spartacodingclub.tk$request_uri; # www를 붙인 url로 redirection 해줍니다. }
10. https 적용하기
🔑 더 안전하게 서비스를 운영할 수 있도록 https를 적용하는 방법을 알아봅니다.
- https란?
- 💡 웹 서버에서 데이터를 전송하기 위한 http 프로토콜에 보안을 의미하는 secure를 붙여 http 통신을 더 안전하게 할 수 있도록 해주는 프로토콜입니다.보안적인 특성 때문에 배포를 하는 서비스에는 https를 필수적으로 적용하게 됩니다.
- https를 적용하기 위해서는 SSL 인증서를 발급받고 웹서버에서 인증서를 지정해주는 과정이 필요합니다.
- SSL 인증서 발급받기
- 💡 https 적용을 위한 SSL 인증서 발급 방법을 알아보겠습니다.aws에서 서비스에 ssl을 검색하고 Certificate Manager에 접속합니다.퍼블릭 인증서 요청을 체크하고 다음 버튼을 클릭합니다.인증서 목록 화면에서 요청한 인증서의 ID를 클릭합니다.인증서를 발급받기 위해서는 도메인 인증이 필요합니다. SSL 요청만 한 상태에서는 해당 도메인이 내가 소유한 도메인이라는 것을 검증하지 못하기 때문에 상태가 “검증 대기 중” 으로 나오게 됩니다.도메인을 확인하고 레코드 생성 버튼을 클릭합니다.
- 이후 수분에서 수십분정도 기다리면 상태가 성공으로 바뀌게 됩니다. 이제 SSL 인증서 발급이 완료되었습니다.
- 도메인의 소유자라는 것을 증명하기 위해 Route 53에서 레코드 생성 버튼을 클릭합니다.
- ※ 만약 요청한 인증서가 보이지 않을 경우 페이지를 새로고침 해주세요
- 도메인 이름에 구매한 도메인 입력 → 이 인증서에 다른 이름 추가 → *.구매한 도메인 이름을 입력한 후 DNS 검증을 선택하고 요청 버튼을 클릭합니다.
- 서비스에 접속 후 인증서 요청 버튼을 클릭합니다.
- 대상 그룹 설정하기
- 💡 로드밸런서를 설정하기 전, 어떤 서버에 로드밸런서를 사용할지 대상을 지정해 주는 작업이 필요합니다.AWS에서 ec2 서비스에 접속합니다.Create target group 버튼을 클릭합니다.Target group name을 지정해줍니다.※Health check는 로드 밸런서에서 서버가 정상 동작 하는지 확인하는 용도로 사용되며, 서버에 정상적으로 접근하고 http status code 200을 리턴해줄 수 있는 경로를 입력해야 합니다.추가된 대상을 확인하고 Create target group 버튼을 클릭합니다.다시 대상 그룹을 들어가 보면서 등록한 대상을 확인할 수 있습니다.
- 아래와 같은 창이 나올 경우 Continue 버튼을 클릭합니다.
- 로드밸런서에 대상이 될 서버를 지정하고 Include as pending below 버튼을 클릭합니다.
- Health check path를 입력한 후 Next 버튼을 클릭합니다.
- 인스턴스를 선택해줍니다.
- 좌측 메뉴에서 로드 밸런싱 - 대상 그룹을 클릭합니다.
- 로드밸런서 설정하기
- 💡 로드밸런서를 위한 사전 작업이 완료되었습니다. 이제 본격적으로 로드밸런서를 생성해 보겠습니다.aws에서 ec2 서비스를 들어갑니다.로드 밸런서를 클릭합니다.Basic Configuration에서 로드밸런서의 이름을 작성하고 Internet-facing, IPv4를 선택합니다.Security groupts에서 default 그룹을 선택해 줍니다.Protocol에서 HTTPS를 선택하고 동일하게 대상 그룹을 선택해줍니다.※ Select a certificate에 아무것도 나오지 않는다면 SSL 인증서가 정상적으로 발급 되었는지 확인해야 합니다.이제 로드밸런서 목록에서 생성된 로드밸런서를 확인할 수 있습니다. 생성되자마자 상태를 확인하면 프로비저닝 중 이라 나오며, 수 분 후 활성으로 바뀌게 됩니다.
- 최종적으로 설정을 확인하고 Create load balancer 버튼을 클릭합니다.
- Secure listener settings에서 생성한 SSL 인증서를 선택합니다.
- Listeners and routing에서 이전에 생성한 대상 그룹을 지정하고 Add listener 버튼을 클릭합니다.
- Network mapping에서 ap-northeast-2a, 2b를 선택합니다.
- Application Load Balancer의 Create 버튼을 클릭합니다.
- 좌측 메뉴에서 로드 밸런싱 - 로드밸런서 클릭합니다.
- route53 설정하기
- 💡 로드밸런서 설정이 완료되었다면, route53에서 도메인에 접속했을 때 인스턴스로 접속하는것이 아닌 로드밸런서를 통해 접속할 수 있도록 설정해야 합니다.기존 구조AWS → route53 서비스 접속 → 호스팅 영역 → 등록한 도메인 클릭별칭 옵션을 활성화 한 후 Application/Classic Load Balancer에 대한 별칭 → 아시아 태평양(서울) → 생성한 로드밸런서를 순서대로 선택한 후 저장 버튼을 클릭합니다.
- 설정이 적용되기까지는 수 분 정도 소요되며, 이후 도메인으로 접속했을 때에는 ec2에 직접적으로 접근하는 것이 아는 로드밸런서를 통해 접근하게 됩니다.
- 유형 A로 등록된 도메인을 선택한 후 레코드 편집 버튼을 클릭합니다.
- route53 설정 후
- http 요청을 https로 redirect 하도록 설정하기
- 💡 일반적으로 사용자들이 웹 브라우저를 사용해 접근하는 대부분의 사이트들은 http로 접속했을 때 https로 자동으로 리다이렉션 해줍니다.가령, http://www.naver.com 이라는 주소로 접속했을 때 자동으로 https://www.naver.com으로 리다이렉션 되는 것을 확인할 수 있습니다.AWS → ec2 서비스 접속 → 로드밸런서 → 생성한 로드밸런서 클릭상단의 추가(더하기 아이콘) 버튼 → 규칙 삽입을 클릭합니다.THEN의 작업 추가 → 리디리렉션 대상 선택 → HHTPS 선택 및 443 포트 입력 → 기본 호스트, 301을 각각 선택한 후 체크 아이콘을 클릭합니다.
- 설정을 확인하고 저장 버튼을 클릭합니다.
- IF의 조건 추가 → 호스트 헤더 선택 → *.구매한도메인이름을 입력한 후 체크 아이콘을 클릭합니다.
- 리스너 → HTTP : 80에 해당하는 리스너의 규칙 보기/편집 버튼을 클릭합니다.
- 이번에는 로드 밸런서의 리스너 설정을 통해 http 요청을 https로 리다이렉션 해주도록 설정해 보겠습니다.
- django settings.py 설정해주기
# CORS 허용 목록에 도메인 서버를 추가합니다. CORS_ORIGIN_WHITELIST = ['https://www.$domain', ] # CORS_ORIGIN_WHITELIST = ['https://www.$domain', ] # CSRF 허용 목록을 CORS와 동일하게 설정합니다. CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
'내일배움캠프' 카테고리의 다른 글
WIL 내일배움캠프 12주차 (0) 2023.06.02 TIL 2023.06.02 (0) 2023.06.02 TIL 2023.05.31 (0) 2023.05.31 TIL 2023.05.30 (0) 2023.05.30 TIL 2023.05.29 (2) 2023.05.29