본문 바로가기
개발/django

django EC2+Nginx+uWSGI 배포하기(2)

by ujin2021 2020. 7. 26.

이번 포스팅은 이전포스팅과 이어집니다.

2020/07/26 - [개발/서버] - django EC2+Nginx+uWSGI 배포하기(1)

 

django EC2+Nginx+uWSGI 배포하기(1)

django rest api를 이용하여 만든 프로젝트를 aws의 ec2와 nginx, uwsgi로 배포하는 방법을 설명하겠습니다. 여러 블로그들을 참고했는데, 몇가지 파일들을 생성하는데 있어서 경로 설정해주는 것들이 다

ujin-dev.tistory.com

이전포스팅에서는 가상환경을 이용하여 uwsgi를 설치하고 실행시켜보았습니다.

실제 nginx와 연동하기 위하여 가상환경을 deactivate시킨 후 아래 내용을 따라해주세요!

 

1. uwsgi를 설치해줍니다.(이전에는 venv에 설치했기 때문에, 시스템 전역에 다시 설치해줍니다)

 

~$ sudo apt-get isntall python3-dev python3-pip python3-setuptools
~$ sudo -H pip3 install --upgrade pip
~$ sudo -H pip3 install wheel
~$ sudo -H pip3 isntall uwsgi

 

2. uwsgi 서비스 등록 스크립트 생성

아래와 같은 경로에 uwsgi.service 파일을 생성해줍니다. 전원을 켜고 부팅이 되는 과정에서 시스템을 초기화 하고 기타 서비스를 위한 환경을 조성 및 시작시켜주는 일을 합니다. 이 설정이 되어야 24시간 실행됩니다.

 

~$ sudo vi /etc/systemd/system/uwsgi.service 

 

아래 내용을 입력해 줍니다.

 

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target

 

[Service]부분에서 ExecStart = [uwsgi경로] --emperor [.ini 파일을 생성할 경로]

uwsgi경로는 ~$ whereis uwsgi 명령어로 확인 할 수 있습니다.

이 부분 외에는 같게 넣어주셔도 됩니다.

 

저장한후 아래 명령어를 입력해 줍니다. 명령어 입력 후 Created~ 와 같은 글자가 뜨면 등록된 것입니다.

 

~$ sudo systemctl enable uwsgi
Created symlink ~~~~~

 

3. uwsgi 옵션파일 생성

여러 app의 .ini파일을 한 디렉토리에 모아 관리합니다. 

 

~$ sudo mkdir -p /etc/uwsgi/sites
~$ sudo vi /etc/uwsgi/sites/Closet.ini

 

mkdir로 sites 디렉토리를 생성 후(-p 옵션은 상위경로도 함께 생성한다는 뜻, 아까 service파일의 --emperor 이후 경로입니다),

Closet.ini 파일을 생성합니다.([project_name].ini 로 파일명을 설정해 주었는데, 파일명을 자유롭게 설정하셔도 됩니다.)

아래 내용을 추가합니다.

 

[uwsgi]
uid = ubuntu
project = Closet
app = accounts
base = /home/ubuntu/srv

chdir = %(base)/%(project)
home = %(base)/venv
module = %(project).wsgi:application

master = true
processes = 5

max-requests = 6000
max-requests-delta = 300

thunder-lock = true
enable-threads = true

hirakiri = 160
logto = /home/ubuntu/srv/Closet/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
socket = /home/ubuntu/srv/Closet/Closet.sock
chown-socket = ubuntu:ubuntu
chmod-socket = 666
vacuum = true

 

uid에는 사용자 명을 적어주었습니다.

chdir에는 manage.py 가 들어있는 프로젝트 경로

home에는 venv경로

module에는 [wsgi.py가 있는 곳].wsgi:application

을 넣어줍니다.

 

master는 true로 설정해주시고, processes의 수는 마음대로 정해주세요(코어 수 보다 많게도 가능합니다)

thunder-lock, enable-threads 설정은 이전 포스팅에서 venv환경에서 실행시킬 때 disalbed되어 있었기 때문에 설정으로 넣어주었습니다.

 

uwsgi의 log를 찍을 파일의 경로를 logto 에 적어주시면 됩니다.(자기마음) 저는 로그를 확인하기 쉽게 날짜를 log파일 이름으로 넣어주었습니다.

socket의 위치도 알아서 적어주세요! (저는 그냥 wsgi.py와 같은 경로에 추가했습니다)

.sock의 owner와 mod도 바꿔줘야합니다.

vacuum 은 true로 설정해주세요

 

4. nginx 설치 및 설정

 

~$ sudo apt-get install nginx
~$ sudo vi /etc/nginx/sites-available/Closet

 

nginx설치 후 sites-available 하위에 [project_name](이름 상관 없음) 파일을 하나 만들어주고 아래 내용을 적어주세요.

 

server {
        listen 8000;
        server_name [ec2 dns];

        location = /favicon.ico { access_log off; log_not_found off; }
        location / {
                include uwsgi_params;
                uwsgi_pass unix:/home/ubuntu/srv/Closet/Closet.sock;
        }
}

 

django의 기본 포트번호인 8000을 사용할 것이기 때문에 listen에 8000을 적어주었습니다.(각자 사용하는 포트번호를 적어주시면 됩니다)

server_name 뒤에는 각자의 ec2 dns (ec2-~~) 주소를 적어주면 됩니다.

uwsgi_pass 에서는 unix: 뒤에 아까 .ini 파일에서 socket= 하고 적어주셨던 .sock 파일의 경로를 적어주시면 됩니다.

이외에는 같에 적어주시면 될거같아요!

 

sudo ln -sf /etc/nginx/sites-available/[방금작성한 파일명] /etc/ngin/sites-enabled/[방금작성한 파일명]

 

위의 파일을 저장 후 파일 링크를 sites-enabled에 생성합니다.

 

5. 실행

 

~$ sudo service uwsgi start
~$ sudo service nginx start

 

명령어 입력후 dns주소:포트번호 에 접속하시면 django로 만든 사이트를 확인할 수 있습니다.

 

만약 파이썬 코드를 수정했다면, uWSGI를 재가동 시켜주어야 합니다.

~$ sudo systemctl restart uwsgi

nginx 의 문법검사 및 재가동

~$ sudo nginx -t
~$ sudo systemctl restart nginx

 

이렇게 uwsgi와 nginx를 사용하여 배포하는 방법을 알아보았는데요,

다음 포스팅에서는 몇가지 오류들에 대한 해결방법들, status확인하는 것을 알아보겠습니다!

감사합니다.

 

틀린내용이 있을 수 있습니다. 댓글로 알려주세요!

'개발 > django' 카테고리의 다른 글

django EC2+Nginx+uWSGI 배포하기(3)  (0) 2020.07.26
django EC2+Nginx+uWSGI 배포하기(1)  (1) 2020.07.26