質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

djangoチュートリアル学習中 Apache(mod_wsgi)動かず

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,725

matsuand

score 149

 やりたいこと

django のチュートリアル学習を進めるにあたって Apache + mod_wsgi 環境を学習早々から構築し、いろいろ学んでいきたい。

 お聞きしたいこと=行き詰っている点=エラー

  • 環境は Linux From Scratch =自作環境、各種ツール類は総じて最新。VMware環境上。
  • django は全くの初心者です。(Python もほぼ分かりません。)
  • 公式チュートリアル part1. (https://docs.djangoproject.com/en/2.1/intro/tutorial01/) を実施し、python3 manage.py runserver 0:8000 でブラウザ表示OK。(チュートリアル内にて polls アプリをごく簡単に作成し views.py を作って簡単な文字列をブラウザに表示させるところまでOK)
  • 上を Apache + mod_wsgi の環境にて動作させようとすると以下のエラー(/var/log/httpd/error.log; systemctl restart httpd 直後のエラー):
[Sat Oct 13 20:09:04.289947 2018] [mpm_event:notice] [pid 27895:tid 140589367314304] AH00492: caught SIGWINCH, shutting down gracefully
[Sat Oct 13 20:09:04.439048 2018] [mpm_event:notice] [pid 28064:tid 139866172979072] AH00489: Apache/2.4.34 (Unix) mod_wsgi/4.6.4 Python/3.7 configured -- resuming normal operations
[Sat Oct 13 20:09:04.439214 2018] [core:notice] [pid 28064:tid 139866172979072] AH00094: Command line: '/usr/sbin/httpd'
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f35218e7780 (most recent call first):
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
  • エラーは httpd (re)start の時点で既に発生。Fatal Python...ModuleNotFoundError: ... が繰り返し出力され止ることなし。したがってブラウザアクセスしても、ずっとブラウザが読み込み中のまま、何も表示されません。(django チュートリアルの polls アプリの試し画面が表示されません。)
  • どこをどのように確認して環境整備すればよいでしょうか? encodings という Python モジュールが探し出せていないのかと思いますが、どう設定すればよいのかが分かりません。ご教示お願いします。

 環境構築状況もろもろ

  • 各種ツール類とバージョン: Python 3.7.0(Python 2.X はなし)、Apache HTTPD 2.4.34、mod_wsgi-4.6.4(pip からではなくソースビルド、ちなみに pip install mod_wsgi も試したが症状変わらず)
  • django 環境は venv にて構築:
$ cd /home/django
$ python3 -m venv djangodev
$ source djangodev/bin/activate
(djangodev) django [ ~/ ]$ cd djangodev
(djangodev) django [ ~/djangodev ]$ pip install --upgrade pip
(djangodev) django [ ~/djangodev ]$ pip install django
  • (上で述べたように) 公式チュートリアル part1 を順に実施。すべて上記の source djangodev/bin/activate 後の ~/djangodev ディレクトリ内で実施。
  • python3 manage.py runserver 0:8000 の実行、および http://<サーバーIPアドレス>:8000/polls へのブラウザアクセスにより、チュートリアルの意図どおりに「Hello, world. You're at the polls index.」の文言がブラウザ表示される。
  • 次に Apache + mod_wsgi 環境構築へ。Apache HTTPD ソースビルド。mod_wsgi ソースビルド(./configure のオプションとして --with-python=/usr/bin/python3 指定)。
  • Apache httpd.conf (関連箇所のみ):
    LoadModule deflate_module /usr/lib/httpd/modules/mod_deflate.so
    LoadModule expires_module /usr/lib/httpd/modules/mod_expires.so
    LoadModule wsgi_module /usr/lib/httpd/modules/mod_wsgi.so

    Include /etc/httpd/extra/httpd-django.conf
  • django 用の Apache 設定: (httpd-django.conf 新規生成)
WSGIScriptAlias / /home/django/djangodev/mysite/mysite/wsgi.py
WSGIPythonHome /home/django/djangodev/mysite
WSGIPythonPath /home/django/djangodev/lib/python3.7/site-packages

<Directory /home/django/djangodev/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
  • この設定により systemctl restart httpd 、前述エラーに至る。
  • encodings の所在:
(djangodev) django [ ~/djangodev ]$ python
Python 3.7.0 (default, Oct 14 2018, 16:45:32)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import encodings
>>> encodings
<module 'encodings' from '/usr/lib/python3.7/encodings/__init__.py'>
>>>
  • 前述 httpd-django.conf の WSGIPythonPath を
WSGIPythonPath /usr/lib/python3.7:/home/django/djangodev/lib/python3.7/site-packages


としてみても変わらず。(/usr/lib/python3.7: をつけてみた)

  • 環境変数(シェル変数) PYTHONHOME、PYTHONPATH の設定はなし。
  • ModuleNotFoundError: No module named 'encodings' をググってみると、Python 2.x / 3.x の混在が影響とか、PYTHONHOME の設定を空にすべきとか、ぐらいは見つけましたが、いずれも当方状況には合致しないと捉えています。
  • ソースビルドからの環境構築(Linux From Scratch)なので、通常の Linux ディストリビューションが行っているかもしれない便利な諸設定などが欠落しているかもしれないと、想像はしますが、そんなものがあるのかないのか、全く分かりません。
  • ちなみに /usr/lib/python3.7/encodings/* は Python-3.7.0 のソースビルドインストール時にインストールされているものです。/home/django/djangodev/lib/python3.7 配下に encodings はありません。
  • 気にかかる点が2つあって、1つは実行モジュール python が通常 systemwide 環境では python3 しかなく、python(数字なしの実行モジュール)はないという点です。しかし venv 環境では python3 へのシンボリックリンクが作り出され、その実体は python3 になっているというところです。何か支障があるでしょうか?
(djangodev) django [ ~/djangodev]$ ls -l `which python`
lrwxrwxrwx 1 django apache 7 1015 09:39 /home/django/djangodev/bin/python -> python3
  • もう1つ気になるのが、自ユーザーを django としていますが、Apache の種々アクセスのことを考慮して apache グループに所属させています。この是非の問題はあるかもしれませんが、そもそもの当質問にて、アクセス権限の問題があるのかどうか・・
$ id django
uid=1003(django) gid=25(apache) groups=25(apache)

ModuleNotFoundError: No module named 'encodings' のエラーを解消し、Apache+mod_wsgi環境にて、django学習を進めていきたいところです。解消方法をご教示いただけたら幸いです。不足情報があればご指摘ください。 よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • matsuand

    2018/10/15 10:41

    morinatsu 様、WSGIPythonHome の設定により解決しました。恐れ入りますが、顛末を細かく示したく思いますので、ご指摘内容を回答として再掲載していただけますでしょうか。それに対してコメントをし、解決したことを残したく思いますので。

    キャンセル

  • morinatsu

    2018/10/15 12:30

    私も問題を理解した上で、上記のサイトを挙げたわけでもないので……。質問者さんの行った変更・操作を記述して自己解決としていただくのが実態に即していると思います。

    キャンセル

  • matsuand

    2018/10/15 13:37

    ご助言、ありがとうございました。この後に解決結果を記載させていただきます。

    キャンセル

回答 1

check解決した方法

0

morinatsu 様から頂いた情報ページ、Qiita: Django事始め: 3_Apache連携(https://qiita.com/roy29fuku/items/578de62fbdd65f8ffbaa) も参考にさせて頂き、解決しました。もっともそのページでは Anaconda を用いている様子で、それが何かも分かっていないため、最初はよく分かりませんでした。

結論は、当方が作成した django 用 mod_wsgi 設定(httpd-django.conf)での以下の2項目設定により解決しました。

WSGIPythonHome /home/django/djangodev
WSGIPythonPath /home/django/djangodev/mysite

公式ドキュメントより、How to use Django with Apache and mod_wsgi (https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/modwsgi/) の Basic Configuration の項も見ていたのですが、見よう見まねでロクに設定項目の意味も解釈せずに設定していたのが原因でした。

なお上は venv 環境内に PythonHome を設定するものですので、仮にその仮想環境内ではなく systemwide にインストールされている Python を指定するなら、以下のようにすれば良いことも今回分かりました。

WSGIPythonHome /usr
WSGIPythonPath /home/django/djangodev/mysite


これを見ると一目瞭然で、WSGIPythonHome は「"lib/python3.7" というサブディレクトリを有しているディレクトリ」=「Python をインストールした際の prefix ディレクトリ」を設定すべきであるというものです。
ロクにドキュメントを読みもしなかった自分も原因でした。お騒がせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる