🌇

[심화] 배포하기

1. 배포 전 준비

1.1. 환경 변수 설정

프로젝트의 settings.py 파일에 보면 SECRET_KEYDEBUG 변수가 있습니다.
# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '%ljvk*h2sno=wepa5p)dt+c6gtq44@fn^cl=7&+8ypc)k4xe16' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True
  • SECRET_KEY : 프로젝트의 보안 등에 이용되는 긴 랜덤 문자열 값입니다. 보안과 관련되어 있으므로 외부에 노출되어서는 안 됩니다.
  • DEBUT : 이 값이 True이면 개발 단계에서 개발자를 위해 도와주는 디버그 정보가 보여지게 됩니다. 하지만 배포 시에는 프로젝트 보안 상 디버그 정보가 노출 되어서는 안 됩니다.
 
  1. 컨테이너의 설정으로 들어갑니다. 컨테이너 목록에서 톱니바퀴 아이콘을 누르거나, IDE 실행 화면에서 오른쪽 상단의 컨테이너 정보를 통해 들어갈 수 있습니다.
    1. notion imagenotion image
      notion imagenotion image
       
  1. 다음과 같이 환경 변수를 등록합니다.
    1. notion imagenotion image
       
  1. settings.py에서 이 환경 변수들을 사용하여 SECRET_KEYDEBUG 값을 정의합니다. 환경 변수의 값들은 os 모듈의 environ을 통해 접근할 수 있습니다.
    1. # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.environ['SECRET_KEY'] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True if os.environ['DEBUG'] == 'True' else False
      환경변수 값들은 모두 문자열로 저장되기 때문에 True를 넣더라도 bool 타입의 True 가 아니라 문자열 'True'인 것에 유의하세요.
 

1.2. collectstatic

장고의 runserver 명령을 통해 프로젝트를 실행하였지만, 이는 개발용으로 임시로 쓰는 서버로 실제 배포할 때에는 적합하지 않습니다. 그래서 뒤에 설명될 웹서버라는 것을 사용합니다. 하지만 웹서버를 사용하면 이제 앱마다 가지고 있는 static 파일에 접근하는 django 서버의 기능을 사용하지 못합니다. 그래서 앱 마다 나뉘어져 있는 static 파일들을 한 곳에 모으는 과정이 필요한데 이를 해주는 명령어가 collectstatic입니다.
 
  1. settings.py에서 STATIC_ROOT 변수에 static 파일들을 모을 경로를 설정합니다.
    1. STATIC_ROOT = BASE_DIR / 'staticfiles'
      BASE_DIR은 프로젝트 생성 시 자동으로 만들어 준 경로값으로 manage.py가 있는 경로를 가리킵니다. 우리는 BASE_DIR 경로의 staticfiles라는 폴더에 static 파일들을 모을 것입니다.
       
  1. collectstatic 명령어로 static 파일들을 모읍니다.
    1. $ python manage.py collectstatic
      notion imagenotion image
       
      그러면 해당 경로에 staticfiles라는 폴더가 생성되고 안에 static 파일들이 모인 것을 확인할 수 있습니다.
      notion imagenotion image
 

2. WSGI

WSGI란 Web Server Gateway Interface 웹서버와 파이썬 앱 사이를 연결해주는 장치입니다. 웹서버와 우리가 만든 장고 웹 애플리케이션은 직접적으로 상호 간의 통신이 불가능하기 때문에 그 사이에서 WSGI가 중재자 역할을 해줍니다.
사용자가 웹서버에 요청을 보내면 WSGI가 django에 넘겨주고, django는 요청을 처리한 뒤 응답을 WSGI를 통해 웹서버로 전달합니다.
사용자 <-> 웹 서버 <-> WSGI <-> 장고

2.1. uWSGI

uWSGI는 WSGI의 기능을 구현한 파이썬 패키지입니다. uWSGI를 이용하여 장고 프로젝트를 실행시켜보겠습니다.

- uWSGI 실행해보기

  1. uWSGI를 설치할 가상환경을 활성화합니다.
    1. $ source [가상환경폴더경로]/bin/activate
       
  1. pip를 이용해 uWSGI를 설치합니다. (약간의 시간 소요)
    1. $ pip install uwsgi
       
  1. uWSGI를 실행시켜봅니다.
    1. $ uwsgi \ --http :80 \ --home /workspace/MBIT/venv/ \ --chdir /workspace/MBIT/ \ --static-map /static=/workspace/MBIT/staticfiles/ \ -w MBIT.wsgi
      $ uwsgi --http :80 --home /workspace/MBIT/venv --chdir /workspace/MBIT --static-map /static=/workspace/MBIT/staticfiles/ -w MBIT.wsgi
      notion imagenotion image
       
      이제 runserver 명령 없어도 80번 포트로 접속하면 프로젝트 페이지로 접속이 가능합니다.
      notion imagenotion image
       

- ini 파일로 uWSGI 실행

uWSGI를 실행하기 위해서 옵션이 많이 필요합니다. 또한 해당 옵션들을 절대 경로로 적어주다보니 명령어 하나의 양이 적지 않습니다. 이를 위해 .ini 파일에 해당 설정들을 저장하여 실행할 수 있습니다.
  1. /workspace/MBIT/.config/uwsgi/uwsgi.ini 경로에 wsgi.ini파일을 만듭니다.
    1. notion imagenotion image
       
  1. uwsgi.ini 파일을 다음과 같이 수정해줍니다.
    1. [uwsgi] chdir = /workspace/MBIT/ module = MBIT.wsgi:application home = /workspace/MBIT/venv/ uid = root gid = root http = :80 enable-threads = true master = true vacuum = true pidfile = /workspace/MBIT/tmp/MBIT.pid logto = /workspace/MBIT/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log log-reopen = true static-map = /static=/workspace/MBIT/staticfiles/
      • chdir : django project의 manage.py가 존재하는 경로를 지정해줍니다.
      • module : wsgi 파일을 지정해줍니다.
      • home : 가상환경의 경로를 지정해줍니다.
      • uid, gid : uWSGI를 실행할 사용자 및 사용자그룹을 지정해줍니다.
      • http : http 프로토콜을 통해서 요청을 받으며 포트 번호를 정해줍니다.
      • enable-threads : 스레드 사용 여부를 결정합니다.
      • master : 마스터 프로세스 사용 여부를 결정합니다.
      • vacuum : 실행 시 자동 생성되는 파일들을 삭제해줍니다.
      • pidfile : 실행되는 프로세스의 id 값을 담고 있는 파일, pidfile의 경로를 지정해줍니다.
      • logto : 로그파일을 작성할 위치를 설정합니다.
      • log-reopen : 재시작할 시 로그를 다시 열어줍니다.
       
  1. 프로젝트 경로에 tmp 폴더와 log/uwsgi 폴더를 만듭니다.
    1. notion imagenotion image
       
  1. uwsgi 명령어로 uwsgi.ini 파일을 실행시킵니다.
    1. $ uwsgi -i .config/uwsgi/uwsgi.ini
      notion imagenotion image
       
  1. 이제 80번 포트의 URL로 접속합니다.
    1. notion imagenotion image
 

3. Nginx

 uWSGI를 사용하여 django를 웹서버와 연결시킬 준비를 마쳤습니다. 이번에는 본격적으로 웹서버에 대해서 알아보도록 하겠습니다.

3.1. 웹서버

웹서버란 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말합니다.
웹서버도 여러 종류가 있어 웹서버마다 차이가 존재하겠지만 대체로 다음과 같은 기능들을 제공합니다.
  • 인증
  • 정적 콘텐츠 관리
  • HTTPS 지원
  • 콘텐츠 압축
  • 가상 호스팅
  • 대용량 파일 지원
  • 대역폭 스로틀링
아파치, microsoft의 IIS, nginx 등 여러 웹서버가 있지만 여기서는 nginx를 사용해보도록 하겠습니다.
 

3.2. Nginx 설정하기

  1. 구름 ide에서는 nginx가 기본적으로 설치되어있습니다. 다음 명령어를 통해 nginx 설치여부와 버전을 확인할 수 있습니다.
    1. $ nginx -v nginx version: nginx/1.14.0 (Ubuntu)
       
  1. .config/nginx/MBIT.conf 파일을 만듭니다. 내용을 다음과 같이 수정합니다.
    1. notion imagenotion image
       
  1. MBIT.conf 파일을 다음과 같이 수정합니다.
    1. server { listen 80; server_name *.run.goorm.io; charset utf-8; client_max_body_size 128M; location / { uwsgi_pass unix:///workspace/MBIT/tmp/MBIT.sock; include uwsgi_params; } location /static/ { alias /workspace/MBIT/staticfiles/; } }
  1. MBIT.conf 파일을 /etc/nginx/sites-available/ 폴더에 복사합니다.
    1. $ cp -f /workspace/MBIT/.config/nginx/MBIT.conf ../etc/nginx/sites-available/
      sites-available 폴더는 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분입니다. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳입니다.
       
  1. sites-available 로 이동한 설정 파일을 sites-enabled에 링크해줍니다.
    1. $ ln -sf /etc/nginx/sites-available/MBIT.conf /etc/nginx/sites-enabled/
      sites-enabled는 sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더입니다. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅합니다.
       
  1. sites-available 폴더에 있던 default 파일은 삭제해줍니다.
    1. $ rm /etc/nginx/sites-enabled/default
       

3.3. uWSGI 소켓 설정

nginx를 설치하고 설정을 완료했으니 기존의 uWSGI가 nginx와 연결되도록 설정을 해주겠습니다.
웹서버인 nginx와 uWSGI 사이의 통신을 매개 HTTP 요청을 사용할 수도 있지만 서버 안쪽에서의 통신이기 때문에 소켓 방식이 overhead가 적어서 더 효율적입니다.
따라서 이를 위한 설정을 해주도록 하겠습니다.
다시 로컬로 넘어와 uwsgi.ini파일을 수정해줍시다.
[uwsgi] chdir = /workspace/MBIT/ module = MBIT.wsgi:application home = /workspace/MBIT/venv/ uid = root gid = root ################# 이 부분 ######################### socket = /workspace/MBIT/tmp/MBIT.sock chmod-socket = 666 chown-socket = root:root ######################################### enable-threads = true master = true vacuum = true pidfile = /workspace/MBIT/tmp/MBIT.pid logto = /workspace/MBIT/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log log-reopen = true static-map = /static=/workspace/MBIT/staticfiles/
 

3.4. Nginx 실행하기

  1. 다음 명령어로 nginx를 실행합니다.
    1. $ service nginx start
      notion imagenotion image
       
  1. 80번 포트의 URL로 접속하면 사진 처럼 nginx가 작동하는 것을 확인할 수 있습니다.
    1. notion imagenotion image
      아직 페이지가 정상적으로 보이지 않는 것은 uWSGI가 실행 되지 않아 소켓이 없는 상태이기 때문입니다.
       
  1. 이제 uWSGI를 실행시켜 소켓을 활성화합니다.
$ uwsgi -i .config/uwsgi/uwsgi.ini
notion imagenotion image
 
이제 다시 접속하면 프로젝트에 정상적으로 접속할 수 있습니다.
notion imagenotion image
 
 

4. 구름 IDE 실행 명령 추가

매번 프로젝트를 실행할 때마다 nginx 또는 uwsgi를 실행시키는 명령어를 작성하는 것은 번거로운 일입니다. 구름IDE에서는 이러한 명령어들을 미리 저장해서 실행 시킬 수 있습니다.
  1. 구름IDE 오른쪽 상단에서 실행 명령 추가를 클릭합니다.
    1. notion imagenotion image
       
  1. 이름에 본인이 원하는 이름을 짓고 해당 명령의 스크립트를 다음과 같이 작성합니다.
    1. service nginx start && /workspace/MBIT/venv/bin/uwsgi -i /workspace/MBIT/.config/uwsgi/uwsgi.ini
      • service nginx start : nginx를 실행합니다.
      • && : 앞의 명령어가 성공했을 시, 다음 명령어를 실행합니다.
      • /workspace/MBIT/venv/bin/uwsgi -i /workspace/MBIT/.config/uwsgi/uwsgi.ini : uwsgi를 실행합니다.
      notion imagenotion image
       
  1. 서버 프로세스는 ON으로 활성화 하면 실행시 프로젝트 URL을 보여줍니다.
    1. notion imagenotion image
      종료 버튼으로 해당 명령을 종료할 수 있고, 편집 버튼으로 수정이 가능합니다.