TL;DR
- Djangoの開発サーバーはあくまで開発用、プロダクション環境では使わないこと
- プロダクション環境では、GunicornやuWSGIなどのWSGIサーバーを使うこと
Djangoの開発サーバー
Djangoには、runserver
で起動できるWebサーバーが付属しています。
この開発サーバーはPythonで書かれており、またアプリケーションを変更しても(ある程度)リロードしてくれる、開発中に便利なツールになっています。
開発サーバーをプロダクション環境では使わないこと
この開発サーバーをプロダクション環境で利用することは、推奨されていません。というか、禁止されています。絶対に使うな、という感じです。
ここでちょっと注意しておきましょう。このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。
Now’s a good time to note: don’t use this server in anything resembling a production environment. It’s intended only for use while developing. (We’re in the business of making Web frameworks, not Web servers.)
なのですが、この開発サーバーをプロダクション環境で使ってはいけないの?他のサーバーとなにが違うんですか?という質問はややあるようです。
Why should I use nginx server or apache on production vps but not just manage.py runserver?
Is it OK to use "python manage.py runserver" in production?
別にミドルウェアなどを用意する手間が嫌だ、みたいな話なんでしょうかね。
でも、パフォーマンス出ませんよ、と。
WSGIサーバーを使おう
では、開発サーバーを使わない場合はどうするの?という話ですが、GunicornやuWSGIなどのWSGIサーバーを使い、こちらにアプリケーションをデプロイします。
さらに言うと、これらのWSGIサーバーの前段にリバースプロキシとしてnginxなどのWebサーバーを配置することが推奨されています。
自身で困ったこと
で、なんでこういう記事を書いたかというと、身の回りに割とCPUを使うアプリケーションがDjangoで書かれていて、複数リクエストを全然さばけない状態のものがあったのですが、これがこそっとDjangonの開発サーバーで動いていました。
CPUバウンドな処理なので複数CPUを使ってくれないと困るのですが、これをやるにはGunicornやuWSGIを使って複数プロセスでアプリケーションを動作させる必要があります。
※PythonはGILの制約があるので、ひとつのプロセス中で同時に動かせるスレッドはひとつだけです
これをなんとかするために、この環境ではuWSGIでアプリケーションを動かすことにしました。
もちろん、サーバーを変更して動作するかという確認は必要になるのですが…。
結果、無事に複数CPUを使ってある程度リクエストをさばけるようになりました、と。
開発中の構成と、プロダクション向けの構成は、ちゃんと考えましょうね、という話でした。