6.

Django runserver の使い方と本番運用 — ポート/IP/autoreload/gunicorn 移行

編集
この記事の要点
  • Django の開発用サーバは python manage.py runserver。 デフォルトは 127.0.0.1:8000
  • ポート変更は runserver 8080、 外部からアクセスさせるなら runserver 0.0.0.0:8000 + ALLOWED_HOSTS 設定
  • autoreload 機能でファイル変更時に自動再起動。 デバッグに便利だが Windows では遅いことがある
  • 本番投入禁止: シングルスレッド、 静的ファイル配信が遅い、 セキュリティ未強化 → gunicorn / uWSGI / Waitress 使用
  • Windows 本番では Waitress(ピュア Python WSGI)が現実的。 Linux 本番は gunicorn + nginx 構成が定番

基本: runserver コマンド

# 仮想環境を有効化してから
(env) PS C:\dev\mysite> python manage.py runserver

# 出力例
# Watching for file changes with StatReloader
# Performing system checks...
# System check identified no issues (0 silenced).
# Django version 5.0.x, using settings 'config.settings'
# Starting development server at http://127.0.0.1:8000/
# Quit the server with CTRL-BREAK.

ブラウザで http://127.0.0.1:8000/ を開いて確認します。 停止は Ctrl + C(Windows では Ctrl + Break もあり)。

ポート・IP の指定

コマンド説明
runserver127.0.0.1:8000 (デフォルト)
runserver 8080ポート変更 (127.0.0.1:8080)
runserver 0.0.0.0:8000全ネットワークインタフェース
runserver 192.168.1.10:8000特定 IP のみ
runserver [::]:8000IPv6 全インタフェース
runserver --insecureDEBUG=False でも static を配信(検証用)
runserver --noreloadautoreload 無効化
runserver --nothreadingシングルスレッドモード

外部からアクセスさせる

# settings.py
ALLOWED_HOSTS = [
    '127.0.0.1',
    'localhost',
    '192.168.1.10',           # LAN 内 IP
    'mysite.local',           # hosts に書いたホスト名
]

# DEBUG=True 時は ALLOWED_HOSTS が空でも localhost は通る
DEBUG = True
# Windows ファイアウォール許可(管理者 PowerShell)
New-NetFirewallRule -DisplayName "Django Dev 8000" `
    -Direction Inbound `
    -LocalPort 8000 `
    -Protocol TCP `
    -Action Allow

# 起動
python manage.py runserver 0.0.0.0:8000

# 別端末から http://<PC の IP>:8000/ でアクセス

autoreload の仕組み

runserver はファイル変更を監視して自動で Python プロセスを再起動します。 開発中に .py を保存するだけで反映されるので便利です。

# 監視対象
# - すべての INSTALLED_APPS の .py
# - settings.py
# - urls.py
# - テンプレート (Django 1.7+ の TEMPLATES['OPTIONS']['debug'] = True 等で再描画)

# 監視されないもの
# - 静的ファイル (CSS / JS / 画像) → ブラウザリロードで対応
# - .env や conf 等の非 Python ファイル
# - マイグレーションは自動実行されない → python manage.py migrate 手動

# autoreload を切る
python manage.py runserver --noreload

# Watchman (高速ファイル監視) 利用(macOS/Linux)
pip install pywatchman

runserver の制限事項

Django 公式ドキュメントに明記されている通り、 runserver は本番に使ってはいけません。 理由:

  • シングルスレッド(デフォルト): 同時接続でブロックされやすい
  • 静的ファイル配信が遅い: 開発便宜のための実装
  • セキュリティ未強化: HTTP リクエストの厳密検証なし
  • HTTPS 非対応: TLS 終端なし
  • WSGI 完全準拠ではない: 本番 WSGI サーバとの動作差異
  • パフォーマンス低い: gunicorn の数十分の 1

本番用 WSGI サーバ

サーバOS特徴
gunicornLinux/macOS定番。 シンプル、 nginx 連携
uWSGILinux/macOS高機能、 設定多い
WaitressWindows / クロスプラットフォームピュア Python、 Windows でも動く
uvicorn + GunicornLinuxASGI (非同期) 対応
HypercornLinuxASGI、 HTTP/2 対応

Linux: gunicorn + nginx

# Linux サーバ上で
pip install gunicorn

# 起動
gunicorn config.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3 \
    --access-logfile /var/log/django/access.log \
    --error-logfile /var/log/django/error.log

# 通常は systemd + nginx で運用
# /etc/systemd/system/gunicorn.service
[Unit]
Description=Gunicorn for Django
After=network.target

[Service]
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/var/www/mysite/env/bin/gunicorn config.wsgi:application --bind unix:/run/gunicorn.sock

[Install]
WantedBy=multi-user.target

Windows: Waitress

# Windows サーバ用
pip install waitress

# 起動
waitress-serve --port=8000 config.wsgi:application

# または Python から
# serve.py
from waitress import serve
from config.wsgi import application

serve(application, host='0.0.0.0', port=8000, threads=8)

# 実行
python serve.py

# IIS 経由なら HttpPlatformHandler でラップ可能
# Windows サービス化は NSSM (Non-Sucking Service Manager) が定番

静的ファイル配信

本番では Django ではなく nginx / Apache / IIS / CDN から配信します:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'   # collectstatic の出力先

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

# 本番デプロイ時
# python manage.py collectstatic --noinput
# → staticfiles/ に全 static を集約
# → nginx で /static/ → /var/www/mysite/staticfiles/ に alias

IPv6 対応

# IPv6 で listen
python manage.py runserver [::]:8000

# 特定 IPv6 アドレス
python manage.py runserver [::1]:8000

# settings.py の ALLOWED_HOSTS にも追加
ALLOWED_HOSTS = ['*']            # 開発時のみ。 本番は明示

よくあるエラー

症状対処
Error: That port is already in useポート競合。 別ポート指定 or 占有プロセス停止 (netstat -ano | findstr :8000)
DisallowedHost at /ALLOWED_HOSTS に該当ホスト追加
CSRF verification failedCSRF_TRUSTED_ORIGINS にオリジン追加
変更が反映されないautoreload が監視外。 サーバ手動再起動
静的ファイル 404DEBUG=True 確認 / django.contrib.staticfiles 有効化

FAQ

Q: runserver で複数ワーカーを使いたい
A: 設計上不可能。 並列処理が必要なら gunicorn / Waitress に切替。

Q: HTTPS で動かしたい
A: runserver では非対応。 django-extensionsrunserver_plus でセルフ署名証明書での HTTPS が可能。 本番は nginx 等で TLS 終端。

Q: Windows サービスとして runserver を動かせる?
A: 不可。 Waitress + NSSM で Windows サービス化するのが定番。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法(Windows)
  2. インストール方法(Linux/Mac)
  3. プロジェクトの作成方法(Windows)
  4. プロジェクトの作成方法(Mac)
  5. アプリケーションの作成方法
  6. 開発用サーバー(Windows)
  7. 開発用サーバー(Mac)