タイトル: 開発用サーバー(Windows)
SEOタイトル: Django runserver の使い方と本番運用 — ポート/IP/autoreload/gunicorn 移行
| この記事の要点 |
|
基本: 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 の指定
| コマンド | 説明 |
|---|---|
runserver | 127.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 [::]:8000 | IPv6 全インタフェース |
runserver --insecure | DEBUG=False でも static を配信(検証用) |
runserver --noreload | autoreload 無効化 |
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 | 特徴 |
|---|---|---|
| gunicorn | Linux/macOS | 定番。 シンプル、 nginx 連携 |
| uWSGI | Linux/macOS | 高機能、 設定多い |
| Waitress | Windows / クロスプラットフォーム | ピュア Python、 Windows でも動く |
| uvicorn + Gunicorn | Linux | ASGI (非同期) 対応 |
| Hypercorn | Linux | ASGI、 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 failed | CSRF_TRUSTED_ORIGINS にオリジン追加 |
| 変更が反映されない | autoreload が監視外。 サーバ手動再起動 |
| 静的ファイル 404 | DEBUG=True 確認 / django.contrib.staticfiles 有効化 |
FAQ
Q: runserver で複数ワーカーを使いたい
A: 設計上不可能。 並列処理が必要なら gunicorn / Waitress に切替。
Q: HTTPS で動かしたい
A: runserver では非対応。 django-extensions の runserver_plus でセルフ署名証明書での HTTPS が可能。 本番は nginx 等で TLS 終端。
Q: Windows サービスとして runserver を動かせる?
A: 不可。 Waitress + NSSM で Windows サービス化するのが定番。