AWS Lightsail(Nginx - Gunicorn - Django) 구축(3)

흑이·2022년 1월 30일
0

WSGI 와 Gunicorn이 무엇인지?
Gunicorn 설치 과정까지 작성하겠다.


WSGI란?

  • WSGI는 Web Server Gateway Interface의 약자

  • python application(python script)이 Web Server와 통신하기 위한 표준 Interface이며 Python Framework이다.

  • WSGI는 CGI(Common Gateway Interface)의 일종으로 CGI는 정적인 웹에서 동적인 웹으로 발전함에 따라 각기 다른 프로그래밍 언어가 사용되어 "공통적인 형태"로 주고받기 위해 만든 규약(specification)입니다.

  • 다시 말해 여러 언어 사용자들의 다양한 요청을 이해할 수 있도록 이를 공통된 규칙으로 변환하는 관문 역할을 하는 것입니다.

  • 따라서 웹서버가 클라이언트 요청을 받으면 CGI에 의해 일관된 형태로 해석되어 이를 WAS에서 처리할 수 있는 것이죠.

  • CGI 기본 동작 과정

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

WSGI는 위스키라고 읽는다.

WSGI 서버는 웹 서버와 WSGI 애플리케이션 중간에 위치한다. 그래서 WSGI 서버는 WSGI 미들웨어(middleware) 또는 WSGI 컨테이너(container)라고도 한다.


Gunicorn 란?

  • gunicorn은 Python WSGI HTTP Server

  • 웹 서버에 동적 페이지 요청이 들어오면 웹 서버는 파이썬 프로그램을 호출해야 한다. 하지만 웹 서버는 파이썬 프로그램을 호출할 수 있는 기능이 없다.

  • 이러한 이유로 파이썬 프로그램을 호출하는 WSGI(web server gateway interface) 서버가 반드시 필요하다.

  • 즉 웹 서버에 동적 요청이 발생하면 웹 서버가 WSGI 서버를 호출하고, WSGI 서버는 파이썬 프로그램을 호출하여 동적 페이지 요청을 대신 처리하는 것이다.

  • Django의 내장 서버는 웹 서버와 WSGI 서버의 기능을 모두 포함하고 있다. 다만 내장 서버는 기능이 단순하고 '대량 요청'이나 '동시 요청'을 효율적으로 처리하지 못하므로 운영 환경에는 적합하지 않다.

  • runserver는 개발용이고 배포용이 아니기 때문에 안정적인 배포를 위해 Gunicorn 서버를 Django와 연결해야 한다.

  • 웹서버에 동적 페이지 요청이 발생하면 웹 서버는 WSGI 서버를 호출하고 WSGI 서버는 다시 WSGI 애플리케이션을 호출한다. 여기서 알수 있는 중요한 사실은 실제 동적 페이지 요청은 결국 WSGI 애플리케이션이 처리한다는 점이다.

  • WSGI 애플리케이션에는 장고(Django), 플라스크(Flask), 토네이도(Tornado) 등이 있다.

요청 Flow

  1. HTTP requests
  2. Web Server
  3. WSGI Server(Middleware)
  4. Django(WSGI를 지원하는 Web Application)

Gunicorn 구축

  1. gunicorn 설치
    $ pip install gunicorn

  2. gunicorn 으로 서버 구동
    $ gunicorn --bind 0.0.0.0:8888 장고프로젝트이름.wsgi:application

  3. systemd 에 서비스 파일을 등록하여 서버가 재시작할때 gunicorn도 실행되도록 설정

    $ sudo vi /etc/systemd/system/gunicorn.service

  • WorkingDirectory는 프로젝트 루트 폴더
  • ExecStart 설치된 가상환경 gunicorn 경로
  • workers 옵션은 프로세스의 갯수이다. 여러 개의 프로세스로 나눠서 병렬로 처리할 수 있게 된다.
  1. 시스템 데몬 재시작

    $ sudo systemctl daemon-reload

  • 서비스를 새로 등록하거나 수정할 경우 데몬을 리로드 해주어야 한다.
  1. 서비스 실행하고 등록하기
    $ sudo systemctl start gunicorn # 서비스 실행 하기
    $ sudo systemctl enable gunicorn #서버 재시작시 자동으로 실행
    $ sudo systemctl status gunicorn #서비스 상태 보기
    $ sudo systemctl stop gunicorn #서비스 중지
    $sudo systemctl restart gunicorn #서비스 재시작
  1. gunicorn 실행 확인
  • 웹 페이지를 접속해보면 Django 기본 페이지를 확인할 수 있다.

참고
https://wikidocs.net/75556
https://moondol-ai.tistory.com/467
https://leffept.tistory.com/282?category=950490

0개의 댓글