Django EC2에서 django 배포하기

Seungju Hwang·2021년 4월 14일
0

django

목록 보기
11/11
post-thumbnail

Nginx 웹서버를 통해 django API server를 배포하는 방법에 대해 간단하게 소개하려고 합니다.

EC2 인스턴스발급은 생략하겠습니다. 오로지 우분투 내에서 django와 nginx,gunicorn 세팅에 대해서만 언급하겠습니다.

아키텍처는 다음과 같습니다.

클라이언트(브라우저) ⬅➡ 웹서버(Web Server - nginx)⬅➡ WSGI(Web Server Gateway Interface - gunicorn) ⬅➡ WAS(Web Application Server - django)

📌 배포전 django 설정

로컬에서 django 세팅이 일부 필요합니다.

패키지관리

(venv) $ pip freeze > requirements.txt

settings.py 분리

  1. settings 폴더를 생성한다.
  2. __init__.py 파링 생성
  3. 기존settings.py파일을 base.py로 변경.
  4. local.py, production.py 파일 생성.
settings/
  __init__.py
  base.py
  local.py
  production.py

local.py

# settings/local.py

from .base import *

DEBUG = True

ALLOWED_HOSTS = []

production.py

from .base import *

DEBUG = False

ALLOWED_HOSTS = [
 # public_ip 주소
 # ex) 13.126.105.123
]

wsgi.py

import os

...

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트폴더명.settings.production')

...

manage.py

#!/usr/bin/env python
import os
import sys

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트폴더명.settings.local')
    ...

static 관련 설정

# settings/base.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [ 
	# 직접 만든 static 폴더의 경로를 적습니다.
	# ex) BASE_DIR / 'static_폴더명'
]

STATIC_ROOT = BASE_DIR / 'staticfiles'

📌 설치

$ sudo apt install gunicorn
$ sudo apt-get install python3-dev python3-pip libpq-dev python3-venv python3-wheel -y
$ sudo apt-get install gcc libpq-dev -y
$ pip3 install wheel

$ cd backend
$ python3 -m venv venv
$ source venv/bin/activate
$ pip3 install -r requirements.txt
$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py collectstatic

$ deactivate

📌 설정

gunicorn, nginx 세팅이 필요합니다.

gunicorn

$ sudo vi /etc/systemd/system/gunicorn.service
[Unit]
Description= [프로젝트명]
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/루트폴더명
ExecStart=/home/ubuntu/프로젝트명/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/루트폴더명/루트폴더명.sock 프로젝트폴더명.wsgi:application

[Install]
WantedBy=multi-user.target
  • gunicorn 실행
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
#ngixn 상태확인
$ sudo systemctl status gunicorn

# 에러발생시 gunicorn.service 수정 후 
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

nginx

$ sudo vim /etc/nginx/sites-enabled/default

server{
	
    # 프론트엔드에서 한 부분은 놔두고!
    ...
    
    
    # api로 url이 들어오면 nginx에서 api를 제거하고 서버로 보내주겠다!
	location /api/ {
		rewrite ^/api(/.*)$ $1 break; 
		includ proxy_params;
		proxy_pass http://unix:/home/ubuntu/루트폴더명/루트폴더명.sock;
	}
	
    # static 관련해서는 staticfiles를 씁시다!
	location /static/ {
			alias /home/ubuntu/루트폴더명/staticfiles/;
	}
	
}
  • nginx 실행
$ sudo nginx -t
$ sudo systemctl restart nginx
# 에러발생시
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo systemctl restart nginx

#ngixn 상태확인
$ sudo systemctl status nginx

📌 참고

글쓸 때 참고 한것

관련된 글

profile
기록하는 습관은 쉽게 무너지지 않아요.

0개의 댓글