케미클라우드 ‘Setup Python App’ 장고 배포, 500 에러까지 뚫은 실전 가이드 4편

“Internal Server Error 500”과 함께 시작된 ‘Setup Python App’ 장고 배포
도메인도 연결됐고, 파이썬 3.12 가상환경도 만들었고, settings도 dev/prod로 나눴어요.
이제 남은 건 케미클라우드 Setup Python App 장고 배포만 잘 하면 되는 상황.
그래서 의기양양하게 브라우저에 https:/studymate.secondlife.lol를 치고 엔터를 눌렀는데…
500
Internal Server Error
아무것도 안 알려주는 그 심플한 페이지.
결국 Setup Python App 장고 배포 과정에서
passenger_wsgi.py가 자기 자신을 재귀 로딩하고,.env에 한글이 들어가서 인코딩 에러가 터지고,- 로그를 뒤져가며 하나씩 분해하는 삽질이 시작됐습니다.
이번 4편에서는 그 과정을 정리해서,
누가 봐도 다시 쓸 수 있는 Setup Python App 장고 배포 레시피를 남겨보려고 합니다.

언제 Setup Python App 장고 배포가 좋은 선택일까?

1. 서버 전체를 내가 관리하고 싶진 않을 때
도커, Nginx, Gunicorn, systemd…
이런 걸 다 만지기 싫고, 그냥 장고만 깔끔하게 올리고 싶다면
Setup Python App 장고 배포는 꽤 괜찮은 선택이에요.
- cPanel에서 Python 버전 고르고
- Application root만 지정하면
- 케미클라우드가 알아서 venv와 Passenger까지 묶어 줍니다.
특히 사내벤처처럼 “빨리 보여줘야 하는” 상황에서는
이 장고 배포 방식이 속도 면에서 꽤 큰 장점이 있습니다.
2. 여러 개의 장고 서비스·AI 서비스가 한 서버에 공존할 때
하나의 ChemiCloud 계정에
- 기존 사이트
- 새로운 장고 서비스
- 나중에 추가될 또 다른 AI 서비스
가 같이 있을 수 있죠.
이때 각 서비스마다 별도의 Setup 파이썬 앱 장고 배포를 만들어두면
- venv가 프로젝트별로 분리되고
- 장고 버전, 패키지 버전이 달라도 충돌이 적고
- 도메인/URL도 각각 깔끔하게 관리할 수 있습니다.
3. AI + 장고 조합을 빠르게 실험하고 싶을 때
OpenAI, Claude, Groq 같은 LLM API를 장고에 붙여서
내부용 챗봇이나 분석 도구를 만들 때도,
- 로컬: 빠른 개발
- 서버: Setup Python App 장고 배포로 바로 URL 제공
이 패턴이면 “아이디어 → 실제 웹 데모” 전환 속도가 진짜 빨라집니다.
이때 중요한 건, 배포 단계에서 삽질 시간을 줄이는 거고,
그게 바로 이 글의 목표예요.
Setup Python App 장고 배포 전체 흐름 정리
이제 실제로 했던 Setup 파이썬 앱 장고 배포 과정을
“다시 해도 이대로만 따라가면 된다” 수준으로 정리해볼게요.
1단계. Setup Python App에서 앱 정보 정확히 입력하기

cPanel → Setup Python App → Create Application 에서 다음처럼 설정합니다.
- Python version: 3.12.x
- Application root:
studymate_project - Application URL:
secondlife.lol/ - Application startup file:
passenger_wsgi.py - Application entry point:
application
생성 후 상단에 뜨는 안내:
source /home2/secondlife/virtualenv/studymate_project/3.12/bin/activate && cd /home2/secondlife/studymate_project이 한 줄이 곧 Setup Python App 장고 배포에서 사용할
공식 진입 명령어라고 보면 됩니다.
2단계. SSH에서 venv 진입 + 장고 준비 확인
SSH 접속 후(혹은 터미널 메뉴)
cd /home2/secondlife
source virtualenv/studymate_project/3.12/bin/activate
cd studymate_project
python --version
# Python 3.12.x 확인그리고 실제로 장고가 prod 설정 기준으로 문제 없는지 체크합니다.
DJANGO_SETTINGS_MODULE=config.settings.prod python manage.py check여기서 에러가 없으면 Setup 파이썬앱 장고 배포 입장에서
“Django 설정 자체는 정상”이라는 뜻입니다.
이 상태라면 500 에러가 떠도 대부분은 passenger 설정이나 .env 문제일 가능성이 높아요.
3단계. passenger_wsgi.py를 최소한으로, 그리고 정확하게

처음에는 케미클라우드가 만들어주는 기본 템플릿 그대로 놔둬서load_source('wsgi', 'passenger_wsgi.py') 재귀 지옥에 빠졌습니다 😂
결국 정리된 버전은 아주 단순한 형태의 Setup 파이썬 장고 배포용 passenger_wsgi.py였어요:
import os
import sys
from pathlib import Path
# 프로젝트 루트 (manage.py가 있는 폴더)
BASE_DIR = Path(__file__).resolve().parent
# 프로젝트 루트를 PYTHONPATH에 추가
if str(BASE_DIR) not in sys.path:
sys.path.insert(0, str(BASE_DIR))
# 운영용 settings 모듈 지정
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.prod")
# Django WSGI application 생성
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()포인트는 딱 세 가지입니다.
BASE_DIR를passenger_wsgi.py기준으로 계산sys.path에BASE_DIR추가DJANGO_SETTINGS_MODULE을config.settings.prod로 고정
이 세 가지만 맞으면, Setup Python App 장고 배포에서
WSGI 레벨 문제로 500이 날 확률은 크게 줄어듭니다.
4단계. .env와 base.py – 서버에서 진짜로 잘 읽히는지 확인
이전 3편에서 정리했던 것처럼,config/settings/base.py에서는 다음처럼 .env를 읽도록 했습니다.
from pathlib import Path
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent.parent.parent
env_path = BASE_DIR / ".env"
load_dotenv(env_path)CLI에서는 잘 되는데, Setup 파이썬 앱 장고 배포 환경에서만 500이 날 때,
알고 보니 .env 값에 한글이 섞여 있었고,
Passenger가 돌아가는 OS 인코딩이 ASCII라서 UnicodeEncodeError가 터졌던 거죠.
결론은
.env값에는 한글 넣지 않기- 설명은
#주석으로만 작성 - 값은 영문/숫자/기호만 사용
이렇게 정리하고 나니,DJANGO_SETTINGS_MODULE=config.settings.prod python manage.py check 도 잘 통과하고,
Setup Python App 장고 배포 환경에서도 더 이상 인코딩 에러가 안 났습니다.
5단계. 500 에러와 친해지기 – stderr.log 읽는 습관
Setup Python App 장고 배포에서 500 Internal Server Error가 뜨면
화면에는 정보가 거의 안 나오기 때문에,
결국 로그를 직접 보는 습관이 중요합니다.
프로젝트 루트(studymate_project)에 stderr.log가 있었다면 Terminal에서
cd /home2/secondlife/studymate_project
tail -n 40 stderr.log이렇게 해서 맨 아래 40줄 정도를 보면,
ModuleNotFoundError: No module named 'jazzmin'ModuleNotFoundError: No module named 'allauth'.env UnicodeEncodeError- settings import 에러
같은 것들이 줄줄이 찍혀 있죠.
이걸 아래와 같이 하나씩 해결하면서
pip install django-jazzminpip install django-allauth.env값 정리- settings 경로 수정
을 반복하니까, 어느 순간 tail -n 40 stderr.log 가 조용해지고,
브라우저에서 https://studymate.secondlife.lol가 딱 열리더라구요.
이 전체 과정이 사실상 Setup 파이썬 앱 장고 배포 실전 튜토리얼이었습니다.
6단계. 마지막으로 Restart 잊지 않기
passenger_wsgi.py, .env, settings를 고친 뒤에는
항상 Setup Python App 장고 배포 화면에서 Restart를 눌러줘야 합니다.
- cPanel → Setup Python App
- Studymate 앱 선택
- 상단의 Restart 클릭
이걸 안 누르면 Passenger가 옛날 코드를 계속 물고 있어서,
“분명 고쳤는데 왜 그대로지?”라는 착시가 옵니다.
정리: Setup Python App 장고 배포, 이렇게만 기억해도 충분하다
짧게 요약하면, 이번 포스트는 이렇게 정리됩니다.
- Setup Python App에서 Python 3.12 + Application root 지정
- SSH 혹은 터미널 에서 venv 진입 →
python manage.py check로 상태 확인 passenger_wsgi.py는 최소한의 코드만 유지 (재귀 템플릿 제거).env는 BASE_DIR에서 로딩, 값에는 한글 X- 에러 나면
stderr.log를tail -n 40으로 확인 - 수정 후에는 꼭 Restart
이걸 한 번 제대로 겪어 보면,
다음 장고 프로젝트에서 Setup Python App 장고 배포는
정말 “루틴 작업”처럼 느껴질 거예요.






