目次
XAMPPのApache24に、Djangoをデプロイする
Djangoをmod_wsgiを使って、Apacheにデプロイします。
djangoを動かす方法は2通りです。
今回は後者の方法です。
Webサーバーは「Apache」にします。
Djangoをデプロイする流れ
デプロイについては、Django3.0の公式ドキュメントに説明があります。
基本的な流れとしては。
↓
mod_wsgi
↓
プロジェクトの「wsgi.py」
という感じで、wsgi.pyがDjangoのモジュールを動かします。
なので。
考え方としては、apacheの設定で、mod_wsgiを有効にして、ターゲットになる「wsgi.py」の場所を指定すればよい・・ということです。
1.WindowsのApacheへmod_wsgiをインストール
とりあえず、Windows10にインストールしたApacheでデプロイして動かしてみようと思っても、httpd.confに「mod_wsgi」の記述はどこにもありません。
そう。
mod_wsgiの、Windowsバイナリは自分で探して持ってこないといけないみたいです。
とりあえず、こちらのサイトしか・・自分は知りません。
Unofficial Windows Binaries for Python Extension Packages
真ん中あたりに、以下のようなmod_wsgiのエリアがあります。
この中から、
・Apacheのバージョン
・pythonのバージョン
・WindowsOSのビット数
の組み合わせで適切なものを選びます。
もっとも、python3.6以上の場合はApache2,4、VC16バイナリ前提でファイル名からは外れているようです。
自分の環境は、python3.7で、Window10の64ビット版なので以下を選びました。
悲しいかな、上記のページは「unofficial」です。
まず上記サイトからファイルをダウンロードして、そのフォルダをカレントにして、pipでインストールします。
上記の場合なら、こんな感じ。
うまくいくと、以下のようなメッセージになります。
Processing c:\users\boku\downloads\mod_wsgi-4.7.1-cp37-cp37m-win_amd64.whl
Installing collected packages: mod-wsgi
Successfully installed mod-wsgi-4.7.1
2.環境変数の設定
mod_wsgiをWindowsで動かす場合「c:\Apache24」にインストールされているのが前提になっていると以下の記事に書かれています。
今回は、xamppのApacheを使いたいので、その前提からはずれます。
じゃあ、どうすればよいのか?・・という情報が意外とないのですが、こちらの記事を参考にして、とりあえず環境変数を設定しておきます。
環境変数は以下です。
3.Apacheのhttpd.conf設定
mod_wsgi-express.exeを実行して、httpd.confに設定する内容を確認します。
pipでインストールされた場所を探して、そこをカレントフォルダにして以下を実行します。
mod_wsgi-express.exe module-config
すると、以下のような内容を表示します。
LoadFile "c:/xxxxx/yyyyyyy/.conda/envs/demos/python37.dll"
LoadModule wsgi_module "c:/xxxxx/yyyyyyy/.conda/envs/demos/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/xxxxx/yyyyyyy/.conda/envs/demos"
とりあえず、これをhttpd.confに追加・保存し、Apacheを起動して、エラーなく起動すれば、mod_wsgiをLoadする共通設定はとりあえずできました。
4.djangoプロジェクトを動かすための設定追加
djangoプロジェクトの前提です。
Python3.7/Anacondaを使います。
condaで仮想環境を作って、そこに必要なライブラリをインストールしています。
httpd.confに追加以下を書き込みます。
WSGIScriptAlias / "C:/myprj/etcdemo/etcdemo/wsgi.py"
WSGIPythonPath "C:/myprj/etcdemo"
WSGIApplicationGroup %{GLOBAL}<Directory C:/myprj/etcdemo>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
djangoプロジェクトは以下のようなフォルダ構成である想定です。
C:
|_ myprj
|_ etcdemo
manage.py
|_ etcdemo
wsgi.py
settings.py
views.py
urls.py
補足します。
WSGIScriptAlias / "C:/myprj/etcdemo/etcdemo/wsgi.py"
プロジェクトのwsgi.pyの場所を指定し、それを「/」に紐づけまています。
こうすることで、プロジェクトのurls.pyに以下のように定義したものは
path('demo01/', views.demo01, name='demo01')
http://localhost/demo01 で動かすよ・・という宣言をしています。
WSGIPythonPath "C:/myprj/etcdemo"
ここにはプロジェクトのルートパスを指定して、後ろの<Directory C:/myprj/etcdemo>ブロックでアクセス許可を与えています。
ここが適切でないと「アクセス権限がない」的なエラーがでて動きません。
WSGIApplicationGroup %{GLOBAL}
おまじないです。
これを指定しておかないと「localhostを待機しています」というメッセージをだして、ずっとWait状態になってWEB画面が表示されなかったりします。
WindowsのApacheとdjangoの組み合わせだけの問題なのか、あまり、これについて書いてある資料はないのですが、自分は実際にはまって苦労しました(笑)
5.Anacondaで必要な設定
Anacondaの場合はもうひとつ必要です。
システム環境変数のほうの「PATH」に「sqlite3.dll」のある場所のパス(例えば、C:\ProgramData\Anaconda3\Library\bin・・とか)を追加しておく必要があります。
でないと。
from _sqlite3 import *\r
ImportError: DLL load failed
みたいなエラーがでて動きません。
さて動かしてみよう
ここまで設定できたら、動かしてみます。
ブラウザからアクセスしてみると。
おーー。
動いた動いた。
とはいえ、個人的には、WindowsのApacheで、djangoの本番を動かす選択肢はないな・・とは思います。
mod_wsgiのWindowsバイナリは「Unofficial 」でしか提供されてませんし、Windowsならではのはまりどころも多いです。
でも、やり方を整理しておかないと、いつも忘れてて同じところではまる(笑)ので、備忘のためにまとめてみました。
ではでは。