일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 카카오 코테
- 시스템호출
- 프로그래머스
- 카카오
- nestjs typeorm
- 코딩테스트
- 해시
- 파이썬
- 구조체배열
- TypeORM
- Nodejs
- C언어
- spring boot
- 알고리즘
- @Component
- 스프링
- 카카오 알고리즘
- 가상면접사례로배우는대규모시스템설계기초
- Spring
- C++
- git
- AWS
- OpenCV
- 코테
- nestjs auth
- nestJS
- thymeleaf
- python
- 컴포넌트스캔
- @Autowired
- Today
- Total
공부 기록장 💻
[Backend/Web Server/Django Deploy] 웹 서버와 WAS, Django 배포 본문
[Backend/Web Server/Django Deploy] 웹 서버와 WAS, Django 배포
dream_for 2021. 8. 21. 15:27스터디 주차 별 목표 >
스터디 주차 별 목표
1주차 : Database의 종류 및 특징 + 쿼리문 이해 ( 8 / 4 ~ 8 / 11 )
2주차 : 각 Database의 모델링 방법 및 쿼리 작성법 스터디 및 실습 ( 8 / 11 ~ 8 / 18 )
3주차 : 배포 방법 스터디 및 실습 ( 8 / 18 ~ 8 / 25 )
4주차 : Django Rest Framework 스터디 ( 8 / 25 ~ 9 / 1 )
3주차 스터디 키워드
- Django WSGI
- Web Server
- Web Application Server
- Django deploy
- Django runserver deploy
3주차 스터디 질문리스트
질문 1 : 웹 서버란 무엇일까요?
질문 2 : 웹 어플리케이션 서버란 무엇일까요?
질문 3 : Django에서 제공하는 Runserver로 배포를 하면 안되는 이유는?
배포는 깊게 공부하면 끝도 없이 어려운 기술입니다.
이미 pythonanywhere로 배포를 해보신 분들도 계실텐데
사실 장고 공식문서를 보면 Django에서 제공하는 runserver는 개발용일 뿐
배포시에는 절대 Django Runserver로 하지 말 것을 명시하고 있습니다
이번 스터디를 통해 그 이유를 알아가셨으면 좋겠습니다!
3주차 목표
배포에 대한 깊이있는 이해
1. 웹 서버란 무엇일까요?
기본적인 웹의 동작 방식
먼저 오늘의 스터디 주제의 핵심 키워드인 웹 서버에 대해서 살펴보기 전에 우선 웹의 동작 방식을 살펴보며, 기본적인 용어들도 함께 정리해보자.
먼저 웹의 영역에서 클라이언트와 서버의 관계부터 살펴보자.
먼저 웹 클라이언트는 사용자가 웹에 접근하는 프로그램을 말한다.
일반적으로 Chrome, Firefox 등 우리가 알고 있는 웹 브라우저들 대부분이 웹 클라이언트이다.
브라우저 주소창에 http://dream-and-develop.tistory.com 를 입력하고 엔터키를 누르면, 클라이언트는 사용자로부터 받은 URL에 대한 정보를 HTTP 메시지 형태로 서버에게 요청(Request)을 하게 된다.
- 프로토콜 (Protocol) 이란 두 컴퓨터 간의 통신을 위한 규칙의 집합이며, HTTP(Hypertext Transfer Protocol)은 문자로 된, 독립적인 프로토콜이다.
웹 서버 는 간단하게, 웹 페이지, 웹 사이트, 또는 앱을 저장하는 프로그램이다.
서버는 클라이언트(웹 브라우저)에서 요청한 HTTP 메시지를 확인하고, 이에 맞는 데이터를 처리한 뒤에 다시 클라이언트에게 응답(Response) 한다. 클라이언트가 위의 내 블로그 주소창의 메인 페이지를 띄우라는 요청을 보냈기 때문에, 서버에서는 이 요청을 확인하고 페이지를 만드는 데 필요한 HTML, CSS, JS, 이미지 파일들을 가져와 클라이언트에게 보내주는 것이다.
위 그림과 같이 클라이언트와 서버는 기본적으로 웹 브라우저에서 특정 페이지를 요청하면 웹 서버가 해당 페이지를 반환하는 역할을 한다. 초창기 웹이 출현했을 때 웹의 구조는 위와 같다.
그러나 점차 사용자가 늘어나고, 데이터 베이스를 통해 수많은 데이터를 입력하여 저장하고, 조회할 수 있는 기능을 가진 동적 페이지에 대한 필요성이 대두되었고, 새로운 서버 모델들이 등장하기 시작했다.
웹 서버의 개념에 대해서 조금 더 자세하게 살펴보고, 나아가 '웹 어플리케이션 서버' 에 대해서도 알아보자.
"runserver 을 통해 서버를 구동시킬 수 있는 장고 웹 프레임워크는 서버일까?" 라는 질문에 대한 답도 찾아보자!
웹 서버의 개념, 기능
웹 서버(Web Server)는 하드웨어, 소프트웨어 혹은 두 개가 같이 동작하는 것을 의미할 수 있다.
먼저 하드웨어의 측면에서 웹 서버는 소프트웨어와 웹 사이트의 컴포넌트 파일들(HTML 문서, 이밎, CSS stylesheets, JS 파일 등)을 저장하는 물리적인 '컴퓨터'라고 할 수 있다. 웹 서버는 인터넷에 연결되어 웹에 연결된 다른 기기들이 컴포넌트 파일 데이터를 주고받을 수 있도록 한다.
소프트웨어의 측면에서 웹 서버는 웹 브라우저(Browser)과 같은 클라이언트로부터 HTTP 요청을 받아들이고, 웹 컴포넌트 파일들을 반환하는 프로그램이라고 할 수 있다. 웹 서버는 사용자가 호스트 파일들에 어떻게 접근하는지를 관리하는 역할을 하기도 한다.
위 그림과 같이, 브라우저가 웹 서버에서 불려진 파일들을 필요로 할 때, 브라우저는 HTTP를 통해 파일을 요청한다. (HTTP Request)
요청이 올바른 웹 서버(HW)에 도달하게 되면, HTTP 서버(SW)는 요청된 문서를 HTTP를 이용해 보내준다. (HTTP Response)
- 웹 서버는 HTTP 지원을 하는데, HTTP란 두 컴퓨터 간의 웹 문서를 전송하는지 서술한다.
웹 서버는 요청에 따라 웹 서버는 두 가지의 기능을 한다.
1) 정적 페이지 요청에 대한 응답 - html, css, js 또는 이미지 파일과 같은 정적 컨텐츠를 요청받아 응답 (어플리케이션 서버를 거치지 않고 바로 자원을 제공)
2) 동적 페이지 요청에 대한 응답 - DB의 내용에 따라 수시로 변하는 동적인 컨텐츠 제공을 위해, 클라이언트의 요청(Request)를 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답-Response)한다.
- WAS(Web Application Server)은 아래 2번 질문에 대한 답으로 작성해 놓았다.
웹 서버의 종류
[참고자료]
https://brunch.co.kr/@swimjiy/2
https://swimjiy.github.io/2019-11-03-How-Web-Works
https://binux.tistory.com/32
https://sleepyeyes.tistory.com/13
https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_web_server
https://whatis.techtarget.com/definition/Web-server
2. 웹 어플리케이션 서버란 무엇일까요?
방금까지 살펴본 웹 서버는 클라이언트(웹 브라우저)로부터 HTTP 방식으로 정적 컨텐츠(HTML, CSS, 이미지 파일 등)를 요청 받아 그에 맞는 응답을 제공해주는 프로그램이라 할 수 있다.
또한, 웹 서버는 자체적으로 처리할 수 없는 동적인 자원(JSP, PHP, DB연동 등)을 웹 컨테이너로 넘겨주고, 컨테이너에서 처리한 결과를 다시 받아 클라이언트에게 제공해주는 역할을 한다.
위의 그림과 같이, 동적 페이지를 사용자에게 제공하기 위해 웹 서버 내에 프로그래밍 기능이 들어가있는 방식을 CGI (Common Gateway Interface) 방식이라고 한다.
그러나 이는 웹 서버에서 각각의 클라이언트의 요청에 대해 독립적인 별도의 프로세스를 생성해 요청을 처리하기 때문에 시스템에 부하가 커져 문제가 발생한다.
따라서 CGI 방식의 문제점을 해결하기 위해 나타난 것이 웹 어플리케이션 서버이다. 이에 대해 살펴보자!
웹 어플리케이션 서버 (Web Application Server) 는 데이터베이스 연동 그리고 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 어플리케이션 서버이다.
웹 서버와 DB 서버 사이에서 작동하는 미들웨어로서, DB 연동 및 동적 페이지를 생성하기 위한 처리를 하게 된다.
다양한 웹 서비스의 아키텍처 모델들이 존재한다.
WAS는 웹 서버 그리고 동적인 처리를 하는 웹 컨테이너를 포함한 것이라고도 볼 수 있지만,
아래와 같이 웹 서버와 WAS의 기능을 분리하여 서버 부하를 방지하는 것이 좋다.
WAS는 기본적으로 동적 컨텐츠를 제공하기 위해 존재하는 서버이므로,
웹 서버와 WAS를 물리적으로 분리하여 정적 컨텐츠의 요청에 대해서는 웹 서버가 처리할 수 있도록 하여 효율적인 분산 처리를 가능하게 하여야 한다.
이렇게 물리적으로 분리하여 여러 웹 어플리케이션 서비스를 함께 사용하는 것을 가능케 한다.
[참고자료]
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
3. Django에서 제공하는 Runserver로 배포를 하면 안되는 이유는?
장고 서버를 실행하여 로컬에서 웹을 동작시키고자 할 때, 지금껏 python manage.py runserver 을 사용했다.
그러나 실제 개발 환경을 설정하여 배포할 시에는 runserver 을 사용할 수 없다.
아래는 Django runserver 의 설명 중 일부분이다.
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (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.)
production setting에서 보안 문제, 퍼포먼스 이슈의 이유로 runserver 을 사용하지 말라고 주의를 주고 있으며,
Django는 웹 서버가 아닌, 웹 프레임워크를 만드는 것에 목적을 두고 있기 때문에 장고의 범위 밖에서 서버의 개발 환경을 염두해 둘 것을 추천하고 있다.
이유가 무엇일까?
우선 장고 웹 프레임워크의 서버 구조, 그리고 장고의 서버가 어떠한 방식으로 실행되는지 알아볼 필요가 있다.
우선 장고 자체는 파이썬 기반의 웹 프레임워크이다.
웹 서버에 동적 페이지 요청이 들어오면 웹 서버는 파이썬 프로그램을 호출해야 하는데, 대부분의 웹 서버는 파이썬 프로그램을 호출할 수 있는 기능이 없다.
따라서 개발목적으로 python 기반으로 짜여진 가벼운 WSGI 를 사용하게 되는데,
WSGI 란 장고만의 서버, 장고의 내장 Web Application Server 라고 할 수 있다.
WSGI가 무엇인지 조금 더 자세히 살펴보자!
WSGI (Web Server Gateway Interface)
WSGI 는 파이썬으로 쓰여진 문서가 웹 서버와 통신하기 위한 표준 인터페이스이며, 파이썬 웹 어플리케이션 서버이다.
WSGI는 웹 서버와 Python 언어를 사용하는 웹 서버 어플리케이션 개발 환경(Django 또는 Flask와 같은 프레임워크 포함) 간의 연결을 중계하는 로우-레벨 인터페이스이다.
즉, 웹 프레임워크인 장고와 웹 서버 간의 통신을 하는 것이 바로 WSGI 서버인 것이다.
웹 서버에 동적 요청이 발생하면, 웹 서버가 WSGI 서버를 호출하고, WSGI 서버는 파이썬 프로그램을 호출하여 동적 페이지 요청을 대신 처리하게 된다.
클라이언트, 웹 서버, 그리고 wsgi와 Django 어플리케이션 서버 간의 관계를 나타내는 순서도는 다음과 같다.
클라이언트인 웹 브라우저의 정적 페이지 요청은 웹서버가 처리하고,
동적 페이지 요청은 [WSGI 서버 -> WSGI 애플리케이션:Django] 으로 처리한다.
실제적인 서버의 구조를 자세히 살펴보면 다음과 같이 구성된다.
웹 서버 Nginix 는 정적 데이터 반환의 역할을 하며, 동적 데이터 처리 시에는 웹 어플리케이션에 브라우저 요청을 전달한다.
웹 어플리케이션 서버 에서는, 웹 어플리케이션 Django 가 Maria DB 와 연동하여 데이터를 처리하고, 여러 로직을 수행해낸 뒤, 템플릿을 렌더링하여 생성한 HTML 파일들을 브라우저에 반환한다.
WSGI 미들웨어의 한 종류인 Gunicorn 은 Nginix와 Django가 통신하기 위한 인터페이스의 역할을 한다.
(추가할 부분)- 장고의 웹 서버 nginix, collectstatic 명령어, 배포
https://docs.djangoproject.com/ko/3.2/howto/static-files/
https://docs.djangoproject.com/ko/3.2/howto/static-files/deployment/
https://crynut84.github.io/2016/11/14/django-static-file/
https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Deployment
결국, runserver 을 통해 장고의 내장 서버를 구동하는 wsgi를 포함하여, 장고는 웹 서버라고 할 수 있다.
그러나, 장고의 내장 서버는 기능이 단순하고 대량 요청이나 동시 요청을 효율적으로 처리하지 못한다.
또한 위에 언급된 공식 문서에 작성되어 있는 내용과 같이, 장고는 웹 서버를 구축 하는데 목적을 두고 있지 않은 웹 프레임워크이므로,
운영이 아닌 개발을 위해서는, 높은 성능을 위해 개발된 웹 서버를 설치하여 적용해야 한다.
[참고자료]
https://wikidocs.net/75556
https://jay-ji.tistory.com/66
https://itmining.tistory.com/135
https://dailyheumsi.tistory.com/19
https://dailyheumsi.tistory.com/21
'# Tech Studies > Web' 카테고리의 다른 글
[Web/Backend/Auth] JWT란 무엇인가? (0) | 2022.08.23 |
---|---|
[Web Data Format] XML, JSON 포맷 파일이란? (0) | 2021.11.27 |
[Backend/Database] 데이터베이스 모델링, RDB/NoSQL Modeling, MySQL 실습 (0) | 2021.08.13 |
[Backend/Database] Database, DB Query, RDB(Relational DB)/NoSQL, ORM(Object-Relational Mapping) (3) | 2021.08.04 |
[Web/API] API란? (0) | 2021.04.20 |