Computer Theory/Web

웹 서버와 WAS (Django, Nginx, Gunicorn)

jheaon 2024. 7. 24. 22:18

 

 

django 프로젝트를 하다 보면, gunicorn과 nginx로 배포하는 경우가 흔하다. 하지만 강의나 여러 글만 따라가면서 프로젝트를 진행했기에 gunicorn과 nginx에 대한 개념이 뚜렷하지 않다. 따라서 이에 대한 개념을 잡아보고자 한다.

 

Nginx

Nginx에 알아보기 전 웹서버와 WAS에 대해서 짚고 넘어가자.

 

https://www.youtube.com/watch?v=Zimhvf2B7Es&t=659s 

 

 

  •  웹서버: 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 콘텐츠를 제공하는 프로그램을 의미한다. 대표적으로는 Apache와 Nginx가 있다.
  • WAS(Web Application Server): DB조회나 다양한 로직 처리를 요구하는 동적인 콘텐츠를 제공하기 위해 만들어진 애플리케이션 서버를 의미한다. 

 

 

이렇게 봤을 때, WAS가 웹 서버의 기능을 모두 수행하면 될 것 같지만 여러 목적이 있기에 웹 서버와 WAS를 따로 분리하여 운영하는데 그 이유는 아래와 같다. 

 

  • 기능을 분리하여 서버 부하 방지 : WAS는 DB조회나 다양한 로직을 처리하느라 바쁘기 때문에 단순 정적 콘텐츠는 웹 서버에서 제공하여 서버 부하를 방지한다. 
  •  물리적으로 분리하여 보안 강화 : SSL에 대한 암복호화 처리에 Web Server을 사용한다.
  • 여러 대의 WAS를 연결 가능 : 리버스 프락시로 사용하여 Load Balacing(서버가 처리해야 할 업무 혹은 요청(Load)을 여러 대의 서버로 나누어(Balancing) 처리하는 것)을 위해 Web Server을 사용한다. 이렇게 여러 대의 서버를 나누어 처리한다면 장애가 생겼을 때 쉽게 대응할 수 있다는 장점이 있다. 

 

그 외에도 여러 가지 이유가 존재하지만 주요 목적으로는 자원이용의 효율성 및 장애극복, 배포 및 유지보수의 편의성을 위해서 웹 서버와 WAS을 분리한다고 볼 수 있다.

 

 

 

 

Gunicorn

Gunicorn은 WSGI(Web Server Gateway Interface)의 일종으로 웹 서버로부터 서버 사이드 요청을 받으면 WSGI을 통해 서버 애플리케이션으로 전달해 주는 역할을 수행하는 존재이다. 

 

WSGI는 CGI(Common Gateway Interface)의 일종으로 CGI는 정적인 웹에서 동적인 웹으로 발전함에 따라서 각각 다른 프로그래밍 언어가 사용되어 공통적인 형태로 주고받기 위해 만든 규약이다. 간단하게 요약하자면 여러 언어의 사용자들의 다양한 요청을 이해할 수 있도록 이를 공통된 규칙으로 변환하는 관문의 역할을 하는 셈이다. 따라서 웹 서버가 클라이언트 요청을 받으면 CGI에 의해 일관된 형태로 해석되어 이를 WAS에서 처리할 수 있다. 

 

CGI 기본 동작 과정
1. input으로 HttpRequest를 받음
2. 요청에 대한 정보를 환경변수 형식으로 만들어 파이썬 스크립트의 stdin 형식의 input으로 받음
3. 스크립트가 print와 같은 stdout 형식으로 응답하면 HTTP 형식으로 변환

 

WSGI는 파이썬 스크립트가 웹서버와 효율적으로 통신하기 위해 만들어진 인터페이스이다. 따라서 gunicorn이나 uWSGI 등은 Nginx로 들어오는 HttpRequest를 파이썬이 이해할 수 있게 동시통역하는 존재들이다.

  • CGI는 요청이 들어올 때마다 파이썬 스크립트를 처음부터 실행하게 되어 서버가 느려지고 비효율적이나, WSGI는 스크립트 전체를 실행하는 것이 아닌 필요한 로직 하나만 실행하고 결과를 응답한다. 
  • Django을 사용하다 보면 "python manage.py runserver"명령어로 서버를 여는데, 이때 클라이언트에서 받는 Http요청을 WSGI로 변환하여 처리하고 반환한다. 하지만 이는 단순 디버그용으로 만들어졌기 때문에 보안이나 성능에서 취약함으로, 실제 배포용으로 사용하지 않는 것을 권하고 있다. 

 


 

 

Nginx와 Gunicorn 둘 중 하나만 써도 될까?

Flask나 Django로 만든 파이썬 앱을 배포할 때, 보통 Nginx와 Gunicorn과 자기 앱을 연결해서 배포하는 게 정석처럼 여겨

velog.io

 

'Computer Theory > Web' 카테고리의 다른 글

호스팅(Web Hosting)  (0) 2024.06.07
도메인과 DNS 그리고 DNS의 작동원리  (0) 2024.05.23
HTTP란 무엇인가?  (0) 2024.05.03
HTTP 메서드 종류  (1) 2024.05.03
API에 대하여  (0) 2023.12.12

'Computer Theory/Web'의 다른글

  • 현재글 웹 서버와 WAS (Django, Nginx, Gunicorn)

관련글