Django runserver와 gunicorn을 이용한 개방의 차이점
Django를 사용하면서 밥먹듯이 사용했던 python manage.py runserver는 서버를 실행시키는 한가지 방법에 불과한 것이다! 즉 runserver를 통해서 서버를 개방하는 방법과, 배포를 위해서 른 방법으로 서버를 개방하는 방법이 있는데, 여기서 나오는게 Web Server의 개념이다.
Web Server는 request 받은것을 어디로 보낼지, 컨트롤하는 역할을 하게 되는데, 나는 Nginx를 이용하였다. 크게 보는 두 방식의 차이점은 다음과 같다.
runserver -> django 내장. 로컬에서 서버 만들어주는 역할을 하며, 파일 수정시 restart기능, Static file을 자동으로 모아주는 기능 등 개발환경에서 여러가지 도움이 되는 역할을 한다.
gunicorn -> WSGI의 일종으로, Web Server와 Django를 이어주는 역할을 하며, runserver하는것 보다 유용한 역할 (다중 처리, 로깅, 빠른 속도, 보안성)등을 해 줌. 하지만 static file들을 제공하지 못하기때문에, Web Server에서 이는 따로 관리해 주어야 함. (결국 배포시 collectstatic 을 꼭 해주어야 하는 이유와 같음)
Django project 에서 gunicorn과 nginx 의 역할
위 내용과 유사한데,
app <=> Djangp
WSGI(Web Server Gateway Interface) <=> gunicorn
Web Server <=> nginx
이러한 대응관계를 가진다고 생각하면 되겠다.
Django + React + Ngnix 를 docker에 올려 EB를 통해 배포하는 과정에서
"Service:AmazonECS, Code:ClientException, Message:Unknown volume 'null'., Class:com.amazonaws.services.ecs.model.ClientException"
이란 에러를 마주하게 되었다. Dockerrun.aws.json 파일에서 volumes나 mountPoint를 잘못입력했을 경우에 발생한다고 유일하게 EB forum에 글이 있는데, 몇번이고 확인하였지만 그런 사항을 발견하지 못해 현재 여기서 답보중이다. (혹시 server라는 이름을 사용해서 그런것은 아닐지?)
React + Nginx 서버를 구축하였다.
80번 포트의 입력을 Nginx에서 upstream으로 설정하여 접속 확인을 하였다.
Django + Nginx 서버를 구축하였다.
마찬가지로 80번 포트의 입력을 Nginx에서 upstream으로 설정하여 접속 확인을 하였다.
남은일은 2번과 3번을 합쳐 1번의 문제를 해결하는것이다!