SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Windows10にインストールしたXAMPPのApache24に、Djangoをデプロイする。

f:id:arakan_no_boku:20200703234732j:plain

目次

XAMPPのApache24に、Djangoをデプロイする

Djangoをmod_wsgiを使って、Apacheにデプロイします。

djangoを動かす方法は2通りです。

  • 開発時:python manage.py runserverでビルトインサーバーを動かす。
  • 運用時:apacheやnginxなどにデプロイして動かす。

今回は後者の方法です。

Webサーバーは「Apache」にします。

Djangoをデプロイする流れ

デプロイについては、Django3.0の公式ドキュメントに説明があります。

docs.djangoproject.com

基本的な流れとしては。

apache 

mod_wsgi

プロジェクトの「wsgi.py」

という感じで、wsgi.pyがDjangoのモジュールを動かします。

なので。

考え方としては、apacheの設定で、mod_wsgiを有効にして、ターゲットになる「wsgi.py」の場所を指定すればよい・・ということです。

1.WindowsApacheへmod_wsgiをインストール

とりあえず、Windows10にインストールしたApacheでデプロイして動かしてみようと思っても、httpd.confに「mod_wsgi」の記述はどこにもありません。

そう。

mod_wsgiの、Windowsバイナリは自分で探して持ってこないといけないみたいです。

とりあえず、こちらのサイトしか・・自分は知りません。

Unofficial Windows Binaries for Python Extension Packages

 真ん中あたりに、以下のようなmod_wsgiのエリアがあります。

f:id:arakan_no_boku:20200704215306p:plain

この中から、

Apacheのバージョン

・VisualStudio C++コンパイラバージョン

pythonのバージョン

・WindowsOSのビット数

の組み合わせで適切なものを選びます。

もっとも、python3.6以上の場合はApache2,4、VC16バイナリ前提でファイル名からは外れているようです。

自分の環境は、python3.7で、Window10の64ビット版なので以下を選びました。

mod_wsgi‑4.7.1‑cp37‑cp37m‑win_amd64.whl

悲しいかな、上記のページは「unofficial」です。

まず上記サイトからファイルをダウンロードして、そのフォルダをカレントにして、pipでインストールします。

上記の場合なら、こんな感じ。

pip install mod_wsgi-4.7.1-cp37-cp37m-win_amd64.whl

うまくいくと、以下のようなメッセージになります。

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_wsgiWindowsで動かす場合「c:\Apache24」にインストールされているのが前提になっていると以下の記事に書かれています。

pypi.org

今回は、xamppのApacheを使いたいので、その前提からはずれます。

じゃあ、どうすればよいのか?・・という情報が意外とないのですが、こちらの記事を参考にして、とりあえず環境変数を設定しておきます。

stackoverflow.com

環境変数は以下です。

MOD_WSGI_APACHE_ROOTDIR

f:id:arakan_no_boku:20200705141151p:plain

3.Apachehttpd.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画面が表示されなかったりします。

WindowsApachedjangoの組み合わせだけの問題なのか、あまり、これについて書いてある資料はないのですが、自分は実際にはまって苦労しました(笑)

5.Anacondaで必要な設定

Anacondaの場合はもうひとつ必要です。

システム環境変数のほうの「PATH」に「sqlite3.dll」のある場所のパス(例えば、C:\ProgramData\Anaconda3\Library\bin・・とか)を追加しておく必要があります。

でないと。

from _sqlite3 import *\r

ImportError: DLL load failed

みたいなエラーがでて動きません。

さて動かしてみよう

ここまで設定できたら、動かしてみます。

f:id:arakan_no_boku:20200705230047p:plain

ブラウザからアクセスしてみると。

f:id:arakan_no_boku:20200705230158p:plain

おーー。

動いた動いた。

とはいえ、個人的には、WindowsApacheで、djangoの本番を動かす選択肢はないな・・とは思います。

mod_wsgiWindowsバイナリは「Unofficial 」でしか提供されてませんし、Windowsならではのはまりどころも多いです。

でも、やり方を整理しておかないと、いつも忘れてて同じところではまる(笑)ので、備忘のためにまとめてみました。

ではでは。

#python #django