πŸš€ [SWS] Django ν”„λ‘œλ•μ…˜ μ„œλ²„ μ„€μΉ˜ κ°€μ΄λ“œ 🌟

이 κ°€μ΄λ“œλŠ” 개발 μ„œλ²„λ₯Ό ν”„λ‘œλ•μ…˜ ν™˜κ²½μœΌλ‘œ μ „ν™˜ν•˜λŠ” 방법을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.


πŸ•’ μ†Œμš” μ‹œκ°„: μ•½ 10λΆ„
πŸ”‘ ν•„μˆ˜ 쑰건: Django 개발 μ„œλ²„ μ„€μΉ˜ μ™„λ£Œ βœ…
πŸ‘₯ λŒ€μƒ: Shop2World μ›Ήμ„œλΉ„μŠ€ μ‚¬μš©μž
*chroot ν™˜κ²½μ˜ μƒ΅νˆ¬μ›”λ“œ μ›Ήμ„œλΉ„μŠ€ 이용 고객은 μ•„λž˜μ˜ ν„°λ―Έλ‚  기반 μž‘μ—…μ€ 별도 κ΄€λ¦¬μž μš”μ²­ ν•„μš”ν•©λ‹ˆλ‹€.


1️⃣ passenger_wsgi.py 파일 생성 및 μ„€μ • πŸ“‚

πŸ“Œ 파일 μœ„μΉ˜: Django ν”„λ‘œμ νŠΈ 루트 디렉토리 (예: manage.pyκ°€ μžˆλŠ” μœ„μΉ˜)

μ•„λž˜ λ‚΄μš©μ„ μƒˆ 파일 passenger_wsgi.py에 μž‘μ„±ν•˜μ„Έμš”:

# -*- coding: utf-8 -*-
import os
import sys

# κ°€μƒν™˜κ²½ Python 경둜
# 예: INTERP = "/var/www/vhosts/mysite.com/django.mysite.com/venv/bin/python"
INTERP = "/var/www/vhosts/[도메인]/[μ„œλΈŒλ„λ©”μΈ]/venv/bin/python"
if sys.executable != INTERP:
    os.execl(INTERP, INTERP, *sys.argv)

# Django μ„€μ •
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings'

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

πŸ“Œ μ°Έκ³ :

  • κ°€μƒν™˜κ²½μ˜ Python μ ˆλŒ€ 경둜λ₯Ό INTERP에 μ •ν™•νžˆ μž…λ ₯ν•˜μ„Έμš”.
    • 경둜λ₯Ό 찾으렀면 μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ„Έμš”: which python

2️⃣ settings.py ν”„λ‘œλ•μ…˜ μ„€μ • πŸ”’

πŸ“‚ 파일 μœ„μΉ˜: config/settings.py

μ•„λž˜μ™€ 같이 ν”„λ‘œλ•μ…˜μš© 섀정을 μΆ”κ°€ λ˜λŠ” μˆ˜μ •ν•˜μ„Έμš”:

# DEBUG λͺ¨λ“œ λΉ„ν™œμ„±ν™”
DEBUG = False

# ν—ˆμš©λœ 호슀트 μ„€μ •
ALLOWED_HOSTS = ['μ„œλΈŒλ„λ©”μΈ', 'www.μ„œλΈŒλ„λ©”μΈ']

# λ³΄μ•ˆ μ„€μ • ν™œμ„±ν™”
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

3️⃣ URL μ„€μ •: κ΄€λ¦¬μž νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈ 🌐

πŸ“‚ 파일 μœ„μΉ˜: config/urls.py

from django.contrib import admin
from django.urls import path
from django.views.generic import RedirectView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', RedirectView.as_view(url='/admin/', permanent=True)),
]

4️⃣ 정적 파일 μ„€μ • πŸ“

  1. 정적 파일 μˆ˜μ§‘ python manage.py collectstatic
  2. 디렉토리 κΆŒν•œ μ„€μ • chmod 755 static media staticfiles chmod 755 passenger_wsgi.py

5️⃣ tmp 디렉토리 생성 πŸ› οΈ

mkdir -p tmp
chmod 755 tmp

6️⃣ ν˜ΈμŠ€νŒ… κ΄€λ¦¬μžμ—κ²Œ μš”μ²­ πŸ™‹

μ•„λž˜ λ‚΄μš©μ„ ν˜ΈμŠ€νŒ… κ΄€λ¦¬μžμ—κ²Œ μ „λ‹¬ν•˜μ„Έμš”:

  1. μ„œλΈŒλ„λ©”μΈ 생성 확인
    • μ„œλΈŒλ„λ©”μΈμ΄ μ œλŒ€λ‘œ ν™œμ„±ν™”λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  2. Passenger App Root μ„€μ •
    • 경둜: /var/www/vhosts/[도메인]/[μ„œλΈŒλ„λ©”μΈ]
  3. μžλ™ μƒμ„±λœ index.html μ‚­μ œ
    • Passenger λ™μž‘μ„ λ°©ν•΄ν•˜λŠ” κΈ°λ³Έ ν…œν”Œλ¦Ώ 파일이 μ‚­μ œλ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. cd /var/www/vhosts/[도메인]/[μ„œλΈŒλ„λ©”μΈ] rm -f index.html
  4. SSL μΈμ¦μ„œ μ„€μ • 확인
    • HTTPSκ°€ 정상 μž‘λ™ν•˜λ„λ‘ SSL μΈμ¦μ„œκ°€ μ μš©λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

7️⃣ μ„œλ²„ μž¬μ‹œμž‘ πŸ”„

ν˜ΈμŠ€νŒ… κ΄€λ¦¬μžκ°€ 섀정을 μ™„λ£Œν•œ ν›„ Passengerλ₯Ό μž¬μ‹œμž‘ν•˜μ„Έμš”:

touch tmp/restart.txt

8️⃣ 확인 및 디버깅 πŸ”

  1. λΈŒλΌμš°μ €μ—μ„œ 접속
    • URL: https://[μ„œλΈŒλ„λ©”μΈ]
  2. ν•œκΈ€ 인코딩 였λ₯˜ ν•΄κ²°
    • passenger_wsgi.py 파일 상단에 λ‹€μŒ 인코딩 선언이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”: # -*- coding: utf-8 -*-

μΆ”κ°€ μ œμ•ˆ

  1. κ°€μƒν™˜κ²½ 경둜 확인:
    κ°€μƒν™˜κ²½μ΄ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ§€ μ•ŠμœΌλ©΄ μ„œλ²„κ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. which python λͺ…λ Ήμ–΄λ‘œ ν™•μΈν•˜μ„Έμš”.
  2. 둜그 디버깅 ν™œμ„±ν™”:
    μ—λŸ¬κ°€ λ°œμƒν•  경우 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”: tail -f /var/www/vhosts/[도메인]/logs/error_log
  3. 정적 파일 캐싱:
    정적 파일 μš”μ²­ μ„±λŠ₯을 κ°œμ„ ν•˜λ €λ©΄ Nginx 같은 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ„€μ •ν•˜μ„Έμš”.