前回はDjangoアプリケーションを作ってみました。
そうすると本格的な運用環境が気になりますよね?
Djangoのサーバー機能はテスト用なので本格運用となるとサーバーソフトが必要になります。
いくらDjango上で上手く動いていても本番環境で動かないシステムを作っても意味がありません。
ということで、「開発しても本番でちゃんと動くのか?」という不安を取り除くため、3回目にしてサーバーソフトの有名所、「Apache2」と連携する方法を掲載します。
(Djangoの初期設定ではデバッグモードとして機能しているので、本番環境とはテンプレート等の参照ディレクトリに対する処理が違っていたりと実にややこしいらしいのです。)
※環境はRaspberryPi上のRaspbianですのでディストリビューションによっては方法が異なるかもしれません。
DjangoとサーバーソフトのApache2を連携させるには、mod-wsgiというApacheのモジュールが必要で、このwsgiがApache2でpythonを扱うためのモジュールになります。
apache2のインストール
まずはサーバーソフトapache2をインストール
$ sudo apt-get install apache2
これだけでOK!
一応バージョン確認
$ apache2 -v
Server version: Apache/2.4.25 (Raspbian)
Server built: 2018-06-02T08:01:13
問題なし!
一応再起動しておく。
sudo reboot
この時点で既にApacheが起動しているのでブラウザで[サーバーのIPアドレス]へアクセスするとApache2のデフォルトページにアクセス出来ます。
ちなみに、このHTMLファイルの場所は
/var/www/html/index.html
です。
書き換えると
<HTML>
<TITLE>Test</TITLE>
<BODY>
<H1>HELLO!</H1>
</BODY>
</HTML>
ほら反映されます。
mod-wsgiインストール
pip3でmod-wsgiをインストール
$ sudo pip3 install mod-wsgi
あで?、何かエラーが出た。
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-iYOjuE/mod-wsgi/
setuptoolsをアップグレードしてみる
$ sudo pip3 install --upgrade setuptools
ん?けどやはり通らない「なんでかなー?」いろいろ調べたけど解らない。
ヒントになったのはこちらの記事
python3 Django1.9 を mod_wsgi で動かす ( デプロイする )
インストールコマンドが違う?
$ sudo apt-get install libapache2-mod-wsgi-py3
あれ?mod-wsgiのインストールってこんなんだっけ?
って過去自分ブログを調べてみると、
過去記事
////////////////////
WSGIインストール
sudo apt-get install libapache2-mod-wsgi
////////////////////
書いてあった・・・凹
各々のディストリビューションに合わせてインストールしましょう。
【重要】
python3用のものが
sudo apt-get install libapache2-mod-wsgi-py3
python2用のものが
sudo apt-get install libapache2-mod-wsgi
でインストールできます。
間違えると動きません。
上記の方法でmod-wsgiをインストール完了!
apache2のwsgiを有効化
$ sudo a2enmod wsgi
Module wsgi already enabled
既に有効になっていました。
wsgiが正常に動いてるかテストしたい場合は、記事最後の参考サイトの方法を試してみてください。
Apache2+Djangoの連携
※DjangoではApacheのルートディレクトリにプロジェクトを置く事は禁忌とされているようですが、とりあえずルートディレクトリ上が一番動かしやすい環境なので(他のディレクトリにすると設定が面倒らしい)動作確認として直に置いてみます。
/var/wwwディレクトリがroot権が必要なのでsudoで動かしています。
/var/www $ sudo django-admin startproject draemon
draemonディレクトリに移動
$ cd draemon
おまじないのmigrateする。
$ sudo python3 manage.py migrate
アクセス元の許可とタイムゾーンの設定
$ sudo nano draemon/settings.py
と、ここまでは、①と同じです。
動作確認までできたら次へ
wsgi.pyファイルを作成します。
/var/www/draemon $ sudo nano wsgi.py
中身はパスを通すだけのコード。
色々なサイトのサンプルを見て手間取ったけど、sys.path.append()の順番を間違わないように!(どこかのサイトでは間違っていた)
#!/usr/bin/python
#coding:utf-8
import os
import sysfrom django.core.wsgi import get_wsgi_application
sys.path.append("/var/www/draemon")
sys.path.append("/var/www/draemon/draemon")os.environ.setdefault("DJANGO_SETTINGS_MODULE", "draemon.settings")
application = get_wsgi_application()
保存したら一応実際に単品で動かしてみてエラーが出ないか確認しましょう!
sudo python3 wsgi.py
パスを通すだけだから特になにも起こらないまま終了します。
次にApacheのデフォルトの設定ファイルが置かれている場所を確認しましょう。
/etc/apache2 $ ls sites-available/
000-default.conf default-ssl.conf
この000-default.confというのが通常httpで見れるwebサイトの設定ファイル
default-ssl.confはhttpsで見れるwebサイトの設定ファイル。
今回は000-default.confをコピーして使います。
sudo cp sites-available/000-default.conf draemon.conf
で、中身を弄ります。
/etc/apache2 $ sudo nano sites-available/draemon.conf
これがややこしいのなんのって!
とりあえず動いた設定(コメントアウト部分を除)を公開しておきます。
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /var/www/draemon/wsgi.py
WSGIPythonPath /var/www/draemon
<VirtualHost *:80>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
WSGIScriptAlias / /var/www/draemon/wsgi.py
ここまで完了したらApacheのデフォルトのページと、今回のプロジェクトのページを切り替えます。
sudo a2dissite 000-default
でデフォルトページを切り離します。
sudo a2ensite draemon
で今回の設定ページを接続します。
これでポート80番へのアクセスがdraemonプロジェクトになります。
systemctlからApacheをリロードもしくは、再起動させます。
リロード
sudo systemctl reload apache2
リロードでうまく表示されなかったら再起動してみましょう。
sudo systemctl restart apache2
ブラウザで繋げばDjangoのデフォルトページが表示されるハズです。
これだけのことなのに情報錯綜しててうまく動かず手間取りました。
次回はApacheのドキュメントルート以外でDjangoを動かします。
<参考サイト>
[raspberry pi]djangoをwsgiでapache2によりdeployまで | そんなヒロシの備忘録
Apache2.4で、アクセス制限の記述方法が変更されていた
Django を Apache と mod_wsgi とともに使うには? | Django documentation | Django
やむとらぼ: Raspberry Pi Zero W の Django を Apache で動かす
pyenvの使いかた(今回は必要無かった)
RaspberryPiにpyenvでPython3環境を作る
Raspberry Pi3にPyenvをいれてみた。環境構築メモ | ビット世界冒険記
WSGI動作確認方法