前の記事ではWSGIアプリケーションをWSGIサーバー(gunicorn)で起動する方法を説明しました。 ここではgunicornを使って、Python製WebフレームワークでできたWebアプリケーションを起動しましょう。
なぜgunicornなどのWSGIサーバーを使うのか
DjangoやFlaskなどのWebフレームワークを使っているとき、開発時にもサーバーを起動して動作確認をしていると思います。
例えばDjangoであれば python manage.py runserver
というコマンドでサーバーを起動できます。
なぜこのサーバーを使わずにgunicornを使うのでしょうか?
理由は簡単に言うと、動作が速いからです。
gunicorn やuWSGI、 waitress といった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 Documentation (1.0.x)
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.py
や urls.py
があるディレクトリー内にあります。
How to use Django with Gunicorn | Django ドキュメント | 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に指定できるオプションの中でよく使うものを説明します。