DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

Djangoの使い方③サーバー連携Ⅰ(Apache2とDjangoの連携テスト)

前回はDjangoアプリケーションを作ってみました。

dreamerdream.hateblo.jp

そうすると本格的な運用環境が気になりますよね? 

Djangoのサーバー機能はテスト用なので本格運用となるとサーバーソフトが必要になります。

f:id:DreamerDream:20180919165331p:plain

いくら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のデフォルトページにアクセス出来ます。

f:id:DreamerDream:20180912111039p:plain

ちなみに、このHTMLファイルの場所は

/var/www/html/index.html

です。

書き換えると

<HTML>
<TITLE>Test</TITLE>
<BODY>
<H1>HELLO!</H1>
</BODY>
</HTML>

f:id:DreamerDream:20180912111801p:plain

ほら反映されます。

 

 

 

 

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のインストールってこんなんだっけ?

って過去自分ブログを調べてみると、 

dreamerdream.hateblo.jp

過去記事

////////////////////

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

と、ここまでは、①と同じです。

dreamerdream.hateblo.jp

 動作確認までできたら次へ

 

wsgi.pyファイルを作成します。

/var/www/draemon $ sudo nano wsgi.py

中身はパスを通すだけのコード。

色々なサイトのサンプルを見て手間取ったけど、sys.path.append()の順番を間違わないように!(どこかのサイトでは間違っていた)

#!/usr/bin/python
#coding:utf-8


import os
import sys

from 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のデフォルトページが表示されるハズです。

f:id:DreamerDream:20180919164010p:plain

 

これだけのことなのに情報錯綜しててうまく動かず手間取りました。

 

 

 

次回はApacheのドキュメントルート以外でDjangoを動かします。 

dreamerdream.hateblo.jp

 

 

<参考サイト> 

[raspberry pi]djangoをwsgiでapache2によりdeployまで | そんなヒロシの備忘録

Apache2.4で、アクセス制限の記述方法が変更されていた

Django を Apache と mod_wsgi とともに使うには? | Django documentation | Django

Django事始め: 3_Apache連携

Django1.9 環境非依存のwsgi.pyの書き方

やむとらぼ: Raspberry Pi Zero W の Django を Apache で動かす

pyenvの使いかた(今回は必要無かった)

RaspberryPiにpyenvでPython3環境を作る

Raspberry Pi3にPyenvをいれてみた。環境構築メモ | ビット世界冒険記

WSGI動作確認方法

mod_wsgiでhello worldを描画する

kampa.me