웹 서버?, WSGI, 웹 프레임워크?


[오늘 공부 한 것]

요즘 주변에서 “홈페이지 하나 만들어 보려는데 어떻게 해야 해?” 라고 물으면 “Nodejs Express나 Django 프레임 워크를 이용해서 하나 만들어 봐,

장고는 https://tutorial.djangogirls.org/ko/ 요거 보고 따라 해보고~” 이런식으로 이야기를 많이 했다.

정작 나는 웹 서버와 웹 프레임워크, WSGI 개념도 명확하게 안 잡고 혼용해서 써서, 어떨 때는 “저희 서버는 장고 서버 + tornado 서버를 써요~, 거기에 Nginx도 쓰고요~, 배포는 Docker로 해요”. 이런식으로 이야기하고 다닐 떄가 많았는데, 오늘 날 잡고 문서를 읽으니깐, 쥐구멍에 숨고 싶은 심정이다.

장고로 프로젝트를 만들면, python manage.py runserver 이런식으로 서버를 띄운다. 이렇게 하고 도메인이나 ip주소를 치고 들어가면 실제로 홈페이지에 접근이 가능하고, 여러 기능이 동작하는 것을 볼 수 있다. 하지만 만약에 사이트가 위키에 링크가 되거나, 뉴스 기사에 한번 언급되는 순간 바로 서버는 다운 될 것 이다.

장고는 ‘웹 프레임 워크’이며, 하나의 ‘어플리케이션’이다. 여러 사용자들이 동시에 사이트에 접근 할 경우, 이것을 처리하는 것은 ‘웹 서버’의 역할이다. 즉 python manage.py runserver를 하면 웹 서버를 띄우기는 하지만, 단지 개발 테스트 용도로 제공해주는 것이다. 실제 배포 할 경우에는 nginx나 apache 같은 웹 서버가 필요하며, 웹 서버와 파이썬 어플리케이션인 장고가 통신 할 수 있게 하는 WSGI(gunicorn, uwsgi 등)가 필요하다.

파이썬 프로젝트를 생성하면, wsgi.py라는 파일이 있다.

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

application = get_wsgi_application()

여기서 위의 ‘application’이 바로 우리 장고 어플리케이션을 외부에서 사용 할 수 있도록 expose 하는 것이다.

이 wsgi.py 파일 덕분에 우리는 어떤 wsgi를 사용하더라도, wsgi_app = get_wsgi_application()를 통해 외부에서 장고 어플리케이션을 가져와 사용할 수 있는 것이다.

그렇다면 wsgi는 무엇을 사용해야 할까?

지금 운영하고 있는 코드윙즈 서비스는 웹 소켓을 사용해야 하였으므로, tornado의 WSGI Container 기능을 사용했다. torando 또한 웹 프레임 워크로 사용하여 어플리케이션을 정의하고, WSGI는 다른 것(uwsgi, gunicorn)을 사용할 수도 있고(WSGIAdapter를 사용) 또는 다른 웹 프레임워크로 개발한 어플리케이션(장고 등)을 끌어와서 사용할 수도 있다.

다만 torando는 Single Thread 기반이기에, scaling에 취약한 점이 있다. 그러므로 만약에 Multi Threading에서 얻는 강점이, torando의 Non blocking IO에서 얻는 강점 보다 강하다면, Gunicorn이나 uwsgi를 사용하면 된다.

그럼 위에서 언급한 웹 서버는 무엇을 사용해야 할까?

과거에는 Apache가 많이 사용되었으나, Apache는 연결이 늘어나면 프로세스를 포크 하는 방식, Nginx는 Thread를 늘리는 방식이라, 최근에는 Nginx가 많이 사용되고 있다.

Nginx의 경우, Static File에 대한 Serving, Caching, Reverse Proxy, 영구 Redirect, A/B Test등 찾아보면 여러가지 부가적인 기능을 사용할 수 있다. 특히 DDos 공격 등을 막는데도 nginx의 기능을 활용 할 수 있다. 배포하는 서버의 코어 수에 따라 worker process와 connection 갯수를 잘 설정하면 최적의 성능을 얻을 수 있다.

위에 언급한 것들 전부 + Load Balancing, Scaling 등을 직접 하는 것을 IaaS라고 한다. 즉 아마존 웹서비스 등에서 EC2 컨테이너 하나 빌려서, 직접 자기가 nginx, wsgi 설정, load balancer 등을 세팅하는 것이다. 서비스 하나 만들어서 배포하는 것이 이렇게 어렵기에, 요즘은 PaaS라는 개념이 나왔다.

만약에 “나는 python manage.py runserver만 해서 서비스 배포해보고 싶어!” 라고 한다면 Heroku나 아마존 웹 서비스의 Elastic Beanstalk를 찾아보자. Django 프로젝트만 잘 만들어서 올리면 알아서 배포, 로드 밸런싱을 전부 다 해주기에 빠르게 서비스 배포하는데 도움이 될 것 같다.

[틀린 부분이랑 오 개념이 있으면 지적 해주세요]

Back to blog