Django 프로젝트를 서버에 배포하기 위해서 필요한
모듈은 크게 Nginx / uWSGI / unix socket / 서버 computer가
필요하다.
서버가 구동되는 순서
사용자가 HTTP request를 보내면,
Nginx에서 프로토콜을 받아서 unix socket으로 보내고,
uWSGI에서 이를 해석해서 Django로 보내준다. Django는
기본적으로 python으로 작업되어 서버 컴퓨터가 실행되는
것이다.
AWS 서버 배포 작업
아래 작업은 AWS에서 EC2 인스턴스를 생성한 이후의 과정이다.
AWS EC2 인스턴스 생성 및 탄력적 IP 설정은 다음 글을 참고
하길 바란다.
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가 나는 경우는 다음글을 확인하길 바란다.
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가 자동으로
시작하고, 모니터링이 진행된다.
참고
'Programming' 카테고리의 다른 글
AWS 서버에서 Crontab 작업하는 방법 ubuntu crontab scheduler 사용 (0) | 2022.01.18 |
---|---|
python 코드 20줄로 AWS S3 버킷에 이미지 업로드 하기 (0) | 2022.01.18 |
AWS에 크롬드라이버 설치 selenium 돌리기 (0) | 2022.01.18 |
Django AWS 배포하기 4 (0) | 2022.01.16 |
Django AWS 배포하기 3 (0) | 2022.01.15 |
Django AWS 배포하기 2 (0) | 2022.01.15 |
댓글