본문 바로가기
# Study/Django

[Study] 백엔드 스터디 3주차 - 배포 방법

by Jiy0ung 2021. 8. 25.

요즘 정신을 못차렸다....  나태해진 내 자신 반성해라.... 개강이 1주일 남았더니 아무것도 하고 싶지 않아졌었다ㅠㅠ

그리고 알바몬인 나는 이번주에 4일을 일하게되어서 바쁘게 방학 마지막 주를 보낼 예정이다.... 화이팅 !!!

오늘의 공부 시작!!!!

📌3주차의 목표

[배포에 대한 깊이있는 이해]

 

❓키워드

  • Django WSGI
  • Web Server
  • Web Application Server
  • Django deploy
  • Django runserver deploy

정적 페이지와 동적 페이지에 대해 간단히 설명 후, Web Server와 WAS의 개념, WSGI에 관하여 이야기 할 것이다.

Static Pages / Dynamic Pages


Static Pages

  • Web Server는 파일 경로 이름을 받아 경로와 일치하는 file contests를 반환한다.
  • 항상 동일한 페이지를 반환한다. ex) image, html, css, javascript 파일과 같이 컴퓨터에 저장되어 있는 파일들

Dynamic Pages

  • 인자의 내용에 맞게 동적인 contents를 반환한다.
  • 즉, 웹 서버에 의해서 실행되는 프로그램을 통해서 만들어진 결과물이다.
  • 개발자는 Servlet에서 doGet()을 구현한다.

Web Server


웹 서버란, 클라이언트가 서버에 페이지 요청을 하면 요청을 받아 정적 컨텐츠('.html', '.png', 'css' 등)를 제공하는 서버이다.

ex) Apache Server, Nginx, IIS(Windows 전용  web 서버) 등

 

HTTP프로토콜을 기반으로 하여 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스 하는 기능을 담당한다.

요청에따라 다음의 두 가지 기능 중 적절하게 선택하여 수행한다.

기능1)

  • 정적인 컨텐츠 제공
  • WAS를 거치지 않고 바로 자원을 제공

기능2)

  • 동적인 컨텐츠 제공을 위한 요청 전달
  • 클라이언트의 Request를 WAS에 보내고, WAS가 처리한 결과를 클라이언트에 Response (클라이언트는 일반적으로 웹 브라우저를 의미)

WAS(Web Application Server)


DB조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server.

HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어 (소프트웨어 엔진)이다.

"웹 컨테이너(Web Container)" 혹은 "서블릿 컨테이너(servlet Contatiner)"라고도 불린다.

 Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말함. 즉, WAS는 JSP, Servlet 구동 환경을 제공

Ex) Tomcat, JBoss, Jeus, Web Sphere 등

WAS의 역할 및 주요 기능

WAS = Web Server + Web Container

Web Server 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시되었다.

- 프로그램 실행 환경과 DB 접속 기능 제공

- 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능

- 업무를 처리하는 비즈니스 로직 수행

 

WSGI (Web Server Gateway Interface)


웹 서버 게이트웨이 인터페이스는 웹 서버와 웹 어플리케이션의 인터페이스를 위한 파이썬 프레임워크다.
기존의 파이썬 웹 어플리케이션 프레임워크는 웹 서버를 선택하는데 있어서 제약이 있었다. 보통 CGI. FastCGI, mod_python과 같은 커스텀 API 중 하나만 사용할 수 있도록 디자인 되었는데, WSGI는 그에 반하여 Low-Level로 만들어져서 웹 서버나 웹 어플리케이션, 프레임워크 간의 벽을 허물었다
출처 : 위키피디아

WSGI는 장고와 웹 서버를 연결해주는 역할을 하는 Python 프레임 워크이고, 프로토콜 개념으로도 이해할 수 있다.

웹 서버가 직접적으로 Python으로 된 장고와 통신할 수 없기 때문에 그 사이에서 WSGI Server가 실행되어 웹 서버와 장고를 연결 해 준다.

웹 서버가 전달받은 사용자의 요청을 WSGI Server에서 처리하여 Django로 넘겨주고, 다시 Django가 넘겨준 응답을 WSGI Server가 받아서 웹 서버에 전달한다.

사용자 <-> Web Server <-> WSGI Server <-> Django

 

WSGI의 역할

기본적으로 웹 서버 자체는 정적인 페이지 밖에 보여주지 못한다.

우리가 인터넷에서 보는 동적인 페이지들은 웹 서버가 전적으로 처리하는 것이 아니라 웹 어플리케이션(Django, Flask 등으로 작성된 프로그램)의 도움으로 볼 수 있는 것이다.

아쉽게도 Apache, Nginx 등의 웹 서버는 파이썬 코드를 이해하지 못한다. 그래서 웹 서버 자체만으로는 웹 서버와 파이썬 웹 어플리케이션은 소통을 할 수 없다.

이때, WSGI가 웹 서버와 파이썬 웹 어플리케이션 간의 인터페이스 역할을 하는 것이다.

전체적인 흐름을 직접 그려보았다.

  1. 클라이언트에서 요청을 보냄.
  2. 웹 서버에서 요청을 받는다. 이때 동적인 페이지를 요청했다면 WSGI서버(미들웨어)를 호출.
  3. WSGI 서버는 WSGI를 사용하는 웹 어플리케이션(ex.Django)을 호출.
  4. 호출받은 웹 어플리케이션은 요청에 따라 적절한 처리를 수행.
  5. 수행 결과를 다시 WSGI 서버를 통해 웹 서버로 전달하고, 웹 서버는 최종 응답을 클라이언트로 보냄.

대표적인 WSGI 서버로는 uWSGI, mod_wsgi, Gunicorn 등이 있다.

 

WSGI와 CGI의 차이

CGI

- 플랫폼에 상관없이 동작가능

- 매번 요청에 대해 프로세스를 생성(fork)함. 때문에 요청이 많아질수록 성능이 저하.(HTTP 동작 방식과 비슷)

 

WSGI

파이썬에 종속적이고,  CGI의 디자인 패턴을 기반으로 제작되긴 했지만 동작방식에서 CGI와 차이가 있다.

- 매 번 요청에 대해 프로세스를 생성(fork)하지 않음. 따라서, 요청이 많아도 성능 저하가 거의 없다.

- 웹 어플리케이션을 호출할 때 request(요청)의 헤더부분을 환경 정보로 전달하며, 이 때 콜백 함수도 같이 전달함.

그 후, 웹 어플리케이션이 요청을 처리하고 콜백 함수로 응답하는 방식.

즉, WSGI가 CGI보다 상위 모델이라고 생각할 수 있다.

 

Django에서의 WSGI

WSGI 서버는 장고와 통신할 때 '프로젝트명/config/wsgi.py'경로에 있는 파일을 통해 장고 어플리케이션을 호출한다.

이 파일은 왠만해선 딱히 건들 필요가 없지만 혹시나 프로젝트의 디렉터리 구조를 조금 손봐서 'settings.py' 파일이 이동하게 된다면 그 경로를 반드시 수정해줘야한다.

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('Django_SETTINGS_MODULE', 'config.settings')
						#________________
                                                 이 부분이 settings.py의 경로로
application = get_wsgi_application()

장고의 내장 서버는 WSGI의 기능을 자체적으로 포함하고 있다.(Python manage.py runserver)

 

Django에서 제공하는 Runserver로 배포를 하면 안되는 이유


Django에서 기본적으로 제공하는 서버인 runserver는 테스트용 웹 서버일 뿐이다.

runserver로 배포하여 프로젝트를 고객에게 상용화할 경우 처리 능력이나 보안상에 문제가 있어  Apache, Nginx 등의 상용 웹 서버를 사용해야하는 것이다.

Django 공식 문서를 살펴보아도 runserver 대신 다른 웹 서버로 배포하는 것을 권장한다. 

 


장고를 공부한 것이 점 하나 조그마게 찍은 느낌이었다... Web Server, WAS 등의 개념을 잘 알게 되었고, 장고에서 runserver로 배포하면 안되는 이유도 잘 짚고 넘어갔다.

아직 못한 Database 실습도 꼭 해보고 올려야겠다 ㅎㅎ

 

참고링크

https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

https://nachwon.github.io/django-deploy-2-wsgi/

https://tibetsandfox.tistory.com/22