サーバに触れてみる(3)【NginxとDjangoとMariaDBを接続する】

先週はざっくり環境を整えました

今週は整えた環境をつないでみたいと思います

Djangoチュートリアルとかもやってたんですが,チュートリアルまんましかやってないので書くことはないです

Nginx + Django

まずはNginxとDjangoをつなぎます

ただ,NginxとDjangoは直接つなぐことはできません(多分)

もしかしたらできるのかもしれませんが,普通はuWSGIというものを使うらしいです

f:id:ymzkmtfm:20170910100608p:plain

uWSGIはDjango(というかpython)とNginxとの通信を実現してくれるソフトウェアです.Apachとかだとmod_wsgiを使うらしいです

もうちょっというとWSGIというpythonとwebサーバとの通信の仕様書みたいなものがあってuWSGIはそれを実装したものみたいな感じらしいです.形態としてはサーバ・クライアントみたいに通信をしているらしいので,Django側にだけインストールすればなんとかなるらしいです.uWSGIはc言語での実装ですがpythonで実装したgunicornとかもあるらしいです.

NginxはuWSGIをサポートしているらしいので特に面倒なことをする必要ありません.ただしNginxの設定ファイルにuWSGIでアプリケーションサーバに通信することを教えてやる必要があるので少し設定をいじります

Nginxの設定は/etc/nginx/conf.dの中に*.confという名前でファイルを置いてやればできます

実際に置いてあるものがこちらです.これで192.168.33.10の80ポートに対するアクセスはNginxに対するアクセスになります.location / はとりあえず全部uWSGIをつかってDjangoにつながります.ポートはuWSGIの方で設定します

ここで注意しなければいけないのは/static/とaliasです.Djangoの静的ファイル(cssとか画像とか)はwebサーバを介して使うときにいくつか注意が必要で,きちんとやらないとそこらへんがうまく動きません.大まかな流れとしては

1.Django側で静的ファイルをまとめる

2.まとめたファイルをWEBサーバに移す

3.Nginxに場所を設定する

という感じです.

まずはDjangoで静的ファイルをまとめるのですが,これはsetting.pyを開いて

STATIC_ROOT = "ファイルをまとめたい場所"

としたあとに

python manage.py collectstatic

をすれば大丈夫です.

次にWEBサーバにまとめたファイルを移してやるのですが,これはrsyncでもgitでもいいと思います.どうやらデプロイツールとかを使うといいらしいんですがよくわかりませんでした.

最後にNginxのなかにlocation /static/ { alias webサーバに移したファイルのローカルなパス }とすれば静的ファイルが使えるようになります.

ただ,なんかインフラの設計としてこれでいいのかよくわからないのでこれがいいのかどうかはわかりません…

Nginx側の設定が概ね終わったら次はuWSGIの準備をします

uWSGIはcで書かれているのでインストールにはコンパイラが必要です

sudo yum groupinstall "Development Tools"

とかやると大体入ります.あとpython-develが必要なので

yum install python-devel

とかやって入れておきます.正直面倒です.終わったら

pip install uwsgi

でおそらくインストールされます.この手のサーバソフトとかには設定ファイルがつきものなので好きな場所に設定ファイルを作ります

 chdirにはアプリケーションの場所を設定します

moduleにはwsgi用の特別なファイルを設定したりする必要があるらしいのですがDjangoが勝手に作ってくれるのでsettings.pyのある辺りとかを探して書いてあるような感じでパスを通します

masterとvacuumは知りません

pidfileはプロセスの情報とか諸々を置いておく場所です.ディレクトリだけ用意してれば大丈夫です

socketはみたまんまです

die-on-termもみたまんまです

あとはuWSGIとNginxを起動します

uwsgi uwsgi.ini

systemctl start nginx

多分これでつながります

Django + MariaDB

今度はDjangoMariaDBを接続します.こっちの接続は結構簡単です

大まかな流れとしては

1.DBサーバでDjango用のデータベースを作る

2.作ったデータベースにDjangoからの接続を許可する

3.DjangoにDBの情報を教える

大体これで動きます

まずはDjango用のデータベースの作り方ですが,これは普通に作るだけです

作ったら

grant all なんちゃらかんちゃら 名前@IP なんか

みたいな感じで接続を許可します.詳しくは忘れました

作ったらsetting.pyにデータベースの情報を教えます.

これでつながります.3306ポートはMatiaDBのデフォルトです

来週の予定

来週は少しフロントエンドっぽいことをやろうと思っています