93:サービスマネージャーでプロセスを管理する

プログラミング迷子: Djangoサーバーを動かし続ける方法は?

  • 後輩W:Djangoを実行しているとき、 Ctrl+C を入力したり、ターミナルからログアウトするとプロセスが終了してしまうんです。

  • 先輩T:そうだろうね。何か困ってるの?

  • 後輩W:ログアウト後も実行し続ける方法を調べてたら nohup python manage.py runserver < /dev/null & で起動するっていう方法を見つけたんですけど、これでもときどきプロセスが止まってしまうみたいで、お客さんの動作確認がなかなか進まなくて。どうしたら止まらないようにできるんでしょう?

  • 先輩T:ちょっと待って! 検証環境をrunserverで動かしてるの? Webアプリケーションサーバーとサービスマネージャーは使ってない?

  • 後輩W:Webアプリケーションサーバー、ってDjangoのことじゃないんですか?

Webアプリケーションサーバー はWebアプリケーションを実行するサーバープロセスです。 DjangoはWebアプリケーションフレームワークですが、サーバーではありません。 Djangoが内蔵している manage.py runserver コマンドもWebアプリケーションサーバー機能を提供しますが、これは簡易的な機能で本番には不向きです。 ソースコードを変更した場合に自動的に再起動したり、画像やCSSなどの静的ファイルを配信するといった開発に便利な仕組みを持っていますが、本番環境で必要となるいくつかの機能は持っていません。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください

ベストプラクティス

本番環境やそれに近い環境でDjangoを常駐実行する場合、サービスマネージャーとWebアプリケーションサーバーを使用しましょう。

サービスマネージャーは、常駐するデーモンプロセスの起動や終了を管理し、異常終了時の自動再起動などを行います。 最近のLinuxではSystemdが標準的に利用されていますが、少し前のLinuxではUpstartやSysV initなどが使われていました。 Systemdはサービス管理のための多くの機能を提供しますが、そのうちの1つにログ管理があります。ログ出力はjournalctlで確認できます。 ログファイル管理について詳しくは 74:ログファイルを管理する を参照してください。

Webアプリケーションサーバーとしては、 Gunicorn 1uWSGI 2 などが一般的に利用されます。 本番利用を想定しているWebアプリケーションサーバーは、複数プロセス起動による並列処理機能と死活監視を提供します。 さらに、こういった専用のミドルウェアは動作が非常に速く、利用環境に合わせて設定できるさまざまなチューニングオプションを提供しています。

1

https://pypi.org/project/gunicorn/

2

https://pypi.org/project/uWSGI/

cover

(中略)詳細は書籍 自走プログラマー をご参照ください