본문 바로가기

Django

서버 배포 하기

이 글은 AWS EC2 ubunto 20.x 버전에 django 프로젝트를 배포하는 글이다. os의 종류나 버전에 따라 경로가 다를 수 있으니 자신의 경로에 맞게 사용하면 된다.

EC2 우분투는 /home/ubuntu/ 를 기준으로 한다.
유저는 ubuntu

 

1. 배포 준비

 

A) 프로젝트 폴더로 이동해서 아래 명령을 실행

 

pip3 freeze >> requirements.txt

 

B) Setting.py 파일 수정

 

ALLOW_HOST에 서버 주소나 도메인을 추가한다.

 

ALLOWED_HOSTS = [
    "192.168.0.1",
    "localhost",
    "naver.com",
]

 

 

그리고 static 파일이 빌드될 위치를 설정한다. static 파일은 나중에 서버에 올리고 생성하여 nginx에 연결해야 하니 위치를 잘 기억해두기 바란다.

 

STATIC_ROOT = os.path.join(BASE_DIR, ".static")

 

 

C) 수정사항을 커밋 후 깃허브로 푸시

 

이 글에서는 깃허브 브런치를 가지고 서버에 배포할 계획이다. 

 

git push origin main

 

 

이후 개발하거나 라이브러리를 추가하게되면 1번을 다시 실행 후 서버에 푸시 한다.

 

 

 


 

2. 서버 셋팅

 

A) 필요한 라이브러리 설치

 

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install python3-pip

 

B) 프로젝트 폴더 생성

 

프로젝트 폴더는 본인이 마음에 드는 것으로 해도 상관 없다. 이 글에서는 /home/ubuntu/app/ 에 프로젝트를 생성하겠다.

 

mkdir app

 

C) App 폴더에 깃허브에 올린 프로젝트를 받아온다

 

올바른 경로 : /home/ubuntu/app/project/

 

우분투에 깃허브 연동하기 : https://velog.io/@loakick/2019-11-19-0011-%EC%9E%91%EC%84%B1%EB%90%A8-2ck34lupye

 

D) 프로젝트 폴더로 이동 후 가상환경 셋팅

 

여기서는 venv를 이용

 

cd project/
python3 -m venv venv
source venv/bin/activate

 

 

E) 라이브러리 인스톨

 

pip3 install -r requirements.txt
mysql 오류 발생시 https://stackoverflow.com/questions/70315196/unable-to-install-mysqlclient-with-pip-on-ubuntu

 

F) key 파일 추가

 

따로 키파일이 있으면 복사

 

 

 

G) 파이썬 static 파일 생성

 

python manage.py collectstatic
python manage.py collectstatic --settings=config.settings.dev

서비스에서 사용하는 정적 파일을 생성한다.

따로 셋팅 파일을 분리했을 경우 아래 명령을 이용

 

 

H) 로그 폴더 생성

 

mkdir config/logs

 

 

I) 서버 실행 테스트

 

python manage.py runserver 0:8080
python manage.py runserver 0:8080 --settings=config.settings.dev

따로 셋팅 파일을 분리했을 경우 아래 명령을 이용

 

 

 

 

만일 서버 배포 이후 파이썬 라이브러리가 추가되면 1 > A 를 실행 후 2 > E를 실행한다.
static 파일, css나 js 이미지 등 서비스에서 사용하는 정적 파일이 추가된 경우 2 > G 를 실행한다

 

 

 


 

3. uWSGI 설치

 

A) 가상환경 실행 후

 

서버에서 가상 환경 실행 후 uwsgi를 설치한다

pip3 install uwsgi

 

 

B) 실행 테스트

 

uwsgi --http :8000 --home /home/ubuntu/app/project/venv/ --chdir /home/ubuntu/app/project/ -w config.wsgi

--home : 가상 환경 경로

--chdir : 프로젝트 경로

--w : 프로젝트의 wsgi.py 위치, 만일 자신의 파일이 project/config/wsgi.py 라면 위와 같이 적으면 됨

 

서버 주소:8000으로 접속해서 재대로 나오는지 테스트 한다. 보통 재대로 안나오면 경로가 잘못된 것임

 

 

C) uwsgi 설정파일 생성하기

 

아래 경로에 설정 파일을 생성한다.

/home/ubuntu/app/config/uwsgi/mysite.ini
[uwsgi]
chdir = /home/ubuntu/app/project/
module = config.wsgi:application
home = /home/ubuntu/app/project/venv/

uid = ubuntu
gid = ubuntu

socket = /tmp/mysite.sock
chmod-socket = 666
chown-socket = ubuntu:ubuntu

enable-threads = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/project/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true

 

 

 

D) uwsgi 로그 폴더 생성

 

sudo mkdir -p /var/log/uwsgi/project
sudo chown -R ubuntu:ubuntu /var/log/uwsgi/project/

 

E) 실행 테스트

 

sudo /home/ubuntu/app/project/venv/bin/uwsgi -i /home/ubuntu/app/config/uwsgi/mysite.ini

 

 

F) 로그 확인하기

 

sudo tail -f /var/log/uwsgi/project/2020-03-15.log

 

 

 

오류 발생 시

이 부분에서 대부분의 오류가 발생하는데 파이썬 모듈을 찾을 수 없다거나 페이지가 올바로 표시되지 않는다면 위에 작성한 경로가 올바르지 않은 경우가 대부분이다. 자신의 가상환경의 경로나 설정파일들의 경로를 확인하면서 디버그를 하면 된다.

2번 실행 테스트와 5번 실행 테스트를 순차적으로 실행하면 문제 해결에 도움이 될 것이다.

 

 

 

 

 


 

4. nginx 연결

 

A) nginx 설치

 

sudo apt-get install nginx

 

B) nginx 사용 유저 설정

 

sudo vi /etc/nginx/nginx.conf
user ubuntu; <---------- 이 부분을 ubuntu로 설정
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
 
events {
        worker_connections 768;
        # multi_accept on;
}
 
http {
 
        ##
        # Basic Settings
        ##
.... 중략

 

C) nginx 설정 파일 생성

 

/home/ubuntu/app/config/nginx/mysite.conf
server {
    listen 80;

    server_name domain.com;

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

    charset utf-8;
    client_max_body_size 20M;

    large_client_header_buffers 4 16k;

    location / {
        uwsgi_pass  unix:///tmp/mysite.sock;
        include     uwsgi_params;
    }

    location /static/ {
        alias /home/ubuntu/app/project/.static/;
    }

    location /uploads/ {
        alias /home/ubuntu/app/project/config/uploads/;
    }
}

여기서 조심해야할 부분이 location /static/ 부분과 upload 부분이다. 해당 경로가 올바르지 않으면 사이트 접속시 css 나 이미지가 올바로 표시 되지 않는다.

 

django static https://ssilook.tistory.com/entry/DJANGO-%EC%9E%A5%EA%B3%A0-STATIC-%EC%A0%95%EC%A0%81%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0
django uploads https://velog.io/@jimin_lee/Django-Template%EC%9C%BC%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

 

 

D) uwsgi service 파일 생성

 

/home/ubuntu/app/config/uwsgi/uwsgi.service
[Unit]
Description=uWSGI service
After=syslog.target
 
[Service]
ExecStart=/home/ubuntu/app/project/venv/bin/uwsgi -i /home/ubuntu/app/config/uwsgi/mysite.ini
 
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
 
[Install]
WantedBy=multi-user.target

 

 

E) uwsgi.service 파일을 데몬에 등록

 

sudo ln -f /home/ubuntu/app/config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service

 

 

 

F) uwsgi 재실행

 

sudo systemctl enable uwsgi && sudo systemctl restart uwsgi

 

 

G) nginx 설정 파일을 nginx 어플리케이션에 등록

 

sudo cp -f /home/ubuntu/app/config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf

 

복사된 파일을 sites-enables 폴더 안에 링크

 

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

 

기본 파일 삭제

 

sudo rm /etc/nginx/sites-enabled/default

 

 

H) 데몬 리로드

 

sudo systemctl daemon-reload && sudo systemctl restart nginx uwsgi

 

 

I) 서버에서 80포트를 안열었다면 열어준다