새소식

기타

gunicorn + nginx를 이용한 django 서버 배포

  • -

django를 python manage.py runserver 를 이용해서 배포하는 도중 서버가 계속 죽는 문제가 발생했고, 찾아보니 이 명령은 개발용으로만 쓰라는 말이 있어서 gunicorn + nginx 환경으로 다시 세팅했습니다. 환경이 달라서 그런지 설명마다 약간씩 차이가 있었고 안맞는 게 있었는데, AWS + miniconda 환경에 맞춰서 세팅한 사례를 공유해 드리겠습니다. (anaconda 도 동일합니다.)

 

 

1. Gunicorn 패키지 설치

우선 아래 명령으로 gunicorn 패키지를 설치해 줍니다.

pip install gunicorn

 

2. Gunicorn 패키지 설치

그 다음으로 프로젝트에서 settings.py 파일의 끝에 아래 내용을 추가합니다.

추가적으로 settings.py 파일에 "DEBUG = True" 라고 되어있다면 "DEBUG = False"로 바꿔줍니다.

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

 

3. django 초기 설정

아래의 collectstatic을 하게 되면 .static 폴더에 static 파일들이 모아지므로 파일이 겹칠 문제는 걱정하지 않으셔도 됩니다.

# 마이그레이션
python manage.py makemigrations
python manage.py migrate

# admin 사용자 추가
python manage.py createsuperuser

# static 데이터 모으기
python manage.py collectstatic

# 접속 확인
python manage.py runserver 0.0.0.0:8000

 

하나씩 실행해본 뒤 manage.py runserver 명령으로 서버를 띄우고 http://내서버아이피:8000 접속해서 화면이 잘 나오는지 확인합니다. 이 때 static 파일들(js, 이미지 등)은 잘 안나올 수 있습니다. 이는 아래에 설명하는 nginx를 통해 해결 가능하니 잠시 기다려 주세요.

 

django 폴더 구조 캡쳐

4. gunicorn

저의 경우는 위의 이미지의 폴더 구조를 가지고 있어서 아래의 명령으로 구동이 가능했습니다. 폴더명이 다른 경우 "config" 부분을 수정해주세요. 아래 명령으로 구동 후 위처럼 http://내서버아이피:8000 접속해서 내용 나오는지 확인합니다.

(static 파일은 아직 안보일 수 있습니다.)

gunicorn --bind 0.0.0.0:8000 config.wsgi:application

 

확인되면 이제 서비스 등록 스크립트를 만들어 줍니다.

내 django 프로젝트 폴더 하위에 run이라는 폴더를 먼저 만들어 주세요.

 

mkdir run logs

vi /etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/home/ubuntu/my_django_repo
ExecStart=/home/ubuntu/miniconda3/envs/django/bin/gunicorn \
        --workers 3 \
        --bind unix:/home/ubuntu/my_django_repo/run/gunicorn.sock \
        --log-config /home/ubuntu/simplepdf/logs/uvicorn_log.ini \
        config.wsgi:application

[Install]
WantedBy=multi-user.target

 

하고 logs 폴더에 uvicorn_log.ini 파일을 만들어 줍니다.

[loggers]
keys=root

[handlers]
keys=logfile

[formatters]
keys=logfileformatter

[logger_root]
level=DEBUG
handlers=logfile

[formatter_logfileformatter]
format=[%(asctime)s.%(msecs)03d] %(levelname)s [%(thread)d] - %(message)s

[handler_logfile]
class=handlers.RotatingFileHandler
level=DEBUG
args=('logs/myapi.log','a')
formatter=logfileformatter

 

 

저의 경우는 miniconda 라 execstart 부분이 저런데 anaconda 의 경우는 거의 동일하고, 가상환경을 쓰는 경우는 이런 식으로 변경하면 됩니다. "/home/ubuntu/my_django_repo/venv/bin/gunicorn"

 

 

# 서비스 등록
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

# 서비스 구동 확인
systemctl status gunicorn

 

이렇게 됐을 때 구동이 되면, 약간 텀을 두고 8000 포트 접속 시 화면이 나오는 걸 확인할 수 있습니다.

 

 

5. nginx

아래와 같은 nginx 설정 파일을 만들어 줍니다.

vi /etc/nginx/sites-available/mysite.conf

server {
    listen 8000;
    server_name 123.123.456.78;
    charset utf-8;
    client_max_body_size 128M;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /home/ubuntu/my_django_repo;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/my_django_repo/run/gunicorn.sock;
    }
}

 

위 파일에서 /static/ 하위 /home/ubuntu/my_django_repo 는 manage.py 파일이 있는 폴더 경로를 입력해주면 됩니다.

server_name의 경우 해당 서버 IP 또는 도메인 네임을 입력해주면 됩니다. (ex. www.debro.co.kr)  

 

media 폴더를 사용할 경우 아래와 같은 내용을 추가하면 됩니다.

nginx가 /home/ubuntu/my_django_repo 에서 media 라는 폴더를 찾아서 /media/ url 호출 시 사용한다고 보면 됩니다. 

location /media/ {
    root /home/ubuntu/my_django_repo;
}

 

 

 

사이트 추가

sudo ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled

 

nginx 설정 검사 및 재기동

sudo nginx -t
sudo systemctl restart nginx

 

 

방화벽 해제 (AWS는 안해도 되는 것 같습니다.)

sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'

 

진짜 끝!

 

참고자료

https://wikidocs.net/6601

https://wikidocs.net/177312#gunicorn

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.