mod_wsgiを設定してみた。
環境は FreeBSD11 + Apache24。
ハマったのは、venv のパス。
/usr/local/lib/python3.6/venv
とかに設定してもダメ。encodings というモジュールがないです、と言われてしまう。
どうも大事なのは以下のコマンド。バーチャルホストのホームディレクトリ(あるいはApacheのドキュメントルートのひとつ上あたりのディレクトリ。要するにPythonアプリケーションをインストールしたあたり)で以下を実行する。
$ python -m venv ./venv
したらば、Apacheの設定ファイルに以下のような設定を書く。
<VirtualHost 127.0.0.1:80> ServerName www.example.com DocumentRoot /path/to/www.example.com/htdocs WSGIDaemonProcess www.example.com python-home=/path/to/www.example.com/venv threads=5 WSGIProcessGroup www.example.com WSGIScriptAlias /myapp/ /path/to/www.example.com/myapp/myapp/wsgi.py process-group=www.example.com WSGIScriptReloading On <Directory /path/to/www.example.com/pyapp/pyapp> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
python-home=/path/to/www.example.com/venv は、さっき作った venv ディレクトリの絶対パス。
これでなんとか動きました。
が…。
今度は、djangoが認識されない。アプリをウェブから叩いて動かそうとすると、「djangoモジュールが見つからないです」(意訳)とapacheのエラーログに吐き出される。
どうして!? Django公式ドキュメント通りにやってるのに!
と悩むことしばし。
ふと基本に立ち返って「rootじゃダメだよなぁ」と、バーチャルホストのユーザーに切り替えて、バーチャルホストのユーザーディレクトリであれこれコマンドを打ち込んだら、なんとかなった。
わたしがハマった最大の要因は、すべての作業を root で行ったこと。
本来はバーチャルホストのユーザーで行わなくてはいけない。
(わたしはバーチャルホストごとにユーザーを分けています)
そして、バーチャルホストのユーザーディレクトリで完結するように「環境」を整えないといけない。
さすがはPython! PHPとは違う。
$ cd www.example.com $ python -m venv ./venv $ ./venv/bin/pip install django $ ./venv/bin/django-admin startproject myapp $ ... (以下python公式ドキュメントと同じ。)
こんな感じで、バーチャルホストのディレクトリで作業を完結させる。
すると、「モジュールないですエラー」は出なくなる。
次の問題は…「myappモジュールないですエラー」
わけがわからない…。