mod_wsgi未找到模块-apache、RHEL、python3.4
我让mod_wsgi在RHEL/Apache2.4/python3.4/djang1.11/virtualenv上运行良好。然后,我在virtualenv中使用pip将numpy从1.14.0升级到1.14.2,安装pandas,并安装其他几个模块。然后我重新启动了Apache,并开始出现服务器错误,表明在尝试调用numpy.arange时,mod_wsgi未找到模块-apache、RHEL、python3.4,python,mod-wsgi,python-3.4,rhel,Python,Mod Wsgi,Python 3.4,Rhel,我让mod_wsgi在RHEL/Apache2.4/python3.4/djang1.11/virtualenv上运行良好。然后,我在virtualenv中使用pip将numpy从1.14.0升级到1.14.2,安装pandas,并安装其他几个模块。然后我重新启动了Apache,并开始出现服务器错误,表明在尝试调用numpy.arange时,AttributeError:'module'对象没有属性'arange',或者在尝试调用matplotlib.use('Agg')时出现类似错误,等等 我
AttributeError:'module'对象没有属性'arange',或者在尝试调用matplotlib.use('Agg')时出现类似错误,等等
我用以下内容替换了wsgi.py,它工作得很好。一旦我取消对任何numpy或matplotlib调用的注释,它将返回一个500错误,并且在apache错误日志中显示一个类似于AttributeError的错误:“module”对象没有属性…
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:
apachehttpd.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}
我不确定是什么原因导致了这个破裂。我知道当mod_wsgi为错误的python版本编译时,通常会发生这种情况。但是这在以前工作得很好,而且似乎所有的配置都是正确的:mod_wsgi正在运行,wsgi.py的输出表明它使用的是正确版本的python,并且virtualenv的site packages目录位于python路径中
我已经在python3.4的主位置安装了mod_wsgi,并尝试将apacheloadmodule指向该实例,但仍然得到相同的错误
我还应该检查什么
sys.executable是否应该指向virtualenv而不是主python安装?我应该pip卸载所有模块并重新开始吗
另外,要安装pandas,我必须安装Cython,这反过来要求我安装gcc-c++(sudo-yum-install-gcc-c++
)。这会影响什么吗
编辑以添加错误跟踪。我在上面的wsgi.py文件中取消了对行a=np.arange(15)的注释
来自Apache的HTTP错误页:
内部服务器错误
服务器遇到内部错误或错误
配置错误,无法完成
你的要求
请通过以下地址与服务器管理员联系:
root@localhost要通知他们此错误发生的时间,
以及您在此错误之前执行的操作
有关此错误的详细信息,请参阅
在服务器错误日志中
Apache错误日志(注意,在这里发布之前,我将IP地址打了x):
尝试显示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__']
['ALLOW_THREADS', 'AxisError', 'BUFSIZE', 'CLIP', 'ComplexWarning', 'DataSource', 'ERR_CALL', ..... clipped for brevity - there's a full screen of items in the list
所以它不会出错,但它不是标识符的完整列表。从virtualenv解释器运行dir(np)会导致:
dir(np)=['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
['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']))
np.\uuuu path\uuuuuu=\u名称空间路径(['/usr/local/virtualenvs/myapp/lib/python3.4/site packages/numpy']))
np.doc=无
np.loader=
np.package=numpy
np.name=numpy
np.Spec=ModuleSpec(name='numpy',loader=None,origin='namespace',submodule\u search\u locations=\u NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site packages/numpy']))
为了确保wsgi/python真正找到了numpy包,我将wsgi.py文件更改为导入一个不存在的包import foo as np
,当我再次运行它时,它出错为ImportError:No module name'foo'
。所以它看起来确实在寻找网站包。。。但只是没有完全加载它们?有趣的事实:当pip安装新模块时,它会设置权限,以便用户能够按预期导入和使用模块,但“其他”权限允许查看模块,但不允许执行模块。因此,在Apache下运行的mod_wsgi能够导入模块,但调用任何方法都会导致错误
解决方案:安装或更新python模块后,请仔细检查权限!我将所有目录设置为755,所有文件设置为644,这似乎有效。或者,如注释中所述,确保在运行pip之前正确设置了umask。包括Python exception.HTTP错误的完整回溯和描述,并将添加的代码记录到WSGI脚本文件中以转储np.\uuuuu文件\uuuuu
。计算出从何处导入numpy
。尝试打印模块的文件位置时添加了错误。如果将其转储,您会得到什么dir(np)
?您的描述听起来不正确。这与pip
无关,它受运行pip
时为您的帐户设置的umask
的控制。典型的umask
是0022
。这将导致文件仍然可读,目录仍然可读且可执行(可搜索)。那应该很好。只有当您将umask
更改为限制性更强的内容,从而将可执行位留给其他人时,才会出现问题。