Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的不同

Posted

技术标签:

【中文标题】Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的不同【英文标题】:Apache mod_wsgi uses different version of python than which mentioned in python-path and WSGIPythonHome 【发布时间】:2016-04-10 04:02:40 【问题描述】:

有很多类似的问题,但我已经解决了所有问题,但没有一个能解决我的问题。我在 Centos 6 中配置了 httpd 以使用 mod_wsgi 运行 django。由于 dist python 是 2.6 版,我编译并安装了 python2.7(UCS2,shared-lib)。在/var/www/uatenv下创建了一个带有virtualenv -p /usr/local/bin/python2.7的virtulenv

<VirtualHost *:8080>
    Alias /static/ /var/www/uatenv/my_app/static/
    WSGIDaemonProcess rbuat python-path=/var/www/my_app/core:/var/www/uatenv/lib/python2.7/site-packages
    WSGIProcessGroup rbuat
    WSGIScriptAlias / /var/www/uatenv/my_app/core/wsgi.py
</VirtualHost>

但是服务器抛出了 500 错误并且它使用了不同版本的 python 为了获得更多详细信息,我在wsgi.py 中添加了几行如下

import sys
print sys.version
print sys.executable
print sys.maxunicode
print sys.prefix

重新启动服务器后,从日志中获取了以下详细信息

[notice] Apache/2.2.15 (Unix) DAV/2 mod_wsgi/4.4.21 Python/2.7.10 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
[error] 2.7.10 (default, Dec 29 2015, 07:15:09)
[error] [GCC 4.4.7 20120313 (Red Hat 4.4.7-16)]
[error] /usr/bin/python
[error] 1114111
[error] /usr/local
[error] [client 10.3.35.113] mod_wsgi (pid=7118): Target WSGI script '/var/www/uatenv/my_app/core/wsgi.py' cannot be loaded as Python module.
[error] [client 10.3.35.113] mod_wsgi (pid=7118): Exception occurred processing WSGI script '/var/www/uatenv/my_app/core/wsgi.py'.
[error] [client 10.3.35.113] Traceback (most recent call last):
[error] [client 10.3.35.113]   File "/var/www/uatenv/my_app/core/wsgi.py", line 17, in <module>
[error] [client 10.3.35.113]     from django.core.wsgi import get_wsgi_application
[error] [client 10.3.35.113]   File "/var/www/uatenv/lib/python2.7/site-packages/django/__init__.py", line 1, in <module>
[error] [client 10.3.35.113]     from django.utils.version import get_version
[error] [client 10.3.35.113]   File "/var/www/uatenv/lib/python2.7/site-packages/django/utils/version.py", line 5, in <module>
[error] [client 10.3.35.113]     import subprocess
[error] [client 10.3.35.113]   File "/usr/local/lib/python2.7/subprocess.py", line 430, in <module>
[error] [client 10.3.35.113]     import pickle
[error] [client 10.3.35.113]   File "/usr/local/lib/python2.7/pickle.py", line 34, in <module>
[error] [client 10.3.35.113]     import struct
[error] [client 10.3.35.113]   File "/usr/local/lib/python2.7/struct.py", line 1, in <module>
[error] [client 10.3.35.113]     from _struct import *
[error] [client 10.3.35.113] ImportError: /usr/local/lib/python2.7/lib-dynload/_struct.so: undefined symbol: PyUnicodeUCS2_AsEncodedString

所以从日志中它正在使用 /usr/bin/python 并显示 2.7 但是当我运行时

# /usr/bin/python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)

我的问题是:

    为什么不使用我在wsgi config中给出的python? 如果使用的是/usr/bin/python,那为什么显示为2.7? 如何让我的服务器运行 python 2.7?

【问题讨论】:

你是如何安装 mod_wsgi 的?如果您从 centos 存储库安装它,它可能是针对 python2.6 编译的,并且与 python2.7 不兼容。您还需要自己编译 mod_wsgi。 【参考方案1】:

1) 检查

site.addsitedir('/var/www/uatenv/lib/python2.7/site-packages')

行存在或不指向 /var/www/uateenv/my_app/core/wsgi.py 文件中的另一个路径。

2) /usr/bin/python是一个链接文件

3)

sudo mv /usr/bin/python /root/python.backup  

这会在根目录下备份python文件。然后:

sudo ln -s /usr/bin/python2.7 /usr/bin/python

【讨论】:

我没听懂。你能解释一下吗? 在您的“wsgi.py”文件中是否有我在代码块中告诉您的一行?还是它解决了您的 python 2.6 路径? 不。我在 wsgi.py 中没有那行,我在 virtualhosts 下的 apache 配置中配置了一个 WSGI python 路径,它指向 python 2.7 代码块。 请添加然后告诉我们结果,它可能是“为什么它不使用我在wsgi config中给出的python?”的答案 我做到了,但没有帮助,我的 Python 路径中已经有了这条路径。【参考方案2】:

听起来您的问题可能与您编译新版本 Python 的方式有关。你是用--enable-shared 编译的吗?我忘记了它发生的确切原因,但是当您不包含该标志时,您的系统仍然使用默认值。

然后,当您确实包含该标志时,您可能会遇到更多问题,但这些答案应该会有所帮助:

Compiled Python binary reports wrong version Compile Python 2.7.3 from source on a system with Python 2.7 already

基本上,我使用的命令是:

sudo ./configure --enable-shared --prefix=/install/python/here LDFLAGS=-Wl,-rpath=/install/python/here/lib
sudo make
sudo make altinstall

【讨论】:

以上是关于Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_wsgi 在 apache 上设置 Django

django部署到apache上(非常重要的,3者版本要一致,是32位就都要是32位的)

使用 mod_wsgi 和 django 运行 Apache

Apache + mod_wsgi 与 nginx + gunicorn

Django/Apache 使用 mod_wsgi 冻结

如何在 Apache 和 mod_wsgi 中使用 Flask 路由?