해당 챕터는 21년 3월에 녹화한 MBIT 강의와 동일한 내용이어서 MBIT 영상을 그대로 활용하겠습니다. 문서를 보실 때에는 폴더명에 유의해주세요.
1. 배포 전 준비1.1. 환경 변수 설정1.2. collectstatic2. WSGI2.1. uWSGI- uWSGI 실행해보기- ini 파일로 uWSGI 실행3. Nginx3.1. 웹서버3.2. Nginx 설정하기3.3. uWSGI 소켓 설정3.4. Nginx 실행하기4. 구름 IDE 실행 명령 추가
1. 배포 전 준비
1.1. 환경 변수 설정
프로젝트의
settings.py
파일에 보면 SECRET_KEY
와 DEBUG
변수가 있습니다.# 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
이면 개발 단계에서 개발자를 위해 도와주는 디버그 정보가 보여지게 됩니다. 하지만 배포 시에는 프로젝트 보안 상 디버그 정보가 노출 되어서는 안 됩니다.
- 컨테이너의 설정으로 들어갑니다. 컨테이너 목록에서 톱니바퀴 아이콘을 누르거나, IDE 실행 화면에서 오른쪽 상단의
컨테이너 정보
를 통해 들어갈 수 있습니다.


- 다음과 같이 환경 변수를 등록합니다.

settings.py
에서 이 환경 변수들을 사용하여SECRET_KEY
와DEBUG
값을 정의합니다. 환경 변수의 값들은 os 모듈의 environ을 통해 접근할 수 있습니다.
# 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
입니다.- settings.py에서
STATIC_ROOT
변수에 static 파일들을 모을 경로를 설정합니다.
STATIC_ROOT = BASE_DIR / 'staticfiles'
BASE_DIR
은 프로젝트 생성 시 자동으로 만들어 준 경로값으로 manage.py
가 있는 경로를 가리킵니다. 우리는 BASE_DIR
경로의 staticfiles
라는 폴더에 static 파일들을 모을 것입니다.collectstatic
명령어로 static 파일들을 모읍니다.
$ python manage.py collectstatic

그러면 해당 경로에
staticfiles
라는 폴더가 생성되고 안에 static 파일들이 모인 것을 확인할 수 있습니다.
2. WSGI
WSGI
란 Web Server Gateway Interface 웹서버와 파이썬 앱 사이를 연결해주는 장치입니다. 웹서버와 우리가 만든 장고 웹 애플리케이션은 직접적으로 상호 간의 통신이 불가능하기 때문에 그 사이에서 WSGI
가 중재자 역할을 해줍니다.사용자가 웹서버에 요청을 보내면
WSGI
가 django에 넘겨주고, django는 요청을 처리한 뒤 응답을 WSGI
를 통해 웹서버로 전달합니다.사용자 <-> 웹 서버 <-> WSGI <-> 장고
2.1. uWSGI
uWSGI
는 WSGI의 기능을 구현한 파이썬 패키지입니다. uWSGI
를 이용하여 장고 프로젝트를 실행시켜보겠습니다.- uWSGI 실행해보기
uWSGI
를 설치할 가상환경을 활성화합니다.
$ source [가상환경폴더경로]/bin/activate
pip
를 이용해uWSGI
를 설치합니다. (약간의 시간 소요)
$ pip install uwsgi
uWSGI
를 실행시켜봅니다.
$ 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

이제
runserver
명령 없어도 80번 포트로 접속하면 프로젝트 페이지로 접속이 가능합니다.
- ini 파일로 uWSGI 실행
uWSGI를 실행하기 위해서 옵션이 많이 필요합니다. 또한 해당 옵션들을 절대 경로로 적어주다보니 명령어 하나의 양이 적지 않습니다. 이를 위해
.ini
파일에 해당 설정들을 저장하여 실행할 수 있습니다./workspace/MBIT/.config/uwsgi/uwsgi.ini
경로에wsgi.ini
파일을 만듭니다.

uwsgi.ini
파일을 다음과 같이 수정해줍니다.chdir
: django project의 manage.py가 존재하는 경로를 지정해줍니다.module
: wsgi 파일을 지정해줍니다.home
: 가상환경의 경로를 지정해줍니다.uid
,gid
: uWSGI를 실행할 사용자 및 사용자그룹을 지정해줍니다.http
: http 프로토콜을 통해서 요청을 받으며 포트 번호를 정해줍니다.enable-threads
: 스레드 사용 여부를 결정합니다.master
: 마스터 프로세스 사용 여부를 결정합니다.vacuum
: 실행 시 자동 생성되는 파일들을 삭제해줍니다.pidfile
: 실행되는 프로세스의 id 값을 담고 있는 파일, pidfile의 경로를 지정해줍니다.logto
: 로그파일을 작성할 위치를 설정합니다.log-reopen
: 재시작할 시 로그를 다시 열어줍니다.
[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/
- 프로젝트 경로에
tmp
폴더와log/uwsgi
폴더를 만듭니다.

uwsgi
명령어로uwsgi.ini
파일을 실행시킵니다.
$ uwsgi -i .config/uwsgi/uwsgi.ini

- 이제 80번 포트의 URL로 접속합니다.

3. Nginx
uWSGI
를 사용하여 django를 웹서버와 연결시킬 준비를 마쳤습니다.
이번에는 본격적으로 웹서버에 대해서 알아보도록 하겠습니다.3.1. 웹서버
웹서버란 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말합니다.
웹서버도 여러 종류가 있어 웹서버마다 차이가 존재하겠지만 대체로 다음과 같은 기능들을 제공합니다.
- 인증
- 정적 콘텐츠 관리
- HTTPS 지원
- 콘텐츠 압축
- 가상 호스팅
- 대용량 파일 지원
- 대역폭 스로틀링
아파치, microsoft의 IIS, nginx 등 여러 웹서버가 있지만 여기서는 nginx를 사용해보도록 하겠습니다.
3.2. Nginx 설정하기
- 구름 ide에서는
nginx
가 기본적으로 설치되어있습니다. 다음 명령어를 통해nginx
설치여부와 버전을 확인할 수 있습니다.
$ nginx -v nginx version: nginx/1.14.0 (Ubuntu)
.config/nginx/MBIT.conf
파일을 만듭니다. 내용을 다음과 같이 수정합니다.

MBIT.conf
파일을 다음과 같이 수정합니다.
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/; } }
MBIT.conf
파일을/etc/nginx/sites-available/
폴더에 복사합니다.
$ cp -f /workspace/MBIT/.config/nginx/MBIT.conf /etc/nginx/sites-available/
sites-available
폴더는 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분입니다. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳입니다.-
sites-available
로 이동한 설정 파일을sites-enabled
에 링크해줍니다.
$ ln -sf /etc/nginx/sites-available/MBIT.conf /etc/nginx/sites-enabled/
sites-enabled
는 sites-available
에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더입니다. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅합니다.sites-enabled
폴더에 있던default
파일은 삭제해줍니다.
$ 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 실행하기
- 다음 명령어로
nginx
를 실행합니다.
$ service nginx start

80
번 포트의 URL로 접속하면 사진 처럼 nginx가 작동하는 것을 확인할 수 있습니다.

아직 페이지가 정상적으로 보이지 않는 것은
uWSGI
가 실행 되지 않아 소켓이 없는 상태이기 때문입니다.- 이제
uWSGI
를 실행시켜 소켓을 활성화합니다.
$ uwsgi -i .config/uwsgi/uwsgi.ini

이제 다시 접속하면 프로젝트에 정상적으로 접속할 수 있습니다.

4. 구름 IDE 실행 명령 추가
매번 프로젝트를 실행할 때마다
nginx
또는 uwsgi
를 실행시키는 명령어를 작성하는 것은 번거로운 일입니다. 구름IDE에서는 이러한 명령어들을 미리 저장해서 실행 시킬 수 있습니다.- 구름IDE 오른쪽 상단에서
실행 명령 추가
를 클릭합니다.

이름
에 본인이 원하는 이름을 짓고 해당 명령의 스크립트를 다음과 같이 작성합니다.service nginx start
: nginx를 실행합니다.&&
: 앞의 명령어가 성공했을 시, 다음 명령어를 실행합니다./workspace/MBIT/venv/bin/uwsgi -i /workspace/MBIT/.config/uwsgi/uwsgi.ini
: uwsgi를 실행합니다.
service nginx start && /workspace/MBIT/venv/bin/uwsgi -i /workspace/MBIT/.config/uwsgi/uwsgi.ini

- 서버 프로세스는 ON으로 활성화 하면 실행시 프로젝트 URL을 보여줍니다.

종료
버튼으로 해당 명령을 종료할 수 있고, 편집
버튼으로 수정이 가능합니다.