Django をプロダクションに展開するには、適切な WSGI/ASGI サーバー と Web サーバー の背後で実行し、静的ファイルを正しく提供し、設定をセキュアにし、データベースを管理する必要があります。これは組み込みの開発サーバー (プロダクション用に設計されていない) とは大きく異なります。
プロダクション スタック
Client → NGINX (web server) → GUNICORN (WSGI app server) → DJANGO
│ (runs your Python app, multiple workers)
└─ serves static/media files directly (efficient)
❌ NEVER use `python manage.py runserver` in production — it's single-threaded,
insecure, and not built for load. Use Gunicorn (WSGI) or Uvicorn (ASGI for async).
開発サーバーはプロダクションに適していません。標準的なスタックは、複数のワーカーで Django を実行する アプリケーション サーバー (WSGI 用の Gunicorn/uWSGI、ASGI/非同期用の Uvicorn) を、受け入れ接続、TLS、静的ファイルを処理する Web サーバー (nginx) の背後に配置します。
プロダクション設定 (セキュリティが重要)
DEBUG = False # ❗ MUST be False — DEBUG=True leaks sensitive info
ALLOWED_HOSTS = ["example.com"] # required when DEBUG=False
SECRET_KEY = os.environ["SECRET_KEY"] # from the environment, NOT committed
SECURE_SSL_REDIRECT = True # force HTTPS
SESSION_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
静的ファイル
python manage.py collectstatic # gather static files into STATIC_ROOT
# then serve them via nginx or a CDN — or use WhiteNoise to serve them from the app
# (Django does NOT serve static files itself in production)
データベースとマイグレーション
python manage.py migrate # apply migrations to the production DB
# use a real database (PostgreSQL), connection pooling, regular backups
典型的な展開チェックリスト
1. Set production environment variables (SECRET_KEY, DB credentials, DEBUG=False)
2. Run migrations (manage.py migrate)
3. Collect static files (collectstatic) → serve via nginx/CDN/WhiteNoise
4. Run the app with Gunicorn/Uvicorn (multiple workers, behind nginx)
5. Enable HTTPS (TLS certificates, e.g. Let's Encrypt)
6. Set up logging, error monitoring (Sentry), health checks
7. Add a process manager (systemd/supervisor) or use containers (Docker) + orchestration
8. Run `manage.py check --deploy` to audit security settings
現代的な展開アプローチ
✓ Containers (Docker) + orchestration (Kubernetes) or platforms (Heroku, Railway, Render)
✓ Managed databases, separate static/media storage (S3 + CDN)
✓ Background workers (Celery) + a broker (Redis) as separate services
✓ Horizontal scaling: multiple app instances behind a load balancer (keep app STATELESS)
なぜ重要なのか
Django をプロダクションに正しく展開することは、アプリケーションを開発から実世界での使用に進める際の本質的な知識であり、ローカル開発とは根本的に異なる重要な考慮事項を含んでいます。間違えるとセキュリティ脆弱性、パフォーマンス低下、またはアプリケーションの破損につながります。
プロダクション スタック を理解することは基盤となります。組み込みの開発サーバー (runserver) は明示的にプロダクション用ではありません (シングルスレッド、安全でなく、負荷に対応できません)。そのため、Django を適切な アプリケーション サーバー (WSGI 用の Gunicorn/uWSGI、または ASGI/非同期用の Uvicorn) の背後で複数のワーカーで実行し、接続、TLS、静的ファイル提供を処理する Web サーバー (nginx) で実行する必要があります。
いくつかの側面はセキュリティと正確性が重要です。プロダクション設定 (DEBUG=False は必須。DEBUG=True は機密のトレースバックと設定をアタッカーに漏らすため、plus ALLOWED_HOSTS、環境からの秘密の SECRET_KEY、HTTPS 強制)、静的ファイル処理 (collectstatic を実行し、nginx/CDN/WhiteNoise 経由でファイルを提供。Django はプロダクションではそれ自体を提供しません。これは一般的な展開障害です)、データベース管理 (PostgreSQL などの実際のデータベース、マイグレーション適用、バックアップ)。
展開チェックリスト、最新のアプローチ (Docker/コンテナ、マネージド プラットフォーム、メディア用のクラウド ストレージ、別サービスとしての Celery ワーカー、ステートレス アプリによる水平スケーリング)、運用上の懸念 (ログ、Sentry によるモニタリング、ヘルス チェック、プロセス管理) を知ることは、動作するプロダクション展開と脆弱または安全でない展開を区別するものです。
すべての実際の Django アプリケーションは最終的に展開される必要があり、展開の誤り (DEBUG=True のまま、静的ファイルの処理ミス、シークレット露出、開発サーバーの使用) は実際のセキュリティと信頼性の問題を引き起こすため、Django をプロダクションに正しく展開する方法を理解することは重要です。スタック、セキュリティが重要な設定、静的/メディア処理、現代的な展開プラクティスの理解は、プロダクション対応アプリケーションを提供する能力を反映する高リスクで高頻度に関連する、ライブ システムを担当する Django 開発者にとって専門的に不可欠なトピックです。
