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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5086閲覧

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

matsuand

総合スコア186

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/10/14 13:57

編集2018/10/15 00:53

やりたいこと

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 にて構築:

shell

1$ cd /home/django 2$ python3 -m venv djangodev 3$ source djangodev/bin/activate 4(djangodev) django [ ~/ ]$ cd djangodev 5(djangodev) django [ ~/djangodev ]$ pip install --upgrade pip 6(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.confWSGIPythonPath
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 10月 15 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学習を進めていきたいところです。解消方法をご教示いただけたら幸いです。不足情報があればご指摘ください。 よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsuand

2018/10/15 01:07

WSGIPythonHome に関するご指摘にハッして、これか!と思いました。ただし WSGIPythonHome /usr/lib/python3.7:/home/django/djangodev/mysite、あるいは WSGIPythonHome /usr/lib/python3.7 としてみましたが解決しません。いかがでしょうか?
matsuand

2018/10/15 01:07

WSGIPythonHome に関するご指摘にハッして、これか!と思いました。ただし WSGIPythonHome /usr/lib/python3.7:/home/django/djangodev/mysite、あるいは WSGIPythonHome /usr/lib/python3.7 としてみましたが解決しません。いかがでしょうか?
matsuand

2018/10/15 01:41

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

2018/10/15 03:30

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

2018/10/15 04:37

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

回答1

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 ディレクトリ」を設定すべきであるというものです。
ロクにドキュメントを読みもしなかった自分も原因でした。お騒がせしました。

投稿2018/10/15 04:59

matsuand

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問