Windows上でDjangoで作ったアプリをApacheからWSGIで呼べるようにする。

まーWindowsはいばらの道じゃ。

とりあえず必要な資源をダウンロードしておく。ApacheとかPythonとか。PythonはPIPとVirtualEnvも。

①Djangoで適当にアプリを作る。

仮想環境つくる
virtualenv venv

仮想環境での作業に変える
cd venv
Scripts\activate

Djangoをインスト
pip install django

Djangoのバージョン ⇒ 今回は2.0.6
python -m django --version

アプリを作る
django-admin startproject mysite

とりあえず動かして確認 ⇒ http://127.0.0.1:8000/
cd mysite
python manage.py runserver

②Apacheの準備

1.ダウンロードしたZipを適当なフォルダに展開しておく
2.confファイルの変更(Apache24\conf\httpd.conf)
 ⇒ デフォでC:\Apache24みたいになってるところを格納したフォルダのパスに全部変える。
3.動作確認 : コマンドプロンプト上でbin/httpd.exeで動かしたら「http://localhost」にアクセス
 ⇒ IT WORKS!!って出ればOK。ポート変えてる時はURLは適宜変える。

そしたら、胆のmod_wsgiのインスト。仮想環境上でやってもいいかもだけど、自分は本体(って言い方であってんのかな)の方にインストした。windowsでインストールするやり方は昔はアレコレ大変だったようですが、今は割と楽。調べてて、昔のやり方ではまりそうになったんだけど、mod_wsgiのGitのReadmeにちゃんと書いてあった。やっぱ一次情報をちゃんと読まないとダメですね。これには大部分が昔のやり方で載ってるんだけど、一番上にここに載ってる事はもうやんなって書いてありましたね。

で、今のやり方は↓。

pip install mod_wsgi

これだけ。随分楽になったようで。・・・が、ApacheをC:の直下に展開してないとエラーが出ると言う罠。「No Apache installation can be found. Set the MOD_WSGI_APACHE_ROOTDIR environment to its location.」っていうエラーが出る。C:直下以外にある場合は、この環境変数setしてからじゃないとダメっぽいですね。stackoverflowに質問もあった。 という事で、C:直下以外にある場合は↓の感じ。

set "MOD_WSGI_APACHE_ROOTDIR=F:\Apache32\Apache24"
pip install mod_wsgi

で、Apacheには32bit版と64bit版があるんですが、64bit版だとこれでもまだ変なエラーがでる。あきらめて32bit版にしましたとさ。。。

あと、自分のPCにはVisualStudio2017も入ってるんですが、上記のStackOverflow見てると、VisualStudio入ってないとダメそう?mod_wsgiのインストールの中で、コンパイルしてるっぽい?

インストール出来たら↓。

mod_wsgi-express module-config

上記のコマンド実行すると↓感じの設定文字列が出てくるので、これをApacheのhttpd.confにコピペする。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "f:/python36"

そしたら、あとはDjangoの公式に載ってる設定をhttopd.confに追加しておしまい。最終的にhttpd.confに追記するのは↓。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"

WSGIPythonHome "f:/py/venv"
WSGIScriptAlias /mysite "f:/py/venv/mysite/mysite/wsgi.py"
WSGIPythonPath "f:/py/venv/mysite"

<Directory f:/py/venv/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIPythonHomeはDjangoを使ってる仮想環境のルートを指定するっぽいですよ。これで、WSGIScriptAliasで指定してるURLにアクセスすればDjangoが動くという寸法です。ただ、なんだかデフォのままだとトップページが出ないぽいので、「/mysite/admin/」みたいに中のURLまで行かないとダメな感じ?あんま調べてない。まー動いたから良しとしよう。

あーあと、MariaDB使ってるんですが、開発環境上だと「pip install PyMySQL」だけで動くんだけど、Apache通すと動かない。エラーログに「Did you install mysqlclient?」って出てくるから「pip install mysqlclient」でインストールしたら動くようになった。なんだろね。。。