2016-11-02 28 views
1

私はmod_wsgiを持つApacheサーバーをPython 2.7スクリプトを実行しています。 スクリプトはpythonによってインストールされたpythonピローモジュールを使用します。Apache + mod_wsgi - Pythonはインストールされたモジュールをロードしません

通常、python script.pyを使用してスクリプトを実行するのは問題ありませんが、wsgiからスクリプトを実行しているときにPILに対してImportError例外がスローされます。

これは/etc/apache2/sites-enabled/000-default.confからApacheの設定です:

<VirtualHost *:80> 
     ServerAdmin [email protected] 
     DocumentRoot /var/www/ 

     ErrorLog ${APACHE_LOG_DIR}/error.log 
     CustomLog ${APACHE_LOG_DIR}/access.log combined 

     WSGIScriptAlias /wsgi/ /home/nitay/Desktop/WebsitePath/Python/wsgi.py 

     <Directory "/home/nitay/Desktop/WebsitePath/Python"> 
      Require all granted 
     </Directory> 
</VirtualHost> 

インストールなしvirtualenvのはありませんが、このマシンに一つだけのPythonのインストールがあります。

Pythonでインストールされているモジュールを見つけるにはどうすればよいですか?

私はmod_wsgiのdaemon modeを使って、pythonパスを手動で定義するという同じ球場のまわりのソリューションを見てきました。組み込みモードでこれを行う方法はありますか?

EDIT: Apacheのエラーログ:通常のPythonとWSGIため

[Wed Nov 02 16:08:02.931400 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] mod_wsgi (pid=48202): Target WSGI script '/home/nitay/Desktop/WebsitePath/Python/wsgi.py' cannot be loaded as Python module., referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931475 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] mod_wsgi (pid=48202): Exception occurred processing WSGI script '/home/nitay/Desktop/WebsitePath/Python/wsgi.py'., referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931557 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] Traceback (most recent call last):, referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931601 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] File "/home/nitay/Desktop/WebsitePath/Python/wsgi.py", line 9, in <module>, referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931687 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223]  import sprites, referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931705 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] File "/home/nitay/Desktop/WebsitePath/Python/sprites.py", line 1, in <module>, referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931767 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223]  from PIL import Image, referer: http://192.168.1.247/index.html 
[Wed Nov 02 16:08:02.931830 2016] [wsgi:error] [pid 48202:tid 140100207392512] [client 192.168.1.179:29223] ImportError: No module named PIL, referer: http://192.168.1.247/index.html 

のsys.path &バージョン:

Normal: 
>>> sys.version 
'2.7.11+ (default, Apr 17 2016, 14:00:29) \n[GCC 5.3.1 20160413]' 
>>> sys.path 
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/nitay/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/gtk-2.0'] 

WSGI: 
>>> sys.version 
2.7.11+ (default, Apr 17 2016, 14:00:29) [GCC 5.3.1 20160413] 
>>> sys.path 
['/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib 
+0

普段とWSGIから実行したときに、私は 'sys.version'と' sys.path'をcompateでしょう。 – furas

+0

Apacheエラーログから完全なエラーメッセージとトレースバックを表示します。 –

+0

組み込みモードを使用する理由についても説明します。とにかくデーモンモードを使用するのが好ましい設定です。 –

答えて

2

私が使用し、この時間は適切なものを命名、サーバの設定をやり直しvirtualenv、デーモンモードをwsgiに設定します。物語の

<VirtualHost *:80> 
     ServerAdmin [email protected] 
     DocumentRoot /var/www/ 

     ErrorLog ${APACHE_LOG_DIR}/error.log 
     CustomLog ${APACHE_LOG_DIR}/access.log combined 

     WSGIDaemonProcess sprites-toolbox python-path=/home/nitay/Desktop/SpritesToolbox/Python:/home/nitay/Desktop/SpritesToolbox/Python/sprite-toolbox-env/lib/python2.7/site-packages 
     WSGIProcessGroup sprites-toolbox 

     WSGIScriptAlias /wsgi/ /home/nitay/Desktop/SpritesToolbox/Python/wsgi.py 


     <Directory "/home/nitay/Desktop/SpritesToolbox/Python"> 
      Require all granted 
     </Directory> 
</VirtualHost> 

教訓:

ここに私がなってしまったApacheの設定ですか? "時間は貴重で、賢明に無駄にする"(半分のサーバー構成はしないでください)

+1

ベストプラクティスは、 '' python-path''に '' site-packages''を追加しないことです。仮想環境の場所を指定するには '' python-home''オプションを使います。 http://blog.dscpl.com.au/2014/09/using-python-virtual-environments-with.html –

+0

をご覧ください。ありがとう! – Nitay

0

私はこれに固執し、上記の議論が本当に助けになりました。私のソリューションは、しかし、例えば、私のWSGIプログラムの先頭でPythonのパスを設定するだけでした。:

def application(environ, start_response): 
    import sys 
    path = "/usr/local/lib64/python2.7/site-packages/" 
    if path not in sys.path: sys.path.append(path) 
+0

あなたは '' application() ''の呼び出しでそれを行うべきではありません。また、そのパスを追加すると、使用しようとしているPythonのインストール用にmod_wsgiがコンパイルされていない可能性があります。 Pythonインストールの '' site-packages''ディレクトリを明示的に追加する必要はありません。 Pythonのインストールを混ぜると、他の問題に遭遇する可能性があります。 –

+0

Amazon LinuxとWSGIに問題があるようであることを除いて、他の人が議論している点を除いて、あなたに同意できません。多くのバージョンのCentosでこの問題に遭遇したことはありません。 Amazon Linuxでyumをインストールしたwsgiがコンパイルされているかどうかはわかりません。これは動作し、Apacheの設定... YMMVの変更は必要ありません。 – user2099484

+0

''/usr/local''の下にインストールされたPython 2.7に対してコンパイルされたカスタムmod_wsgiを提供するかもしれないが、 ''/usr''の下に別個のシステムPythonがインストールされているようです。そうであれば、Apacheの設定で '' WSGIPythonHome/usr/local''を設定する必要があります。そうでなければ、 ''/usr''の下にPythonのインストールファイルを使用します。同じ。 –

関連する問題