Flask Server
Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
- Flask 서버를 실행하게 되면 Production환경에서는 사용하지 말라는 문구를 볼 수 있다. 대신에 WSGI 서버를 사용하라고 한다. Flask는 기본적으로 Werkzeug를 사용함.
- 왜 Flask 내장 서버를 사용하지 말아야 할까?
- 기본적으로 한번의 둘 이상의 요청을 처리하지 않는다.
- 서버 확장이 힘들다.
웹 아키텍처
Web Server
- 클라이언트가 요청한 웹 컨텐츠를 전달. 정적인 콘텐츠(HTML pages, files, images, videos 등) 요청을 처리한다. Apach HTTP Server, Nginix 등이 있다.
- WAS의 부담을 줄이기 위해 웹서버를 별도로 운영.
Apache
- 메모리 부족: connection이 연결될 때마다 프로세스를 생성
- 무거운 프로그램: 확장성이 좋다는건 곧 리소스가 않다는 걸 의미
- CPU 부하 증가: 많은 connection 요청이 들어오면 context switching을 많이 하기에 CPU 부하가 증가
- 수많은 컴퓨터가 보급됨에 따라 서버에 동시에 연결 된 connection이 많을때 더이상 새로운 connection을 생성하지 못하게 되었다. 그로인해 Nginx가 등장하게 된다.
Nginx
- 설정에 따라 master process는 worker process를 생성하고 worker는 소켓을 통해 요청을 받아 connection을 생성하고 이벤트를 처리한다.
- 이벤트는 queue형식으로 worker에게 전달되어 처리된다.
성능비교
WSGI(Web Server Gateway Interface)
- WSGI는 웹 서버와 통신하기 위한 일종의 통신 규약이며 주로 파이썬으로 구성된 Web application과 웹 서버의 통신을 위해 사용된다. Bjoern, CherryPy, Meinheld, uWSGI, Gunicorn, mod_wsgi 등이 있다.
WSGI의 등장
- 클라이언트로부터 오는 HTTP 요청을 파이썬 스크립트가 요구하는 데이터 형식으로 변환하고 응답을 돌려줄 때도 파이썬 데이터를 HTTP 형식으로 바꿔주는 작업이 필요한데, 이 때 파이썬 앱 서버가 동작하는 기본적인 방식이 CGI(Common Gateway Interface)이다. 그런데 CGI 방식은 한 가지 문제점이 있었다. 요청이 들어올 때마다 파이썬 스크립트를 처음부터 실행한다는 것이었다. 이로인해 WSGI가 등장하게 되었다.
- WSGI 방식은 요청을 받으면 필요한 로직 하나만 실행한 후 결과를 응답하는 식으로 동작함으로써 동적인 콘텐츠에 대한 요청에 빠르게 응답할 수 있게 되었다.
WAS(Web Application Server)
- 웹 서버에서 처리하지 못하는 동적 컨텐츠를 처리해 웹 서버에게 응답한다. 주로 비즈니스 로직을 수행한다. Django, Flask 등이 있다.
정리
- WSGI는 왜 필요한가?
- 웹 앱에 HTTP 요청을 전달하고 응답을 되돌려주는 일을 할 WSGI server의 역할을 하기 위해서
- Web server는 왜 필요한가?
- reverse proxy server, load balancer 등의 역할을 수행하기 위해서
- Django/Flask는 왜 필요한가?
- WSGI compatible server를 알아서 제공하고 기본적인 부분이 구현되어 있어 필요한 기능을 사용하기 위해서
- 그럼 그냥 프레임워크 서버를 웹 서버로 사용하면 되지 않을까?
- 그래도 안될 건 없다. 하지만 보통은 그러지 않는다. 프레임워크가 제공하는 서버는 실제 트래픽에 대응할 수 없고 여러부분에서 빈약하기 때문이다.
- WSGI만 사용해도 돼? 응.
- 다만 Web Server가 제공하는 기능을 사용할 수 없을 뿐이다.
- Web Server만 사용해도 돼? 응.
- WSGI가 제공하는 기능을 사용할 수 없을 뿐이다.
Reference
Playground
Ahzick
개발자가 되고 싶은 준개발자
jimin_lee.log