我正在运行 Debian Lenny box,它附带 Python 2.5.2。我想为我的 WSGI 应用程序运行 Python 2.7仅有的,保留 2.5 作为系统默认值,但我无法让它工作。
首先,我从源代码安装了 Python 2.7.2 /usr/local
:
Python-2.7.2 # ./configure --enable-shared
[…]
Python-2.7.2 # make
[…]
Python-2.7.2 # make altinstall
[…]
从命令行调用python2.7
now 没有任何问题。它还会找到通过pip
in安装的包/usr/local/lib/python2.7/packages
。
接下来,我mod_wsgi
手动构建并将其复制到 Apache 模块目录,以免触碰放置的文件apt-get
。
mod_wsgi-3.3 # ./configure --with-python=/usr/local/bin/python2.7
[…]
mod_wsgi-3.3 # make
[…]
mod_wsgi-3.3 # cp .libs/mod_wsgi.so /usr/lib/apache2/modules/mod_wsgi.so-2.7
mod_wsgi-3.3 # cd /usr/lib/apache2/modules
modules # ln -sf mod_wsgi.so-2.7 mod_wsgi.so
modules # ldd mod_wsgi.so-2.7
linux-vdso.so.1 => (0x00007fff08f53000)
libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0 (0x00002b0317e1f000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00002b03181fd000)
libdl.so.2 => /lib/libdl.so.2 (0x00002b031841a000)
libutil.so.1 => /lib/libutil.so.1 (0x00002b031861e000)
libm.so.6 => /lib/libm.so.6 (0x00002b0318821000)
libc.so.6 => /lib/libc.so.6 (0x00002b0318aa5000)
/lib64/ld-linux-x86-64.so.2 (0x00002b03179cd000)
然后我修改/etc/apache2/mods-available/wsgi.conf
并添加了以下指令:
<IfModule mod_wsgi.c>
[…]
WSGIPythonHome /usr/local
[…]
</IfModule>
(当然,wsgi.conf
是符号链接的/etc/apache2/mods-enabled
。)
最后,我重新启动了 Apache,但我的 WSGI 脚本无法运行。我在 Apache 的错误日志中收到以下回溯:
mod_wsgi (pid=20746): Exception occurred processing WSGI script '/path/to/script.wsgi'.
Traceback (most recent call last):
File "/usr/local/lib/python2.5/site-packages/Flask-0.7.2-py2.5.egg/flask/app.py", line 1306, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.5/site-packages/Flask-0.7.2-py2.5.egg/flask/app.py", line 1295, in wsgi_app
return response(environ, start_response)
File "/usr/local/lib/python2.5/site-packages/Werkzeug-0.6.2-py2.5.egg/werkzeug/wrappers.py", line 1017, in __call__
start_response(status, headers)
TypeError: expected byte string object for status, value of type str found
我还尝试了安装问题mod_wsgi
文档的部分,但我TypeError
在这里得到同样的结果。从回溯来看,我猜 Apache 现在运行的是 Python 2.5 并结合了mod_wsgi
针对 2.7 的编译。
有任何想法吗?
答案1
问题解决了。 mod_python
也加载了,禁用它就可以了。由于它是 Lenny's Apache 附带的 vanilla ,因此它是针对 Python 2.5.2 编译的 — 当然,这不能与针对不同版本编译的mod_python
结合使用。mod_wsgi
答案2
tl;dr 确保PATH
Apache 用户帐户继承的是 Python2.7/bin
而不是旧版本。
http://modwsgi.googlecode.com/svn/branches/mod_wsgi-1.X/README
“如果您安装了多个版本的 Python,并且您没有使用默认版本,则可能必须组织 Apache 应用程序在运行时继承的 PATH,这将导致 Apache 找到备用版本。或者,应使用 WSGIPythonExecutable 指令来指定与编译的 Python 版本相对应的“python”可执行文件的确切位置。如果不这样做,Apache 中运行的 Python 版本可能会尝试使用错误版本的 Python 中的 Python 模块。”
除此之外,除了在 Debian 内部运行另一个 Debian 之外,没有其他可以做的事情。
http://www.eggdrop.ch/texts/uml/
对不同的虚拟环境有 Nginx 反向代理。