Make組ブログ

Python、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます

gunicornでPython製Webアプリケーションを動作させよう(DjangoとFlask)

前の記事ではWSGIアプリケーションをWSGIサーバー(gunicorn)で起動する方法を説明しました。 ここではgunicornを使って、Python製WebフレームワークでできたWebアプリケーションを起動しましょう。

blog.hirokiky.org

なぜgunicornなどのWSGIサーバーを使うのか

DjangoやFlaskなどのWebフレームワークを使っているとき、開発時にもサーバーを起動して動作確認をしていると思います。 例えばDjangoであれば python manage.py runserver というコマンドでサーバーを起動できます。 なぜこのサーバーを使わずにgunicornを使うのでしょうか?

理由は簡単に言うと、動作が速いからです。

gunicornuWSGIwaitress といったWSGIサーバーは速く、 安定して動作することを考慮して作られています (何をもって「速い」と言うのかは別の機会に詳しく解説できればと思います)。

なので、一般に公開して多くの人に使ってもらうサーバーなどでは、専用のWSGIサーバーを使うほうが良いです。 「本番環境ではgunicornなど別のWSGIサーバーを使う」と、プラクティスとして覚えておくと良いでしょう。

gunicornのインストール

gunicornのインストールは、その他のPythonパッケージのように pip でインストールできます (ここではpipの詳細や、Pythonの仮想環境を使う方法については説明しません)。

$ pip install gunicorn

gunicornでWSGIアプリケーションを起動する

gunicornをインストールすると gunicorn というコマンドが使えるようになります。 WSGIアプリケーションを起動するには、この gunicorn コマンドを使って起動します。 以下の例では wsgi.py ファイル内の application というWSGIアプリケーションを起動しています。

$ gunicorn wsgi:application

ファイル中のWSGIアプリケーションの名前が application の場合、以下のように名前を省略できます。

$ gunicorn wsgi

どんなPython製のWebフレームワークを使う際にも「WSGIアプリケーションがどこにあるのか」を知っていれば、 gunicornなどWSGIサーバーを使って簡単に起動できます。

Flask製Webアプリケーションを起動する

FlaskでWebアプリケーションを作った場合、 app = Flask(...)インスタンス化した app 自体がWSGIアプリケーションです。 例えば myapp.py というファイル内に app という名前でFlaskアプリケーションがある場合、以下のように gunicorn で起動できます。

$ gunicorn myapp:app

Standalone WSGI Containers — Flask 1.0.2 documentation

Django製Webアプリケーションをgunicornで起動する

Djangoで作ったWebアプリケーションをgunicornで起動するには、Djangoのプロジェクトディレクトリー内で以下のように実行します (ここで言うプロジェクトディレクトリーは manage.py ファイルがあるディレクトリーの意味です)。

$ gunicorn myproject.wsgi

myproject というのは django-admin startproject ... で決めたプロジェクト名です。 DjangoでWebアプリケーションを作ると、 myproject/wsgi.py というファイル内が自動で作成されます。 この wsgi.py ファイル内の application という値(呼び出し可能オブジェクト)がWSGIアプリケーションです。 この wsgi.py は、 settings.pyurls.py があるディレクトリー内にあります。

How to use Django with Gunicorn | Django documentation | Django

python manage.py runserver コマンドも、この wsgi.py の application を使って起動しています)

Djangoの設定ファイル(settings)を切り替える

起動する際にDjangoの設定ファイル(settings)を切り替えるには、環境変数 DJANGO_SETTINGS_MODULE を指定します。 以下の例では myproject/settings/production.py という設定ファイルを使っています。

$ gunicorn --env DJANGO_SETTINGS_MODULE=myproject.settings.production myproject.wsgi

Djangoの場合、このようにして環境ごと(ローカル環境、本番環境ごと)に設定ファイルを用意して切り替えられます。 この例ではgunicornの --env オプションで指定していますが、環境変数に直接設定しても問題ありません。

まとめ

前回の記事 ではWSGIとは何かと説明しました。 今回はFlask、DjangoなどのメジャーなPython製Webフレームワークをgunicornという本番環境でも使えるWSGIサーバーで起動しました。

次は、gunicornに指定できるオプションの中でよく使うものを説明します。