[장고] 파이썬애니웨어 배포하기

소요 시간: 10분

Django 프로젝트를 성공적으로 배포하는 것은 웹 개발의 중요한 단계입니다. 이 글에서는 PythonAnywhere를 활용하여 Django 프로젝트를 배포하는 방법을 단계별로 안내합니다. PythonAnywhere는 Google, Amazon과 같은 대형 호스팅 서비스에 비해 저렴하고, 초보자도 쉽게 사용할 수 있는 장점이 있습니다. 회원가입부터 웹 애플리케이션 설정, 데이터베이스 연결, 정적 파일 처리, 가상환경 구성, 도메인 연결, WSGI 설정까지 모든 과정을 상세히 다룹니다. 이 가이드를 통해 누구나 쉽게 Django 프로젝트를 배포할 수 있습니다.


Pythonanywhere

PythonAnywhere는 Google, Amazon과 같은 호스팅 서비스로, 초보자도 쉽게 배포할 수 있습니다. PythonAnywhere에서 서버를 작동시키는 것은 내 컴퓨터에서 테스트 서버를 작동하는 것과 크게 다르지 않습니다. 다만, 각 호스팅 서비스마다 배포 과정이 다를 수 있습니다.

PythonAnywhere는 가격이 저렴한 편입니다. Google과 Amazon은 월 요금이 30만 원에서 100만 원 이상이지만, PythonAnywhere는 기본적으로 무료로 제공되어 테스트하기에 좋습니다. 도메인 사용 등 여러 서비스를 추가해도 월 5달러, 12달러, 99달러로 부담이 적으며, 사용 목적에 따라 요금을 조정할 수 있습니다. 다만, 서버가 영국에 있어 한국에 서버가 있는 Google과 Amazon에 비해 처리 속도가 느릴 수 있습니다. 하지만 사이트 규모가 작다면 이 정도 속도는 충분합니다.


회원가입

PythonAnywhere에 가입 후 로그인합니다. Beginner 계정으로 만들면 실제 배포에는 몇 가지 제한(예: 개인 도메인 사용 불가)이 있지만, 무료로 테스트하기에 부담이 없습니다.


소개

PythonAnywhere의 주요 기능을 살펴보겠습니다.

Dashboard

모든 기능이 한 페이지에 모여 있습니다.

Consoles

윈도우의 PowerShell, 맥의 Terminal과 유사합니다. 시스템 명령어 혹은 Python 명령어를 직접 입력해 서버를 제어합니다.

Files

서버에 파일을 업로드하거나 관리할 수 있습니다.

Notebooks

Jupyter Notebook처럼 데이터 분석이 가능하지만, 유료 서비스입니다.

Web apps

여러 개의 웹사이트를 만들고 관리할 수 있는 곳입니다.


배포하기

1. 배포 모드로 설정 변경

settings.py에서 DEBUG를 False로 변경합니다.

# settings.py
DEBUG = False

호스트를 추가합니다.

ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']

만약 도메인이 있다면 pythonanywhere.com 대신 추가합니다.

ALLOWED_HOSTS = ['127.0.0.1', 'your_domain_name.com']

데이터베이스 변경

배포용으로 사용할 데이터베이스를 변경합니다. 테스트용으로 db.sqlite3을 사용한다면 이 단계를 넘어갑니다. MySQL을 사용한다면 먼저 PythonAnywhere에서 MySQL을 생성하고 Django 설정에서 연동합니다.

정적 파일 설정

정적 파일의 경로를 Django에게 알려줍니다. if문으로 경로를 개발용과 배포용으로 나눕니다.

# settings.py
if DEBUG:
    # for development
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
else:
    # for production
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Django는 개발 모드에서 STATICFILES_DIRS를, 배포 모드에서 STATIC_ROOT를 정적 파일의 경로로 사용합니다.

정적 파일 모아주기

정적 파일들을 한 곳으로 모읍니다.

$ python3 manage.py collectstatic

Django는 웹서버가 아니므로, 실질적으로 사용자에게 정적 파일을 제공하지 않습니다. collectstatic 명령을 통해 프로젝트 내에 흩어져 있는 정적 파일을 한군데에 모은 뒤 서버로 복사합니다.

※ Static 파일을 왜 모아줘야 하는 걸까?

Django는 실질적으로 웹서버가 아니라 웹 애플리케이션을 개발하는 프레임워크입니다. 웹 애플리케이션은 웹서버가 받은 요청을 넘겨주면, 로직에 맞추어 데이터를 처리한 후 웹서버에게 돌려주어 사용자에게 응답하게 하는 역할을 합니다.

사실 사용자에게 응답하는 것은 웹서버 자체에서 할 수 있습니다. 굳이 웹 애플리케이션에서 처리할 필요가 없으며, 오히려 웹 애플리케이션을 거치게 되면 wsgi(웹서버와 웹 애플리케이션 간의 통신을 위한 인터페이스)를 거쳐야 하므로 비효율적인 로직이 하나 더 늘어나게 됩니다.

Django에서는 static 파일을 직접 처리하는 기능을 제공하지 않습니다. 대신, 프로젝트를 실제로 배포할 때는 collectstatic 명령어를 통해 프로젝트 내에 흩어져 있는 static 파일들(각각의 앱에 딸린 static 폴더)을 한곳에 모은 뒤 서버로 복사합니다. 이렇게 모으는 과정을 거치면, 실제 배포되는 웹서버는 웹 애플리케이션이 복사해준 static 파일들을 저장한 뒤 클라이언트의 요청에 직접 응답할 수 있습니다.

이를 통해 웹서버는 static 파일을 효율적으로 관리하고 제공할 수 있으며, 웹 애플리케이션의 성능 저하를 방지할 수 있습니다.


코드 업로드

설정 변경이 완료되었으면 프로젝트 폴더를 압축합니다. Mac에서는 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하여, Windows에서는 알집으로 압축합니다. 가상환경 폴더는 꼭 제외해야 합니다. 가상환경과 라이브러리는 PythonAnywhere의 콘솔로 직접 설치합니다.

PythonAnywhere 사이트에서 상단 메뉴의 Files를 클릭하고 Upload a file을 클릭하여 압축한 파일을 업로드합니다. Open bash console here를 클릭하여 콘솔 창을 엽니다. 다른 프로젝트와 구분하도록 새 폴더를 만듭니다.

$ mkdir yourprojectname_project

압축 파일을 새 폴더로 옮깁니다.

$ mv yourprojectname.zip yourprojectname_project

콘솔 창에서 압축을 해제합니다.

$ unzip yourprojectname.zip

가상환경 만들기

PythonAnywhere의 장점은 내 컴퓨터 환경과 같다는 것입니다. 로컬 컴퓨터에 설치된 Python 라이브러리 설치 목록을 생성합니다.

# venv는 가상환경 이름
$ source venv/bin/activate
(venv) $ pip3 freeze > requirements.txt

requirements.txt 파일을 yourprojectname 폴더에 업로드합니다. PythonAnywhere 콘솔 창으로 돌아와 가상환경을 만듭니다.

$ python3 -m venv venv

가상환경을 활성화하고 pip을 최신 버전으로 업그레이드합니다.

$ source venv/bin/activate
(venv) $ pip3 install --upgrade pip

한 번에 설치합니다.

$ pip3 install -r requirements.txt


Web 설정

배포 환경에 맞춰 설정합니다.

생성하기

  1. 콘솔을 끄고 상단 메뉴에서 Web을 클릭합니다.
  2. 출력되는 웹 페이지에서 Add a new web app을 클릭합니다.
  3. 도메인 주소를 사용할지 묻습니다. 나중에 도메인을 변경하려면 새로 시작해야 합니다. 기본으로 제공하는 도메인 주소를 사용하려면 다음으로 넘어갑니다. 도메인을 사용하려면 유료 계정으로 업그레이드해야 합니다.
  4. Manual configuration을 클릭합니다.
  5. 자신이 개발했었던 Python 버전을 클릭합니다.
  6. 다음 버튼을 누릅니다.

※ 카드 등록 시 이름을 띄어쓰기 없이 입력해야 정상적으로 카드가 등록된다.

도메인 연결

도메인 연결 방법은 간단합니다. 위쪽에 DNS setup이 있습니다.

이렇게 입력하면 됩니다. 적용되기까지 다소 시간이 걸립니다.

위치 설정

Source code에 압축을 풀었던 폴더의 위치를 입력합니다.

예시:

가상환경 폴더의 위치도 입력합니다.

예시:

Static 파일 위치도 입력합니다.

예시:

Media 파일을 업로드한다면 Media 위치도 입력합니다.

예시:

WSGI 설정

  1. Code에서 /var/www/[주소]_wsgi.py를 클릭합니다.
  2. 아래 부분을 드래그하여 주석 처리합니다.
  3. 아래로 내리면 Django로 시작되는 코드의 일부분이 있습니다. import os부터 주석 처리를 해제합니다.

그리고 두 군데 값을 변경합니다.

  1. path에 자신의 프로젝트 위치를 입력합니다.
    path = '/home/username/yourprojectname_project/yourprojectname'
  2. os.environ에서 mysite 대신 프로젝트 이름을 입력합니다.
    os.environ['DJANGO_SETTINGS_MODULE'] = 'yourprojectname.settings'

맨 위에 있는 저장 버튼을 누릅니다.

도메인 설정

Web 페이지 상단에 CNAME을 제공합니다. 호스팅 업체 사이트에서 레코드 값을 아래와 같이 입력합니다.

Reload 버튼을 클릭하면 변경한 사항들이 서버에 반영됩니다.


결론

이 가이드를 통해 Django 프로젝트를 PythonAnywhere에 배포하는 전체 과정을 살펴보았습니다. 회원가입부터 시작해 웹 애플리케이션 설정, 데이터베이스 연결, 정적 파일 처리, 가상환경 구성, 도메인 연결, WSGI 설정까지 모두 단계별로 안내했습니다. PythonAnywhere는 저렴하고 사용하기 쉬워, 초보자도 손쉽게 배포를 할 수 있는 플랫폼입니다. 이 가이드를 참고하여 여러분의 Django 프로젝트를 성공적으로 배포하시길 바랍니다.

장고 리스트