diadia

興味があることをやってみる。自分のメモを残しておきます。

wsgiについて

djangoの仕組みがわかっていない

今までwsgiなど全然わからない存在であったが、どうやらそのへんの知識が必要になってきた。今の推測と分からない部分について書き出してみる。
デプロイ環境と開発環境用のファイルを準備することで、開発とデプロイがしやすくなる。これを実現するためにはsettings.pyとwsgi.pyをそれぞれ環境用に準備することが必要だと思われる。

デプロイ環境では、niginxの設定とそのサービスの起動、postgresqlの設定、データベースの作成とそのサービスの起動を予め準備しておく。これでweb3層と呼ばれるwebサーバ層とデータベースサーバ層の準備がオッケイとなる。おそらくここまでの手続きに関しては理解してきたのでアプリケーションサーバ層について知識と理解が不足していると思う。アプリケーションサーバはgunicornを使ってサービスを起動させることができる。そのときに必要なコマンドは以下のものである。

gunicorn --bind 127.0.0.1:8000 [プロジェクト名].[wsgiファイル名]:application

wsgiファイルの中身はこうなっている。

"""
WSGI config for vigilar project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

application = get_wsgi_application()

推測だが、wsgiファイルに"os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')"という部分がある。このwsgiファイルにデプロイ用のsettings.pyを登録する。そしてデプロイ用のsettings.py内にはwsgiを記述する部分がある。

WSGI_APPLICATION = 'vigilar.wsgi.application'

この部分があるけどここをデプロイ用のファイルに書き換えれば良いと思っている。で実際にそのように設定してみたが、502のサーバータイプのエラーになってしまった。ここで行き詰まっている。。。

wsgiについて少しわかったことがある。wsgiとは、web server gateway interfaceのことであるらしい。つまりwebサーバーとアプリケーションをつなぐ働きをするようだ。具体的には、webサーバーがnginxでアプリケーションがdjangoに当たるようだ。nginxとdjangoの間にwsgiをかませてやり取りをする。これは様々なwebサーバと様々なウェブフレームワークがあるpythonで任意の組み合わせで使いたいというニーズに応えるためにwsgiが開発されたという経緯があるらしい。 でgunicornってのは、wsgiをサービス化するものだという印象だ。gunicornはwsgiアプリケーションコンテナと呼ばれるものらしい。これには、gunicorn,mod_wsgi,mod_python,uWSGI等があるみたいだ。

本番用と開発用のsettings.pyを分けるときの技術

上記の技術について調べてみる。方法としてはDJANGO_SETTINGS_MODULEかコマンドライン引数でsettings.pyを指定するようだ。

export DJANGO_SETTINGS_MODULE = 本番用ファイル(settings.py)

wsgiファイルが必要な環境について

いじってみてわかったことだが、開発環境(local)においてwsgiファイルのos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') は意味がないようだ。