가상 머신에 ubuntu를 설치해 로컬 환경이 아닌 서버 환경에서 웹 브라우저의 동적 파일과 정적 파일에 대한 요청을 처리하도록 할 것이다.
무슨 이유에선지 virtualbox 가상 머신은 오류가 떠서 UTM을 사용했다. 22.04 버전의 경우 firefox 웹 브라우저에서 호환 충돌이 발생해 UTM에서 사용한 ubuntu 환경은 20.04 버전을 사용했다.
ubuntu는 리눅스 배포판의 일부다.
유튜브에 외국인 설치 잘 함. 따라서 함.
$ sudo hostnamectl set-hostname jumpto
$ sudo reboot
$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$ sudo apt install python3
$ sudo apt install python
$ sudo apt install python-minimal
$ sudo apt update
$ sudo apt install python3-venv
$ mkdir projects
$ mkdir venvs
$ cd venvs
$ python3 -m venv mysite
$ source mysite/bin/activate
(mysite) ... $ pip install wheel
$ pip install django==4.0.3
$ pip install markdown
$ cd projects
$ git clone <깃허브 원격 저장소 주소>
$ cd mysite
$ python manage.py runserver
이 상태에서 본인의 고정 아이피에 포트를 브라우저에 치면
(퍼온 사진) settings.py에 ALLOWED_HOSTS를 설정해야 한다고 한다.
로컬 환경에서 ALLOWED_HOSTS를 수정해준 후 깃헙에 올리고 서버 환경에서 git pull로 내용을 가져온다.
그러면
ALLOWED_HOSTS를 수정했지만, 서버 환경과 달리 로컬 환경에서는 오류가 뜬다. ALLOWED_HOSTS에 고정 ip를 등록했기 때문에 localhost로 요청하면 오류가 뜰 수밖에 없다. 그렇다고 다시 이전으로 수정하면 로컬에서는 돌아가지만 서버 환경에서 오류가 뜰 것이다. 로컬 환경과 서버 환경을 나눠야하는데, 따라서 settings.py를 분리해 관리해야 한다.
$ cd config
$ mv settings.py settings/base.py
settings 디렉토리라는 레이어가 하나 더 생겼기 때문에 BASE_DIR에 parent를 하나 더 추가시킨다.
settings/local.py의 내용. base.py를 상속하고 ALLOWED_HOSTS는 기존의 것처럼 비워둔다.
settings/prod.py의 내용. base.py를 상속하고 ALLOWED_HOSTS는 고정 ip를 등록한다.
$ mysite
$ python manage.py runserver --settings=config.settings.local
$ python manage.py runserver --settings=config.settings.prod
로컬 환경에서는 정상적으로 prod.py 세팅은 작동되지 않는다.
# .zshrc
alias mysite='export DJANGO_SETTINGS_MODULE=config.settings.local; cd /Users/pahkey/projects/mysite;source /Users/pahkey/venvs/mysite/bin/activate'
mysite 명령으로 가상 환경 진입할 때 로컬 환경이라는 거 알려주기.
$ sudo vi /home/mingi/.profile
alias mysite='export DJANGO_SETTINGS_MODULE=config.settings.prod;cd ~/projects/mysite;. ~/venvs/mysite/bin/activate'
로컬 환경 설정과 마찬가지로 alias를 이용한다.
mysite 명령으로 가상 환경 진입할 때 서버 환경이라는 걸 알려준다.
웹 브라우저가 웹 서버에 요청하는 페이지는 동적, 정적으로 나뉜다.
정적 페이지 요청은 정적 파일을 읽어서 그대로 응답해주면 된다.
동적 페이지 요청은 웹 서버가 파이썬 프로그램을 호출한다. 그러나 웹 서버에는 파이썬 프로그램을 호출하는 기능이 없다. 따라서 파이썬 프로그램과 같은 동적 파일을 호출하는 위스키 서버가 필요하다. 동적 요청이 발생하면 웹 서버가 위스키 서버를 호출하고, 위스키 서버는 Django의 파이썬 프로그램을 호출해 동적 요청을 처리한다.
위스키 서버로 gunicorn
을 사용할 것이고 웹 서버로 nginx
를 사용할 것이다.
$ pip install gunicorn
위스키 서버는 로컬 환경이 아닌 우분투, 서버 환경에서 설치한다.
$ gunicorn --bind 0:8000 config.wsgi:application
정적 파일은 읽지 못한 모습
리눅스 시스템에서 포트 보다는 유닉스 소켓 서비스가 빠름
$ gunicorn --bind unix:/tmp/gunicorn.sock config.wsgi:application
소켓 방식으로는 단독으로 구니콘 서버에 접속해 동적 파일만을 읽어올 수 없다. 이 방식은 구니콘 서버와 동반해 엔진엑스와 같은 웹 서버가 함께 필요하다.
구니콘을 서비스로 등록한다. 구니콘 서버의 시작, 스톱, 재시작 등의 제어를 편리하게 하기 위해서다.
구니콘이 서비스로 실행된다면 환경 변수 파일에 DJANGO_SETTINGS_MODULE을 한 번 더 써줘야 한다.
시스템 디렉토리에 관리자 권한으로 mysite.service 파일을 작성한다.
$ sudo systemctl start mysite.service
서비스 시작
$ sudo systemctl status mysite.service
서비스 상태
$ sudo systemctl enable mysite.service
서비스 자동 실행 상태 옵션
running 상태로 서비스가 돌아간다.