WSGI는 Django와 웹 서버를 연결해 주는 역할을 한다. 웹 서버에서 받은 요청을 Django로 넘겨 주고, Django의 응답을 다시 웹 서버로 넘겨 주는 것이다. 나는 Che1's Blog를 따라 그 중에서도 기능이 강력하고 확장성이 뛰어나다는 uWSGI를 사용하였다.
uWSGI 설치
보안 상 기능별 서버의 유저를 따로 두는 게 좋다고 한다. 그렇기 때문에 ssh 를 통해 서버에 접속한 뒤 다음 명령어로 deploy 라는 새로운 유저를 만들어 준다.
•
유저 생성 (다른 설정들은 그냥 default로 입력해도 된다.)
sudo adduser deploy
Plain Text
복사
•
uWSGI를 위한 가상 환경 생성
pyenv virtualenv 3.7.3 uwsgi-env
Plain Text
복사
•
uWSGI 설치
pyenv shell uwsgi-env
pip install uwsgi
Plain Text
복사
uWSGI 실행
이제 다음과 같은 명령어로 uWSGI 실행이 가능하다.
uwsgi \\
--http :8080 \\ # 포트 번호
--home /home/ubuntu/.pyenv/versions/[PROJECT_VIRTUALENV_NAME] \\ # 가상환경 경로
--chdir /srv/[PROJECT_PATH] \\ # manage.py 파일이 있는 프로젝트 경로
-w [PROJECT_NAME]/wsgi.deploy # wsgi 모듈명(?)
Plain Text
복사
ini 파일로 uWSGI 실행
하지만 저 길고 복잡한 코드를 매번 실행하는 것은 인생 낭비의 아주 좋은 예이다. 다행히도 그럴 필요 없이, 옵션을 ini 파일로 저장해놓고 실행할 때마다 불러올 수 있다. 이제 미리 만들어 놓았던 .config/uwsgi/[PROJECT_NAME].ini 파일을 다음과 같이 수정하자.
[uwsgi]
chdir = /srv/[PROEJCT_NAME] # manage.py 파일이 있는 프로젝트 경로
module = [PROJECT_NAME].wsgi.deploy:application # wsgi 모듈 파일 경로
home = /home/ubuntu/.pyenv/versions/[VIRTUAL_ENV_NAME] # Django 프로젝트 가상환경 경로
uid = deploy # uWSGI를 실행시킬 사용자
gid = deploy # uWSGI를 실행시킬 사용자 그룹
http = :8080 # http를 통해 요청받을 포트 번호
enable-threads = true # 스레드 사용 여부(?)
master = true # 마스터 프로세스 사용 여부(?)
vacuum = true # 실행 시 자동 생성되는 파일들을 종료 시 삭제
pidfile = /tmp/[PROJECT_NAME].pid # pidfile 이 생성될 경로
logto = /var/log/uwsgi/[PROJECT_NAME]/@(exec://date +%%Y-%%m-%%d).log # 로그 파일이 생성될 경로
log-reopen = true # uWSGI를 실행할 때 로그 리오픈
Plain Text
복사
해당 파일을 서버에 업로드한 후, logto 에 지정한 경로를 직접 생성해주어야 한다.
sudo mkdir -p /var/log/uwsgi/[PROJECT_NAME]
Plain Text
복사
이제 다음의 명령어를 통해 ini 파일로 uWSGI를 실행할 수 있다. 사실 아직까지 길고 복잡한 건 똑같다.
sudo /home/ubuntu/.pyenv/versions/uwsgi-env/bin/uwsgi -i /srv/[PROJECT_NAME]/.config/uwsgi/[PROJECT_NAME].ini
Plain Text
복사
log 파일은 다음의 경로에서 확인할 수 있다.
sudo cat /var/log/uwsgi/[PROJECT_NAME]/[LOG_FILE_NAME].log
Plain Text
복사
E.O.D.