최용우
장고 + Nginx + Gunicorn 배포하기 본문
장고로 만든 프로젝트를 배포하기 위해선 python manage.py runserver 보단
상용화된 웹서버 Nginx로 배포하는 것이 좋다.
그러나 Nginx로는 장고 프로젝트를 바로 연결 할 수 없어서
Gunicorn이라는 징검다리를 통해 배포하게 된다.
전체적인 흐름은 아래와 같다.
클라이언트 -> Nginx -> Gunicorn -> Django
내가 사용했던 배포 방법을 기록해 놓으려고 한다.
사용환경은 AWS lightsail 3.5$ 짜리 ubuntu 운영체제다.
아래 글을 참고하였다.
점프 투 장고 : https://wikidocs.net/76904
4-09 Gunicorn
이전 장에서 웹 서버에서 파이썬 장고 애플리케이션이 구현되어 있는 wsgi.py 파일을 호출하려면 WSGI 서버가 필요하다고 했다. 이번에는 파이보에서 사용할 WSGI 서버 ...
wikidocs.net
방법
1. 가상환경 진입
2. Django 프로젝트 디렉토리로 이동 (manage.py가 존재하는 곳)
3. Gunicorn 설치
$pip install gunicorn4. Gunicorn 작동 확인
$gunicorn --bind 0:8000 config.wsgi:application*혹시라도 config 디렉토리를 다른 이름으로 설정했다면 [본인이 설정한 이름].wsgi:application 으로 해야한다.
*wsgi 다음에 : 콜론임을 주의하자. 처음에 .(점) 인줄 알았다가 오류가 발생했다.
5. 환경 변수 파일 생성
*가상환경 디렉토리에서 (bin이 있는 곳) '[원하는이름].env'를 생성한다.
*나의 프로젝트는 로또 자동 생성기라 이름을 lottery로 지었다
$sudo vi lottery.env
DJANGO_SETTINGS_MODULE=config.settings
위 내용을 그대로 복사 붙여 넣기 한다. 장고 프로젝트에서 config디렉토리가 아니라면 본인이 설정한 이름으로 변경
6. Gunicorn 소켓 생성 및 설정
*unix(ubuntu)계열 운영체제에서는 소켓을 사용하는것이 효율적이다.
6-1. 임의 디렉토리 생성(manage.py가 있는 디렉토리에서 나는 run 이라는 디렉토리를 생성했다)
$mkdir run6-2. run 디렉토리 권한 설정(권한 설정을 해주지 않으면 추후 gunicorn.sock이 생성되지 않음)
$sudo chown ubuntu:www-data run
6-3. /etc/systemd/system 디렉토리로 이동후 gunicorn.service 라는 파일 생성 후 내용 삽입
$cd /etc/systemd/system
$sudo vi gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/projects/lottery
EnvironmentalFile=/home/ubuntu/venvs/lotteryvenv/lotteryvenv.env
ExecStart=/home/ubuntu/venvs/lotteryvenv/bin/gunicorn \
        --workers 2 \
        --bind unix:/home/ubuntu/projects/lottery/run/gunicorn.sock \
        config.wsgi:application
[Install]
WantedBy=multi-user.target
위에 내용을 그대로 복붙하면 안되고 경로 설정을 다시해주어야 한다.
WorkingDirectory는 manage.py가 있는 프로젝트 디렉토리다.(절대경로로 적을것)
EnvironmentalFile은 아까 만들었던 환경설정 파일의 경로를 넣어준다.
ExecStart는 Gunicorn이 실행되는 위치로 가상환경 폴더에 bin/gunicorn으로 설정한다.
--bind 에는 sudo systemctl start gunicorn 실행시 생성된 gunicorn.sock의 경로를 지정해준다.
6-4. gunicorn 실행해서 gunicorn.sock 생성
*두번째 명령어는 서버 재실행시 자동으로 시작하게 하는 명령어다.
*세번째 명령어는 gunicorn이 정상 작동하는지 확인하는 명령어다.
$sudo systemctl start gunicorn
$sudo systemctl enable gunicorn
$systemctl status gunicorn
7. Nginx 설치
*manage.py가 있는 프로젝트 디렉토리에서 실행
$sudo apt install nginx8. Nginx 설정
8-1. sites-available로 이동 후 파일 생성
*생성하는 파일이름은 본인 프로젝트명으로 하는게 일반적
$cd /etc/nginx/sites-available/
$sudo vi lottery8-2. 아래 내용을 작성
server { 
        listen 8000; 
        server_name 15.164.62.156; 
        location = /favicon.ico { access_log off; log_not_found off; } 
        location /static { 
                alias /home/ubuntu/projects/lottery/static; 
        } 
        location / { 
                include proxy_params; 
                proxy_pass http://unix:/home/ubuntu/projects/lottery/run/gunicorn.sock; 
        } 
}
listen은 접근 포트를 지정하는 것으로 80이 일반적이나 나는 8000으로 설정
서버 이름은 본인 aws 인스턴스의 ip주소를 입력
location / staticc은 static 파일을 모아두는 디렉토리 경로
proxy_pass는 이전에 gunicorn으로 생성해주었던 gunicorn.sock이 위치한 경로로 설정해주면 된다
8-3. sites-enabled로 이동
cd /etc/nginx/sites-enabled/8-4. sites-enabled에 존재하는 default파일 삭제 후 sites-available에서 만든 파일 링크걸기
*enabled와 available디렉토리를 따로 운영하는 이유는 available에 여러개를 등록해 놓고 필요한 것들만 골라서 enabled에 링크를 걸어 관리를 쉽게하려고 운영하는 것
$sudo rm default
$sudo ln -s /etc/nginx/sites-available/lottery9. Nginx 실행
$sudo systemctl restart nginx
10. 접속 확인

'장고' 카테고리의 다른 글
| 장고 ReadOnlyField의 쓰임 (1) | 2022.02.26 | 
|---|---|
| 장고 테스트 케이스 사용법 (0) | 2022.02.14 | 
| Django 시리얼라이저, ReadOnlyField (1) | 2022.02.13 | 
| 하나의 서버에서 2개 이상 django 프로젝트 배포하기 (2) | 2022.02.12 | 
| requirements.txt 만들기 (2) | 2022.02.09 |