Django와 Flask를 활용한 프로젝트 개발 경험이 다수 존재하지만, 실제 서비스화 할 계획은 없었던 프로젝트들이라 전부 Django와 Flask의 내장 서버만 활용해서 개발을 진행했었다.
연습 삼아 AWS 배포할 때도 내장 서버만을 사용했다
하지만 이렇게 당장 돌아가는 서버를 구현하는데 급급했던 사람들도 다 알고 있듯, run server
시에는 아래와 같은 경고가 뜬다.
Flask
의 app.run()
함수를 까보면 다음과 같은 주석을 확인 할 수 있다.
Do not use ``run()`` in a production setting. It is not intended to
meet security and performance requirements for a production server.
즉, 보안과 성능상에 문제가 있을 수 있으니 app.run()
을 실제 서비스 배포에는 사용하지 말라는 뜻이다.
지금의 나는 저 충고의 의미를 알고, 그리고 서버 배포시엔 어떤 서버 구조를 가져야하는지 알고 있지만 당시의 나는 전혀 알지 못했고 이해할 시도조차 하지 않았다.
과거의 나 같은 사람도 분명 있을 것이란 생각을 바탕으로 ~ ~ 간략하게나마 정리를 해보려고 한다 🐳
서버는 보통 위와 같은 구조를 가진다.
여기서 NGINX가 웹 서버의 역할을, uWSGI가 WSGI 서버의 역할을, Django가 웹 애플리케이션이 되는 것이다.
아래의 내용은 참조 블로그1와 참조 블로그2, 참조 블로그 3을 학습한 내용이다! 좀 더 자세한 내용은 해당 블로그에서 확인해도 좋을 것 같다:)
웹 서버는 클라이언트와 가장 가까운 곳에 존재한다!
HTTP 프로토콜을 통해 "클라이언트의 Request"를 받아, 정적 컨텐츠를 제공하는 서버이다. 여기서 정적 컨텐츠란 HTML, CSS, 이미지 등과 같이 사용자마다 따로 처리해줄 필요 없이 즉시 응답이 가능한 컨텐츠를 의미한다.
웹 서버와 웹 어플리케이션(Django, Flask..) 사이에서 데이터를 주고 받는 방식 혹은 컨벤션을 CGI라고 한다. 정적인 컨텐츠를 제공하는 웹 서버를 동적으로 기능하게 만들기 위해 사용한다. 들어온 요청을 연결해주는 역할만하고, 웹 서버가 프로그램을 직접 실행하는 구조가 되는 것이다.
웹 서버와 웹 프레임워크는 종류가 한가지로 국한되어있지 않다. 따라서 서로 입출력을 주고 받을 표준이 필요하여 등장하게 된 것이 바로 CGI이다.
요청 👉 웹 서버 👉 (웹 서버에서 동작하는) 프로그램
여기서 아래에서 설명할 WAS와의 차이는 프로그램을 '서버가 직접 실행하는지', 'WAS가 대신 실행하는지'에 있다.
웹서버 + CGI를 WAS라고 한다. WAS는 동적 컨텐츠 제공을 위해 만들어진 Application 서버이다.
WAS가 동적 컨텐츠를 담당한다고 해서, 정적 컨텐츠를 전혀 처리하지 못하는 것은 아니다. 즉, WAS 만 사용하여 서버를 구축해도 가능하다는 뜻이다. 하지만 굳이 사람들이 웹 서버, WAS를 함께 쓰는 이유는, 단순한 로직은 정적 컨텐츠 제공은 웹 서버에게 맡겨 역할을 분리하고 부하를 분산하기 위해서이다.
GCI와 비교를 해보자면, 트래픽이 많은 서비스에선 WAS 방식의 처리량이 더 좋다. CGI의 경우 프로그램을 수행하기 위한 프로세스를 생성하고, WAS의 경우엔 스레드를 생성하기 때문이다.
요청 👉 웹 서버 👉 WAS 👉 (WAAS가 실행한) 프로그램
WAS가 프로그램의 실행 결과를 웹 서버에 전달해주면, 웹 서버는 이를 웹 브라우저에 전송하는 구조를 띈다.
파이썬에서 웹 어플리케이션(Django, Flask)가 웹 서버와 통신하기 위한 인터페이스이다. CGI와는 다르게 서브 프로세스를 다 fork하진 않는다. CGI가 Request가 들어올 때마다 python script를 처음부터 다 실행했다면, WSGI는 Request가 들어오면 필요한 로직 하나만 실행한 후 결과를 응답해주는 방식으로 동작한다. (속도가 더 빠르다)
요청 👉 웹 서버 👉 WSGI 서버 (=미들웨어) 👉 WSGI를 지원하는 웹 어플리케이션
배포 레퍼런스를 찾아보다보면 다양한 방식의 배포 방식이 존재함을 확인할 수 있다.
사람들은 보통 Nginx(웹서버) + uWSGI(WSGI서버)를 사용하는데,
Nginx 하나만, uWSGI 하나만 사용하면 안될까??
결론은 가능하다!
각각이 제공하는 기능과 장단점을 이해하고, 원하는대로 설계하면 되는 것이다.
Nginx와 같은 웹 서버는 reverse proxy server, load balancer 등의 역할을 수행한다. 따라서 Nginx를 사용하지 않는다면 이와 같은 부가 기능을 제공받을 수 없다. 이것을 이해하고 설계한다면, Nginx만 사용한 서버 구성도 틀린 것은 아니다.
Flask, Djangoㅘ 같은 웹 프레임워크는 WSGI Interface를 어느정도 구현해놓은 상태이다. 그래서 해당 프레임워크를 사용한다면 Nginx만 사용해도 큰 문제는 없다.
하지만 session, cookie 등의 기능을 제공해주는 미들웨어의 부재로, 이러한 부분은 개발자가 따로 신경을 써줘야만 한다.
각각의 기능을 이해하고, 그에 맞게 설계를 한다면 어느 방식이라도 가능하다는 것을 알게 되었다 :)
https://www.shantanuacharya.com/2020-12-09-deploy-django-nginx-uwsgi/
https://code-lab1.tistory.com/199
https://codechasseur.tistory.com/25
https://brownbears.tistory.com/350
https://my-repo.tistory.com/20
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ginameee&logNo=220868560433
https://velog.io/@jimin_lee/Nginx%EC%99%80-Gunicorn-%EB%91%98-%EC%A4%91-%ED%95%98%EB%82%98%EB%A7%8C-%EC%8D%A8%EB%8F%84-%EB%90%A0%EA%B9%8C