CentOS 6.5でApache 2.2.15を使用しています。 Djangoアプリをセットアップしようとしています。仮想環境を使用していて、mod_wsgiは--with-python=/path/to/virtualenv/bin/python3.4
で設定されています。
これをhttpd.conf
に追加しました:
WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>
wsgi.py
に追加しました
sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")
問題は、ブラウザーでアプリを開こうとすると、アプリが無期限に読み込まれることです。 Apacheのエラーログは次のとおりです。
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
興味深いのは、Python(2.6)のシステムインストールと仮想環境バージョン(3.4)の両方で、import encodings
が正常に機能することです!私は次のサンプルWSGIスクリプトを使用してみました mod_wsgi CheckingYourInstallationページ PythonのどのバージョンがApacheで使用されているかを確認しますが、同じImportErrorが発生します。
誰かが次のステップの提案をしていますか?私はドキュメントを精査しましたが、ここからどこへ行くべきかわかりません。
私の友人(IE:SysAdmins)の助けを借りて、昨夜これを理解しました。私は例で最もよく学ぶので、あなたがmod_wsgiを使ってApacheをLinuxグループApache、ユーザーフリッパーパを使って実行しているとしましょう。 my_project/wsgi.pyのwsgi.pyで/ home/my_projectをホストしているとしましょう。
トップレベル(ls -l /):
drwxr-xr-x. 47 root root 4096 Jul 9 09:43 home
ホームディレクトリ(ls -l/home):
drwxrwsr-x 7 flipper Apache 4096 Jul 29 10:22 my_project
これが鍵でした。小文字の「s」は、Apacheグループのsetgidビットが設定され、実行ビットが設定されていることを意味します。もちろん、最後の「x」は誰でも実行できることを意味します。
ツリーの下の権限を確認してください。これは私たちにとってトリックでした。
この問題はSELinuxが原因で発生しました。私がしたことはこれでした:
httpd_enable_homedirs
を使用してsetsebool -P httpd_enable_homedirs on
SELinuxブール値をon
に設定すると思います。CentOS wikiの SELinuxガイド は非常に役に立ちました。たとえば、デバッグするにはsetenforce Permissive
を実行して、SELinuxがルールを強制しないようにしながら、ログに書き込むことができます。その後、もう一度setenforce Enforcing
を忘れないでください!
Windowsでは、PythonインストールのLibディレクトリをPYTHONPATHに直接置くことでこの問題を解決しました。同じシェルでPythonを直接実行する場合、これは必要ですが、エンコーディングパッケージを見つけるためにこれは必要ありません。
set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.AMD64\Lib;%PYTHONPATH%
c:\Apache24\bin\httpd.exe
また、正しいmod_wsgiバージョンを使用してください。私は nofficial Binaries page からダウンロードし、Python(上記の例では64ビット3.4)に一致するように選択しました。 Apacheを起動する.batファイルを上記のように変更した後、私のウェブサイトはPythonで正しく動作します。
私のバージョンのPython WinPython は、インストールを解凍してC:ドライブに配置することでインストールされることに注意してください。したがって、通常のWindowsの方法でレジストリにインストールされないため、レジストリの相互作用に関する考慮事項が最小限に抑えられます。