플라스크나 장고를 이용해 서버를 만들고나서 python manage.py runserver나 python app.py로 서버를 실행했다고 합시다. 위의 방식으로 서버를 실행하는 건 프로덕션용이 아니기 떄문입니다. 플라스크 앱을 위처럼 실행시키면 프로덕션에서 사용하지 말라는 경고가 나오죠. 이번엔 플라스크 앱을 프로덕션용으로 만들기위해 필요한 것 중 하나인 WSGI에 대해 알아보죠.
WSGI는 Web Server Gateway Interface의 약자입니다. 이름에서 보이듯 WSGI는 구현체가 아닌 인터페이스입니다. 웹서버와 파이썬으로 구현한 웹 어플리케이션 서버가 통신하기 위한 규약이죠. 쉽게는 HTTP 메세지를 파이썬 call로 변환하는 것이고 자세한 내용은 PEP333에 잘 정의되어 있습니다. 즉, 웹서버와 파이썬 어플리케이션 서버 사이에 wsgi middleware라고 불리는 wsgi 구현체가 중간에 끼게되는거죠. 그렇다면 유저로부터 온 요청은 이렇게 처리됩니다.
http 요청 (from 유저) -> 웹서버 (nginx, apache) -> if static: static 파일 응답 / else: wsgi(uwsgi, gunicorn) -> was (flask, django) -> reponse -> wsgi -> 웹서버 -> 유저
대표적인 wsgi 구현체로는 gunicorn과 uwsgi 가 있습니다. gunicorn은 간단하고, 서버의 리소스를 적게 쓰고 꽤 빠르다고 하고, uwsgi는 좀 더 하드한 서비스를 위해 디자인되었다고 합니다. 벤치마킹 결과를 보면 uwsgi의 성능이 더 좋아보입니다. 아무래도 pure C로 구현되었기도 하고 목적 자체가 좀 더 하드한 서비스를 위한 것이라 그런걸까요.
uwsgi 가 다른 웹서버(gunicorn, cherrypi, Bjoern)들에 비해 굉장히 무겁다는(자원 소모를 많이하고, ram, cpu 사용량이 많다) 얘기를 몇몇 블로그를 통해서 접하였고, 어차피 갈아 엎는 것을 좋아하는 (테스트를 좋아하는) 본인은 한번 사내에서 사용하는 서버에 uwsgi를 사용하지 않고, gunicorn를 적용해보자고 마음 먹었다.(영문 발음으로는 보통 지-유니콘이라고 한다)
gunicorn으로 웹서버만 바꿨을 뿐인데
newrelic에서 측정되는 resp.time이 “절반”으로 줄었다.
(예를들어 응답시간이 100ms 로 하던 녀석이 50ms로 줄었다는거다)
gunicorn 이 빠르고 가볍고, 간단하고 좋다.
- 보통 퍼포먼스를 보면 아무래도 pure C기반의 uwsgi가 pure python인 gunicorn보다 빨라보입니다. 간혹 uwsgi가 느리다는 비교가있는데 이는 gunicorn은 워커를 gevent로 하면 몽키패치를 지가 app서버에 해버리는데 반해 uwsgi는 app서버 코드에 몽키패치를 해줘야함을 모르고 테스트할 결과로 보여지네요.
- 사용성 측면에서 uwsgi가 좀더 복잡하고 코어 갯수에 따라 configure를 잘못하면 오히려 성능저하가될 우려가 보이네요.
- 도큐먼트는 gunicorn이 훨깔끔
*참고로 gunicorn, uwsgi모두 앞단에 nginx를 쓰는케이스가 많이 있습니다. 이는
DDos 공격방지, static file전송 효율성등때문이라고 합니다. 그리고 gunicorn document에서도 말하고 있는 nginx buffering기능때문입니다.
nginx에도 설명이 잘나와있지만 nginx buffering에 대해 좀더 설명하자면,
client - nginx - app servers
이 구조에서 client에 response를 전송하는데 nginx buffer가 없고 클라이언트가 response 패킷을 천천히 받으면 그 영향이 app server한테까지 끼쳐서 그 process는 블락이되어 다른 패킷을 처리 못하게 됩니다.
하지만 nginx buffer가 있다면 nginx는 app server에게 response패킷을 모두 받을때까지 client에게 응답하지 않고 app server에게 다 받은후 client에게 응답을 보냅니다. 따라서 slow client를 만나더라도 app server는 블락이 되지않을 수 있는것이죠.
'Machine Learning > 파이썬 Python' 카테고리의 다른 글
파이썬 가상환경 차이 - virtualenv / pyenv / venv / pipenv / conda -miniconda, anaconda (0) | 2022.04.18 |
---|---|
Django vs Flask (0) | 2022.04.18 |
pyarrow, parquet 파케이 파켓 (0) | 2022.01.27 |
미운코딩새끼 파이썬 기초 필기 - 자료형, 문자열, 리스트 (0) | 2021.02.01 |