[장고] 파이썬애니웨어 배포하기
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 설정
배포 환경에 맞춰 설정합니다.
생성하기
- 콘솔을 끄고 상단 메뉴에서 Web을 클릭합니다.
- 출력되는 웹 페이지에서 Add a new web app을 클릭합니다.
- 도메인 주소를 사용할지 묻습니다. 나중에 도메인을 변경하려면 새로 시작해야 합니다. 기본으로 제공하는 도메인 주소를 사용하려면 다음으로 넘어갑니다. 도메인을 사용하려면 유료 계정으로 업그레이드해야 합니다.
- Manual configuration을 클릭합니다.
- 자신이 개발했었던 Python 버전을 클릭합니다.
- 다음 버튼을 누릅니다.
※ 카드 등록 시 이름을 띄어쓰기 없이 입력해야 정상적으로 카드가 등록된다.
도메인 연결
도메인 연결 방법은 간단합니다. 위쪽에 DNS setup이 있습니다.
- 타입: CNAME
- 호스트: www
- 값/위치: PythonAnywhere에서 제공한 CNAME 값
- TTL: 임의로
이렇게 입력하면 됩니다. 적용되기까지 다소 시간이 걸립니다.
위치 설정
Source code에 압축을 풀었던 폴더의 위치를 입력합니다.
예시:
- /home/username/yourprojectname_project/yourprojectname
가상환경 폴더의 위치도 입력합니다.
예시:
- /home/username/yourprojectname_project/venv
Static 파일 위치도 입력합니다.
예시:
- URL: /static/
- Directory: /home/username/yourprojectname_project/yourprojectname/static
Media 파일을 업로드한다면 Media 위치도 입력합니다.
예시:
- URL: /media/
- Directory: /home/username/yourprojectname_project/yourprojectname/media
WSGI 설정
- Code에서 /var/www/[주소]_wsgi.py를 클릭합니다.
- 아래 부분을 드래그하여 주석 처리합니다.
- 아래로 내리면 Django로 시작되는 코드의 일부분이 있습니다. import os부터 주석 처리를 해제합니다.
그리고 두 군데 값을 변경합니다.
- path에 자신의 프로젝트 위치를 입력합니다.
path = '/home/username/yourprojectname_project/yourprojectname'
- os.environ에서 mysite 대신 프로젝트 이름을 입력합니다.
os.environ['DJANGO_SETTINGS_MODULE'] = 'yourprojectname.settings'
맨 위에 있는 저장 버튼을 누릅니다.
도메인 설정
Web 페이지 상단에 CNAME을 제공합니다. 호스팅 업체 사이트에서 레코드 값을 아래와 같이 입력합니다.
- 호스트 이름: www
- 유형: CNAME
- TTL: 3600
- 데이터: [PythonAnywhere가 제공한 CNAME 값]
Reload 버튼을 클릭하면 변경한 사항들이 서버에 반영됩니다.
결론
이 가이드를 통해 Django 프로젝트를 PythonAnywhere에 배포하는 전체 과정을 살펴보았습니다. 회원가입부터 시작해 웹 애플리케이션 설정, 데이터베이스 연결, 정적 파일 처리, 가상환경 구성, 도메인 연결, WSGI 설정까지 모두 단계별로 안내했습니다. PythonAnywhere는 저렴하고 사용하기 쉬워, 초보자도 손쉽게 배포를 할 수 있는 플랫폼입니다. 이 가이드를 참고하여 여러분의 Django 프로젝트를 성공적으로 배포하시길 바랍니다.