일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- technical debt
- 동적 프로그래밍
- 김태강
- list of list
- 나는 아마존에서 미래를 다녔다
- 블린이
- 와썹맨
- Unique Paths
- LongestPalindromicSubstring
- 독후감
- BFS
- 트리
- 기술적 채무
- 리트코드
- 삼성인 아마조니언 되다
- 프로그래머스
- 알고리즘
- 규칙없음
- Python
- 파이썬
- 아마조니언
- 리스트의 리스트
- No Rules Rules
- leetcode
- 그거봤어?
- minimum path sum
- Envoy
- mysql #numa #swap #memory
- Dynamic Programmin
- 삼성역량테스트
- Today
- Total
개발자가 되고 싶은 준개발자
wsgi란? 본문
Nginx, Wsgi에 대한 정확한 개념을 모르겠어서 이번 기회에 정리해 보고자 한다.
Wsgi(발음: 위즈기)가 도대체 무엇인가? Wsgi(web server gateway interface)는 web application(ex. Django, Flask...)과 web server(ex. Apache, Nginx...) 간의 통신 규약으로 파이썬 언어로 작성한다.
웹 서버와 웹 어플리케이션이란 무엇인가?
- web server
- 사용자가 브라우저에 URL을 입력하면, 브라우저는 웹 서버에 웹페이지를 보내달라는 요청을 한다.
- 웹 서버는 HTTP 요청을 파싱한 후, 정적 컨텐츠(HTML, CSS, PNG...)을 저장하고 있다가 브라우저에게 보내준다. (대표적으로 Apache, Nginx가 있다.)
- 브라우저와 웹 서버는 HTTP(HyperText Transfer Protocol)로 통신한다. 기본적으로 클라이언트와 서버 간에 요청과 응답이 1:1 구조를 띠고 있어 한 화면을 구성하는 콘텐츠가 100개라면 요청과 응답이 100번 이뤄지게 된다.
- 브라우저의 요청을 가장 먼저 받는 서버로 정적 컨텐츠 응답 이외에도 로드발란싱, 캐싱 등 다양한 기능을 할 수 있다.
- web application: 웹 어플리케이션 서버(WAS)는 웹 서버에서 처리하지 못하는 동적 컨텐츠를 처리해 웹 서버에게 응답한다. 주로 비즈니스 로직을 수행한다. (예. Django, Flask)
왜 웹 서버와 웹 어플리케이션은 별도의 서버로 나누어져 있나?
웹 어플리케이션 서버가 등장하기 이전에는 웹 서버에서 동적 컨텐츠를 처리하기 위해서 자체적으로 process를 fork해서 어플리케이션 코드를 수행했다. 그러나 매 요청마다 process를 fork하게 되면 요청에 대한 응답이 느릴 수 밖에 없다. 이를 방지하기 위해서 웹 어플리케이션 서버를 따로 두고, 동적인 요청은 웹 어플리케이션 서버로 보내서 처리하게 되었다.
웹 어플리케이션 서버를 별도로 두다 보니, 웹 서버와 웹 어플리케이션 서버 간의 통신하는 규칙이 필요했고 그래서 WSGI가 나오게 되었다. WSGI는 여러 종류의 웹 서버(Nginx, Apache)와 여러 종류의 웹 어플리케이션(Django, Flask)이 서로 종속성이 없이 모두 통신이 가능하도록 하기 위해서 만들어졌다. 즉 WSGI 덕분에 web server와 web application은 종류에 상관 없이 중간에 WSGI layer를 두면 통신할 수 있다.
(WSGI에 대한 공식 문서는 PEP 3333에 있다. 이 문서의 요약에서 'This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.'라고 말하고 있다.)
WSGI는 어떻게 구현하는가?
WSGI는 Gunicorn, uWSGI와 같은 WSGI middleware에서 제공하기 때문에 직접 구현하지 않아도 된다. WSGI middleware웹 서버가 브라우저로부터 요청을 받으면 웹 서버는 WSGI middleware에 요청을 전달하고, 미들웨어는 이 요청을 어플리케이션에 전달한다.
(Flask는 이미 WSGI application이다. Flask를 실행하면 사실은 Werkzeug의 developent WSGI Server에서 Flask app을 WSGI Callable로 전달하는 것이다. 하지만 어디까지나 개발용 서버이기 때문에 production 환경에서는 더 안전하고 효율적인 Gunicorn이나 uWSGI로 대체해야 한다.)
Gunicorn에서 제공하는 기능들?
- 디버깅 모드: 코드가 바뀌면 서버를 재시동해준다.
- SSL을 지원한다.
- Worker Process를 여러 개 띠울 수 있다.
자세한 기능들은 아래 공식 문서에 나와 있다.
Settings — Gunicorn 20.1.0 documentation
WSGI에 대한 자세한 동작은 아래 유튜브 영상을 참고하는 것을 추천한다.
(4) WSGI for Web Developers (Ryan Wilson-Perkin) - YouTube
참조
Werkzeug Tutorial — Werkzeug Documentation (2.0.x) (palletsprojects.com)
Web Server Gateway Interface - Wikipedia