簡體   English   中英

mod_wsgi找不到模塊-Apache,RHEL,python3.4

[英]mod_wsgi not finding modules - apache, RHEL, python3.4

我讓mod_wsgi在RHEL / Apache2.4 / python3.4 / Django1.11 / virtualenv上運行良好。 然后,我在virtualenv中使用pip將numpy從1.14.0升級到1.14.2,安裝了pandas,並安裝了其他幾個模塊。 然后我重新啟動Apache並開始出現服務器錯誤,指示AttributeError: 'module' object has no attribute 'arange' when trying to call numpy.arange ,或嘗試調用matplotlib.use('Agg')等時出現類似錯誤。

我將wsgi.py替換為以下內容,並且工作正常。 一旦取消注釋,任何numpy或matplotlib調用都會返回500錯誤,並且在apache錯誤日志中會顯示類似於AttributeError: 'module' object has no attribute ...的錯誤AttributeError: 'module' object has no attribute ...

import datetime
import sys
import numpy as np
import matplotlib as mpl
import mod_wsgi

def application(env, start_response):

    #mpl.use('Agg')
    #a = np.arange(15).reshape(3, 5)
    #a = np.array([2,3,4])

    status = '200 OK'
    output = 'Hello World! This is the wsgi app generated from python!'
    output += '\n\ncurrent time is: '+str(datetime.datetime.now())
    output += '\n\nsys.executable='+sys.executable
    output += '\n\nsys.path='+str(sys.path)
    output += '\n\nsys.version=' + str(sys.version)
    output += '\n\nsys.prefix=' +  str(sys.prefix)
    output += '\n\nmod_wsgi.version='+str(mod_wsgi.version)
    output += '\n\n\nEnvironment Variables:\n\n'+'\n'.join('%s: %s' % (k, v) for (k, v) in env.items())
    output = bytes(output,'utf-8')
    response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

此wsgi.py的相關輸出:

sys.executable=/usr/bin/python3
sys.path=['/usr/local/virtualenvs/myapp/wsgiapp', '/usr/local/virtualenvs/myapp/lib64/python34.zip', '/usr/local/virtualenvs/myapp/lib64/python3.4', '/usr/local/virtualenvs/myapp/lib64/python3.4/plat-linux', '/usr/local/virtualenvs/myapp/lib64/python3.4/lib-dynload', '/usr/lib64/python3.4', '/usr/lib/python3.4', '/usr/local/virtualenvs/myapp/lib/python3.4/site-packages']
sys.version=3.4.8 (default, Mar 23 2018, 10:04:27) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
sys.prefix=/usr/local/virtualenvs/myapp
mod_wsgi.version=(4, 5, 24)
mod_wsgi.process_group: mywsgiapp
mod_wsgi.application_group: 

Apache httpd.conf不變。 相關行:

LoadModule wsgi_module "/usr/local/virtualenvs/myapp/lib64/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so"
WSGIDaemonProcess mywsgiapp python-home=/usr/local/virtualenvs/myapp python-path=/usr/local/virtualenvs/myapp/wsgiapp
WSGIProcessGroup mywsgiapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /myapp /usr/local/virtualenvs/myapp/wsgiapp/wsgi.py process-group=mywsgiapp application-group=%{GLOBAL}

我不確定是什么原因導致了這一點。 我知道這通常在為錯誤版本的python編譯mod_wsgi時發生。 但這之前運行良好,並且一切似乎仍然配置正確:mod_wsgi正常運行,wsgi.py的輸出表明它使用的是正確版本的python,virtualenv的site-packages目錄位於python-路徑。

我在主要python3.4位置安裝了mod_wsgi,並嘗試將Apache LoadModule指向該實例,但仍然出現相同的錯誤。

我還應該檢查什么?

sys.executable是否應該指向virtualenv而不是主python安裝? 我應該pip uninstall所有模塊並重新開始嗎?

另外,要安裝熊貓,我必須安裝Cython,這又需要安裝gcc-c ++( sudo yum install gcc-c++ )。 這會影響什么嗎?

編輯以添加錯誤跟蹤。 我在上面的wsgi.py文件中取消注釋了a = np.arange(15).reshape(3, 5)這行。

來自Apache的HTTP錯誤頁面:

內部服務器錯誤

服務器遇到內部錯誤或配置錯誤,無法完成您的請求。

請通過root @ localhost與服務器管理員聯系,以通知他們該錯誤發生的時間以及您在該錯誤發生之前執行的操作。

服務器錯誤日志中可能會提供有關此錯誤的更多信息。

Apache錯誤日志(請注意,在發布此處之前,我先將IP地址刪除):

[Thu Jul 12 23:01:15.664941 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] mod_wsgi (pid=21490): Exception occurred processing WSGI script '/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py'.
[Thu Jul 12 23:01:15.727450 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] Traceback (most recent call last):
[Thu Jul 12 23:01:15.727814 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961]   File "/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py", line 14, in application
[Thu Jul 12 23:01:15.727831 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961]     a = np.arange(15).reshape(3, 5)
[Thu Jul 12 23:01:15.727865 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] AttributeError: 'module' object has no attribute 'arange'

嘗試顯示np時出錯。 文件

[Thu Jul 12 23:25:59.196534 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] mod_wsgi (pid=22747): Exception occurred processing WSGI script '/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py'.
[Thu Jul 12 23:25:59.257214 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] Traceback (most recent call last):
[Thu Jul 12 23:25:59.257500 2018] [wsgi:error] [pid 22747] [remote 10.x.x:60353]   File "/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py", line 23, in application
[Thu Jul 12 23:25:59.257535 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353]     output += '\\n\\nnumpy file location='+str(np.__file__)
[Thu Jul 12 23:25:59.257569 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] AttributeError: 'module' object has no attribute '__file__'

另外,僅供參考,如果我激活virtualenv並使用解釋器,則導入模塊的效果很好:

Python 3.4.8 (default, Mar 23 2018, 10:04:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__file__
'/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy/__init__.py'

從wsgi.py文件打印dir(np)將導致:

dir(np)=['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

因此它不會出錯,但是它不是標識符的完整列表。 從virtualenv解釋器運行dir(np)會導致:

['ALLOW_THREADS', 'AxisError', 'BUFSIZE', 'CLIP', 'ComplexWarning', 'DataSource', 'ERR_CALL', ..... clipped for brevity - there's a full screen of items in the list

由於它確實列出了一些標識符,因此這是從wsgi.py中打印每個標識符的結果。 似乎確實是從正確的路徑拿起包裹。

np.__path__ =_NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy'])
np.doc=None
np.loader=<_frozen_importlib._NamespaceLoader object at 0x7f83b82e0c88>
np.package=numpy
np.name=numpy
np.Spec=ModuleSpec(name='numpy', loader=None, origin='namespace', submodule_search_locations=_NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy']))

為了確保wsgi / python確實找到了numpy包,我將wsgi.py文件更改為將不存在的包import foo as np ,當我再次運行它時,它因ImportError: No module named 'foo'而出錯ImportError: No module named 'foo' 因此,它似乎確實是在查找站點包...但只是沒有完全加載它們?

有趣的事實:當pip安裝新模塊時,它會設置權限,以便用戶能夠按預期導入和使用模塊,但是“其他”權限允許看到模塊但不能執行。 因此,在Apache下運行的mod_wsgi能夠導入模塊,但是調用任何方法均會導致錯誤。

解決方案 :安裝或更新python模塊后,請仔細檢查權限! 我將所有目錄設置為755,並將所有文件設置為644,這似乎可以正常工作。 或者,如注釋中所述,在運行pip之前,請確保正確設置了umask。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM