Python 기반의 WebFramework Django를 aws에 디플로이를 할때면 항상 사용하던 웹서버가 있다. 바로 uwsgi 이다.
내 깃허브(github)내의 많은 Django 베이스의 프로젝트가 있는데 그중 99%에 해당하는 프로젝트가.. Django+uwsgi+nginx (+docker) 조합으로 배포를 했고 그만큼 부담없이 많이 사용했었으며, 또 많은 개발자들이 uwsgi를 많이 사용하고 있었고, 그렇기 때문에 나는 아무 생각없이 uwsgi라는 녀석의 성능에 대해서 딱히 검증없이 사용을 했었다.. (무려 5년동안..)
사실 굉장히 고성능의 퍼포먼스가 필요한 API의 경우 Golang의 echo을 써서 대체를 하거나 했기에.. 딱히 uwsgi와 nginx가 붙는 부분을 심도있게, 파고들지 않았던 것도 한몫 했으리라..
각설하고 몇주전에 uwsgi 가 다른 웹서버(gunicorn, cherrypi, Bjoern)들에 비해 굉장히 무겁다는(자원 소모를 많이하고, ram, cpu 사용량이 많다) 얘기를 몇몇 블로그를 통해서 접하였고, 어차피 갈아 엎는 것을 좋아하는 (테스트를 좋아하는) 본인은 한번 사내에서 사용하는 서버에 uwsgi를 사용하지 않고, gunicorn를 적용해보자고 마음 먹었다.(영문 발음으로는 보통 지-유니콘이라고 한다)
몇몇 블로그를 참조해서, 천천히 uwsgi의(악의) 흔적을 지워냈고, 마침내 supervisor+gunicon+nginx를 붙여서 docker화에 성공, 테스트 서버에 디플로이 그리고 몇번의 안정성 테스트를 거친후 운영서버에 안전하게 디플로이를 마무리.. 디플로이를 할때 사용하는 supervisor 역시 gunicorn 과 잘 맞았고, nginx는 더 말할것도 없었다. gunicorn의 컨피그는 간결했고, 몇줄만으로도 바로 디플로이를 시킬 수 있었다.
디플로이 이후 CPU, RAM 사용량 모두 만족할 수준이고 무엇보다도 resp.time이 절반으로 줄었 다는것!
결론 uwsgi → gunicorn으로 웹서버만 바꿨을 뿐인데
newrelic에서 측정되는 resp.time이 “절반”으로 줄었다.
(예를들어 응답시간이 100ms 로 하던 녀석이 50ms로 줄었다는거다)
*정리*
gunicorn 이 빠르고 가볍고, 간단하고 좋다.
모두 지-유니콘(gunicorn) 쓰세요!
PS: 아래 제가 간단하게 django-gunicorn-nginx-docker 예시를 만들어봤습니다. 참고를 해보시면 좋을 것 같습니다.