Python/Django

[Django, AWS] EC2 에서 Nginx + Gunicorn + Django 배포하기

yubi5050 2022. 7. 12. 04:42

Nginx + Gunicorn 필요 이유

Django는 기본적으로 runserver 라는 개발용 내장 서버를 탑재하고 있으나, 실제 서비스용 (Production Level) 으로 사용하기에는 성능의 한계, 보안 이슈 등 다양한 문제점이 존재하여, Gunicorn을 통해 배포한다.

 

Gunicorn 은 Django 로 작성한 Web Application 에 HTTP 요청을 전달해주는 역할의 WSGI HTTP Server 로서 사용하며, worker process 의 개수와 worker class(async 방식인 Gevent, Tornado 등)를 설정하여 요청 처리 성능을 높일 수 있다.

 

Nginx는 Free OpenSource Webserver 소프트웨어로 가벼우면서도 높은 성능을 내며, Buffering, ReverseProxy, MailProxy, LoadBalancing 등의 기능을 수행한다.

 

추가로 gunicorn도 Web Server의 역할을 하지만 그럼에도 불구하고 앞단에 nginx를 쓰는 이유는 DDos 공격 방지, static file전송 효율성, nginx buffering 기능 때문.

 

최종적으로 Django 외부 배포시에는 Webserver(=WAS) (Nginx) + WSGI 서버 (Gunicorn) + Web Application (Django)조합을 구성하여 배포하는 것이 일반적이다..

 

이미지 링크 : https://velog.io/@jimin_lee/Nginx%EC%99%80-Gunicorn-%EB%91%98-%EC%A4%91-%ED%95%98%EB%82%98%EB%A7%8C-%EC%8D%A8%EB%8F%84-%EB%90%A0%EA%B9%8C

 

1. EC2 생성 및 접속

EC2 : Ubuntu 18:04 LTS 프리티어

보안그룹 - 인바운드 규칙 8000번 ipv4(0.0.0.0/0), ipv6(::/0) 오픈

# git bash 서 작업
ssh -i <key.pem PATH> ubuntu@<aws-my-public-domain-address>
# ex) ssh -i /c/aws_keys/smops-be-key.pem ubuntu@ec2-3-34-3-15.ap-northeast-2.compute.amazonaws.com

 

2. EC2 Setting

# 패키지 update & password 설정
$ sudo apt-get update -y
$ sudo passwd root => 비번 root

# Python 기본을 3.x 로 지정
$ sudo apt-get install -y python-pip
$ sudo apt-get install -y python3-pip
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
$ sudo update-alternatives --config python  ==> 2입력

# 패키지 upgrade & sudo 모드 진입
$ sudo apt-get upgrade -y
$ sudo => 비번 root

 

3. Django Setting

현재 Django는 개발용 runserver로 켜진 것을 알 수 있음.

# 패키지 설치
$ pip install django gunicorn

# django 폴더 진입
$ mkdir backend && cd backend/

# django project 생성 및 migration
$ django-admin startproject ex_project
$ cd ex_project
$ python manage.py makemigrations
$ python manage.py migrate

# EC2 IP 설정 - settings.py
$ nano ex_project/settings.py => ALLOWED_HOSTS = ["<aws-my-public-ip>"] 변경 => (ctrl + x) => y 로 빠져나옴.

# 서버 실행
$ python manage.py runserver 0:8000 => 외부에서 <aws-my-public-ip>:8000 으로 접근

 

4. Gunicorn으로 서버 배포하기

# Gunicorn으로 서버 배포하기
$ gunicorn --bind 0.0.0.0:8000 ex_project.wsgi:application  
=> 외부에서 <aws-my-public-ip>:8000 으로 접근시 아래 이미지 처럼 나오면 성공

Gunicorn 실행 완료 사진

 

(추가) Gunicorn 서비스로 등록하기 링크 : https://leffept.tistory.com/283?category=950490 

 

5. Nginx 기본 셋팅 및 실행

# Nginx 설치
$ sudo apt-get install nginx -y

# Nginx Version 확인
$ nginx -V  => "nginx/1.14.0"

# Nginx 실행
$ sudo /etc/init.d/nginx start

 

6. Nginx + (Gunicorn + Django)

nginx 가 Gunicorn + Django 환경에 덧붙여서 해줄 수 있는 일은 우선 두 가지가 있다.

(1) 구입한 Domain / 로컬 Domain 으로 ip를 감싸주는 기능

# 로컬 DNS 수정하기
$ cd /home/ubuntu/
$ nano /etc/hosts
=> 127.0.0.1 localhost를 127.0.0.1 sidepro.com 으로 변경

# django settings.py 수정 DNS 추가
$ nano ex_project/settings.py => ALLOWED_HOSTS = [... , 'sidepro.com'] 추가

# 서버 TEST 해보기
$ curl sidepro.com => HTML 객체 반환되면 성공

 

(2) Proxy pass기능으로 Port Redirect를 통해 포트 번호 없이 장고 서버 접속 기능

- 해당 링크 참조 : https://leffept.tistory.com/283?category=950490