カテゴリー
IT

WSGIDaemonProcessの謎

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モジュールないですエラー」
わけがわからない…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください