Django runserver는 왜 배포 때 쓰면 안될까?

GYUBIN ·2023년 2월 22일
0

장고 톺아보기

목록 보기
3/3

Java로만 개발하던 지인이 Django를 학습하면서 python manage.py runserver로 서버를 시작하는 것을 보고 Django는 그럼 Tomcat같은 프로그램을 안써도 되는거냐고 물어보았던 기억이 있다.

후에 지인이 AWS에 배포할 때도 runserver를 사용하려해서 배포할 땐 보통 Nginx, Gunicorn을 사용한다고 알려주니 나에게 이유를 물어보았다.

나도 당시 관련 내용에 대한 학습이 부족하여 정확한 이유는 모르지만 runserver는 보안이랑 성능이 떨어져서 개발용으로만 쓰인다고 둘러댔었다.

runserver를 배포할 때 왜 쓰면 안되는지 이유를 알아보자.

1. PRODUCTION에는 쓰지마세요

Django는 친절하게 코드 내 주석과 공식 문서를 통해 runserver를 PRODUCTION 환경에서 쓰지말라고 알려준다.

이유는 아래와 같다.

  1. django.core.servers.basehttp.py

  2. Django Documentation
    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.)

    PRODUCTION SETTING에서 이 서버를 사용하지 마십시오. 보안 감사나 성능 테스트를 거치지 않았습니다. (그리고 그렇게 될 것입니다. 우리는 웹 서버가 아닌 웹 프레임워크를 만드는 사업을 하고 있으므로 이 서버를 프로덕션 환경을 처리할 수 있도록 개선하는 것은 Django의 범위를 벗어납니다.)

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

"보안 감사나 성능 테스트를 거치지 않았다."
"기능이 단순하고 '대량 요청'이나 '동시 요청'을 효율적으로 처리하지 못한다."

즉, Django의 runserver는 개발 단계에서 웹 애플리케이션을 빠르게 개발하고 테스트할 수 있도록 돕기 위해서 제공하는 기능이다.

따라서, 아래와 같은 문제점이 발생한다.

  1. 보안 취약점
    HTTPS 프로토콜을 지원하지 않기 때문에 데이터가 암호화되지 않아 중요한 정보가 노출될 수 있다.

  2. 성능
    runserver는 단일 프로세스로만 동작하기 때문에, 다수의 요청이 동시에 발생하면 처리 속도가 느려질 수 있다.
    간단한 정적 파일을 제공하기 위한 기능을 제공한다.(기능이 제한적이고, 성능이 떨어진다.)

보안적, 성능적으로 효율적이지 못하므로 배포 시에는 별도의 웹 서버가 필요하다는 것이고, 보통 Nginx와 Gunicorn을 같이 사용하게 된다.

2. Nginx와 Gunicorn

위 그림의 내용이 흔히 사용되는 Django 배포 아키텍쳐이다.

Web Server

위키백과
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
웹 서버의 주된 기능은 웹 페이지를 클라이언트로 전달하는 것이다. 주로 그림, CSS, 자바스크립트를 포함한 HTML 문서가 클라이언트로 전달된다.

WSGI(Web Server Gateway Interface)

점프 투 장고
WSGI 서버는 웹서버가 동적 페이지 요청을 처리하기 위해 호출하는 서버이다.
웹서버에 동적 페이지 요청이 발생하면 웹 서버는 WSGI 서버를 호출하고 WSGI 서버는 다시 WSGI 애플리케이션을 호출한다.

WSGI 서버는 항상 프로젝트 폴더의 wsgi.py 파일을 경유하여 장고(django) 프로그램을 호출한다.

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

application = get_wsgi_application()

사용 시 장점

Nginx와 Gunicorn을 함께 사용하면 runserver를 사용하는 것에 비해 안정성과 성능을 개선할 수 있다.

  1. 안정성 개선
    Nginx는 웹 서버로서 Reverse Proxy 역할을 수행할 수 있다.
    이를 이용하여, 웹 어플리케이션 서버가 정상적으로 동작하지 않는 경우, Nginx가 에러를 처리하고 대체 페이지를 제공할 수 있다.
    또한 Nginx는 DDoS 공격과 같은 보안 문제에 대한 대처도 가능합니다.

  2. 성능 개선
    Gunicorn을 사용하면, Python 어플리케이션을 빠르게 처리할 수 있으며, worker 프로세스를 다중화하여 병렬 처리도 가능하다.
    이로써, 웹 어플리케이션의 성능을 개선할 수 있습니다.
    Nginx는 정적 파일을 처리할 수 있는데, 이를 이용하여 Gunicorn이 처리하지 않고 Nginx가 처리하는 정적 파일 처리 기능을 사용하면, 더욱 효율적인 처리가 가능하다.

따라서 Nginx와 Gunicorn을 함께 사용하면, 안정성과 성능 모두를 개선할 수 있으며, 대용량 트래픽이 발생하는 경우에도 웹 어플리케이션의 안정적인 운영이 가능하다.

결론


Django의 runserver는 개발용 웹서버로 제한된 기능을 가지고 있으며 보안과 성능 측면에서 적합하지 않다.
Nginx와 Gunicorn을 함께 사용하여 안정적이고 보안성 높은 웹 어플리케이션을 배포할 수 있다.

결국 글의 시작 부분에서 Java 개발자가 물어봤던 부분에 관한 내용에 답은 배포 시에는 위 그림 처럼 WAS(Tomcat)가 하는 역할을 Nginx와 Gunicorn이 하고 있다는 것이다.

끝 !

0개의 댓글