본문 바로가기
coding 📟/django 📱

[DJANGO] django 배포 nginx 와 uwsgi를 사용하는 이유 -2

by 고돌한 데이터 사이언스 2022. 6. 23.
반응형

 

저번 글에서 django 배포환경 사전지식을 정리하였다.

아래의 글을 참고하자.

2022.06.23 - [coding 📟/django 📱] - [DJANGO] django 배포 nginx 와 uwsgi를 사용하는 이유 -1

 

[DJANGO] django 배포 nginx 와 uwsgi를 사용하는 이유 -1

우선 보통 django 개발시 궁금했던 점을 체크하자 기본 적인 설명으로 Django는 파이썬에서 제공하는 웹프레임워크입니다. Django에는 코드를 자체적으로 테스트하기 위한 간단한 웹서

kodorricoding.tistory.com

 

django 의 runserver로 배포하면 안되는 이유


django를 개발시 runserver를 통해 개발 및 테스트를 진행한다.
즉 "개발 및 테스트"가 목적이다.

django 공식 문서 runserver 글이다.

DO NOT USE THIS SERVER IN A PRODUCTION SETTING. 
It has not gone through security audits or performance tests. 
(And that’s how it’s gonna stay. We’re in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)

 


프로덕션 세팅으로 서버를 사용하지 마세요. 보안과 성능 테스트를 거치지 않았습니다. …. 프로덕션 환경은 django의 영역을 벗어난 것입니다

공식적으로 권장하지 않는다 그 이유는 runserver의 성능은 느리며, 보안에 대한 문제가 내포되어 있다.
운영환경에서는 wsgi를 통해서 서비스하도록 권장한다.

 

보통 django로 딥러닝 모델 전용 서버를 구현 시 nginx + uwsgi + django 조합으로 구현한다.

 

uwsgi 란?


wsgi server 를 쓴다면 django 등의 웹 프레임워크 기능을 할 수 있게 된다.

uWSGI란?

uWSGI란 WSGI라는 규칙을 따라서 만들어진 소프트웨어,
정적인 웹서버(Apache, Nginx)와 python으로 작성된 Web Framework(Flask / Django) 사이의 통신을 도와주는 역할

즉 앞단에 있는 Nginx는 python을 모르기 때문에 uWSGI를 통해 HTTP request를 python으로, django로 부터 받은 응답을 Nginx가 알 수있도록 변환해준다.

django에서는 일반적으로 uWSGI나 Gunicorn을 Nginx에 연동한다.

WSGI 규칙이란?
기본적으로 웹서버는 http형식의 요청을 받아서 처리 후, 응답을 해주는 기능을 한다.
이러한 처리를 1차적으로 nginx를 통해 이루어지며
서버에서 처리 할 작업이 있으면 django와 같은 WAS가 필요하다.

하지만 Django는 python으로 이루어져있기 때문에 HTTP 요청을 이해할 수 없는데,
이 때 uWSGI 같은 소프트웨어가 필요하다.

즉 파이썬 어플리케이션이 웹 서버와 통신하기 위한 명세이다.

uWSGI는 일종의 어플리케이션 컨테이너로써 동작한다고 볼수 있다.
적재한 어플리케이션(Django)을 실행만 시켜주는 역할을 한다.

 

최종환경?


최종적인 Django 환경은 아래와 같다.

 


client <--> Nginx <--> uWSGI <--> Django

동작 순서
1. 클라이언트 API 호출
2. 가장 먼저 웹서버로 접속(nginx)
3. 소켓을 통해 wsgi 까지 도달(wsgi : 장고와 웹서버의 통신을 교환할 수 있게 도와주는 인터페이스)
4. wsgi에서 django로 전달되어 프로젝트내 파이썬 코드가 실행

 

** uwsgi + django 등의 웹 프레임워크 기능을 할 수 있게 되는데 nginx를 쓰는 이유는?

앞단에 nginx를 앞에 붙이면 더 좋은 성능을 낼 수 있다.

예를 들어 wsgi는 ssl과 정적파일을 지원하지 않는다. ssl과 정적파일을 django까지 요청이 도착한 다음에 처리해야해 성능이 저하된다.
또한 DOS 공격과 같은 많은 요청을 nginx에서 처리 및 분산시킴으로써 서버 기능을 보장할 수 있다.
( uwsgi는 ssl과 정적 파일 지원이 가능합니다. 하지만 다른 wsgi보다 메모리와 cpu를 더 많이 소비한다)

nginx를 쓴다면 아래와 같은 기능을 앞단에서 수행할 수 있습니다. 
 
* 도메인 라우팅을 관리합니다 (리버스 프록시).
* 정적 파일 제공
* 한 번에 들어오는 많은 요청을 처리
* 느린 클라이언트 처리
* 동적 요청을 wsgi에 전달
* SSL (https)
* Python 코드와 비교하여 컴퓨팅 리소스 (CPU 및 메모리) 절약
* 로드 밸런싱, 캐싱 등

wsgi는 아래와 같은 기능을 수행하도록 합니다. 
 
* 작업자 프로세스 / 스레드 풀 실행 (코드 실행)
* Nginx에서 들어오는 요청을 WSGI와 호환되도록 번역
* 앱의 WSGI 응답을 적절한 http 응답으로 변환
* 요청이 들어오면 실제로 파이썬 코드를 호출합니다.

 

최종정리


  1. django는 기본적인 웹서버가 존재하고, runserver 명령으로 구동 가능하다.
  2. 하지만 runserver 구동 시 성능저하, 보안 문제로 실제 운영환경 배포에서는 권장 하지 않는다.
  3. 기본적으로 운영환경 배포시 nginx(web server) + gunicorn(wsgi) + django 조합으로 구성한다.
  4.  좋은 성능을 위해 wsgi + django를 사용하고 몇몇 wsgi는 SSL과 정적파일 지원하지 않고, DDos 공격과 같은 많은 주기적 요청이 발생하기때문에앞단에 web server를 붙인다.
  5. 웹서버가 처리 및 분산시킴으로 서버의 안정성을 보장받을 수 있다.
반응형

댓글