본문 바로가기
Programming

웹 애플리케이션 서버 생성 및 배포하기 Nginx uWSGI unix socket django python AWS ubuntu server

by 하하호호 2022. 1. 17.
반응형

 

 

 

Django 프로젝트를 서버에 배포하기 위해서 필요한 

모듈은 크게 Nginx / uWSGI / unix socket / 서버 computer가

필요하다.

 

 

서버가 구동되는 순서

사용자가 HTTP request를 보내면,

Nginx에서 프로토콜을 받아서 unix socket으로 보내고,

uWSGI에서 이를 해석해서 Django로 보내준다. Django는

기본적으로 python으로 작업되어  서버 컴퓨터가 실행되는

것이다.

 

 

 

AWS 서버 배포 작업

 

아래 작업은 AWS에서 EC2 인스턴스를 생성한 이후의 과정이다.

AWS EC2 인스턴스 생성 및 탄력적 IP 설정은 다음 글을 참고

하길 바란다.

 

 

 

Django AWS 배포하기 1

step 1 기존 프로젝트 정리 pip freeze > requirements.txt 현재 프로젝트에서 필요한 모듈들을 requirements.txt 파일에 저장한다. 작업을 완료한 프로젝트 파일을 Git에 push해준다. AWS를 통해 배포하는 작업..

incomeplus.tistory.com

 

 

Django AWS 배포하기 2

requirements.txt 현재 프로젝트에서 필요한 모듈들을 requirements.txt 파일에 저장한다. 작업을 완료한 프로젝트 파일을 Git에 push해준다. AWS를 통해 배포하는 작업.." data-og-host="incomeplus.tistory.com"..

incomeplus.tistory.com

 

 

Django AWS 배포하기 3

requirements.txt 현재 프로젝트에서 필요한 모듈들을 requirements.txt 파일에 저장한다. 작업을 완료한 프로젝트 파일을 Git에 push해준다. AWS를 통해 배포하는 작업.." data-og-host="incomeplus.tistory.com"..

incomeplus.tistory.com

 

 

Django AWS 배포하기 4

Django AWS 배포하기 3 requirements.txt 현재 프로젝트에서 필요한 모듈들을 requirements.txt 파일에 저장한다. 작업을 완료한 프로젝트 파일을 Git에 push해준다. AWS를 통해 배포하는 작업.." data-og-host="i..

incomeplus.tistory.com

 

Step 1. sudo apt update

먼저 sudo 권한으로 apt 저장소를 업데이트 해준다.

 

Step 2. sudo apt install python3-venv

서버에서 가상환경을 만들기 위해서 필요한 python 모듈이다.

 

Step 3. 가상환경 디렉토리 생성

mkdir env : 가상환경 디렉토리 생성

python3 -m venv "env name" : 가상환경 생성

source env/"env name"/bin/activate : 가상환경 activate

 

which python3 명령어를 입력하면 activate된 가상환경의

bin 디렉토리 내의 python3가 작동하는 것을 확인할 수 있다.

 

Step 4. requirements.txt 설치

pip install -r requirements.txt

git repository를 서버에 클론하면  home/user 디렉토리내의

프로젝트 파일을 가져올 수가 있다.

 

프로젝트 파일내에 필요한 모듈을 담은 requirements.txt를

통해 서버에 activate한 가상환경에 필수모듈들을 설치한다.

 

# 주의

psycopg2 install error가 나는 경우는 다음글을 확인하길 바란다.

 

Django AWS 배포하기 3

requirements.txt 현재 프로젝트에서 필요한 모듈들을 requirements.txt 파일에 저장한다. 작업을 완료한 프로젝트 파일을 Git에 push해준다. AWS를 통해 배포하는 작업.." data-og-host="incomeplus.tistory.com"..

incomeplus.tistory.com

 

Step 5. uWSGI 설치

uWSGI를 설치하기 전에 필요모듈을 먼저 설치한다.

 

sudo apt-get install python3.8-dev

sudo apt-get install gcc

pip install uwsgi

 

Step 6. Nginx 설치

sudo apt-get install nginx

 

설치가 다되면 버젼을 확인한다.

Nginx 버젼 확인
nginx -v

Nginx 시작명령
sudo systemctl start nginx

Nginx 중지명령
sudo systemctl stop nginx

Nginx 상태 확인
sudo systemctl status nginx

 

Step 6-1 Nginx web server 환경설정

sudo vim /etc/nginx/sites-available/"PROJECT NAME".conf 파일을

vim으로 열어준다. PROJECT NAME은 Django project에서 

wsgi.py를 담고 있는 디렉토리 명을 입력해준다.

 

sudo vim uwsgi_params

uWSGI 설정 변수들을 미리 설정해준다.

Django 프로젝트의 manage.py 파일이 있는 디렉토리에

저장한다.

 

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

미리 생성한 conf 파일을 sites-enabled 디렉토리에 링크를

생성해준다. Nginx가 실행될 때 참고하는 파일은 sites-enabled기때문에 링크를 동시에 걸어준다.

 

Django project.settings.py에서 STATIC_ROOT를 설정해준다.python3 manage.py collectstatic 명령어로 모든 Non-HTML 파일들을STATIC 디렉토리에 모은다.

 

sudo /etc/init.d/nginx restart

Nginx 서버를 재시작 해준다

 

mkdir media : MEDIA 디렉토리를 따로 생성해준다.

wget https://upload.wikimedia.org/wikipedia/commons/b/b9/First-google-logo.gif -O media/media.gif

MEDIA 디렉토리에 새로운 이미지를 저장한다.

 

이제, 서버 DNS/media/media.gif 로 접속하면, 위키페디아에서 다운받은 1998년 구글 로고를 확인할 수 있다.

 

Step 7. unix socket 설정(feat.  Nginx, uWSGI , Django )

uwsgi --socket microdomains.sock --module microdomains.wsgi --chmod-socket=666

 

STEP 8. uWSGI.ini 설정

위 명령처럼 uwsgi를 실행할 때마다 필요한 내용을 적어줄 수기는 힘들기 때문에, ini파일을 만들어준다.

 

vim microdomains_uwsgi.ini

[uwsgi]
# full path to Django project's root directory
chdir            = /home/ubuntu/microdomains/
# Django's wsgi file
module           = microdomains.wsgi
# full path to python virtual env
home             = /home/ubuntu/env/mokey
# enable uwsgi master process
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /home/ubuntu/microdomains/microdomains.sock
# socket permissions
chmod-socket    = 666
# clear environment on exit
vacuum          = true
# daemonize uwsgi and write messages into given log
daemonize       = /home/ubuntu/uwsgi-emperor.log
~
uwsgi --ini microdomains_uwsgi.ini

uwsgi ini 파일설정을 완료하면 ini파일을 uWSGI에

적용시켜준다.

 

uWSGI ini 적용이 완료되면, uWSGI worker작동내역을

확인할 수 있다.

 

이제, 서버 공개 DNS로 접속하면 Django landing page를

정상적으로 확인할 수 있게 되었다. 앞에서 설명한 바와 같이,

Nginx가 돌아가고, unix socket을 사용해서 uWSGI가 Django로

통신하는 구조가 완성된 것이다.

 

STEP 9. Emperor 모드 적용

uWSGI 옵션 중 하나가 Emperor 모드가 있다.

uWSGI 의 파일을 모니터링하는 역할을 담당한다.

 

cd /home/ubuntu/env/"venv name"/


mkdir vassals


sudo ln -s /home/udoms/microdomains/microdomains_uwsgi.ini
/home/udoms/env/md/vassals/

직전에 만들었던 uwsg.ini파일을 vassals에 

링크를 추가한다.

 

uwsgi --emperor /home/udoms/env/md/vassals --uid www-data --gid www-data

uWSGI를 emperor 모드로 실행한다.

서버가 정상적으로 응답하는 것을 확인할 수 있다.

 

 

sudo vim etc/systemd/system/emperor.uwsgi.service

Emperor 모드를 자동으로 실행하기 위해서,

시스템에 추가해준다.

 

[Unit]
Description=uwsgi emperor for micro domains website
After=network.target
[Service]
User=udoms
Restart=always
ExecStart=/home/udoms/env/md/bin/uwsgi --emperor /home/udoms/env/md/vassals --uid www-data --gid www-data
[Install]
WantedBy=multi-user.target

 

systemctl enable emperor.uwsgi.service
systemctl start emperor.uwsgi.service

등록된 emperor모드를 적용시키고 실행해준다.

 

 

systemctl status emperor.uwsgi.service
systemctl stop emperor.uwsgi.service

emperor 모드 상태를 확인할 수 있고,

중지 할수도 있다.

 

이제 서버를 Reboot해도 uWSGI가 자동으로

시작하고, 모니터링이 진행된다.

 

 

참고

 

 

How to Set Up Django on Nginx with uWSGI - Tony Teaches Tech

Learn how to install and configure a production-ready Python website with Django onan Nginx server with uWSGI.

tonyteaches.tech

 

반응형

댓글