我正在运行Python 2.5.2附带的Debian Lenny框。 我只想为我的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没有任何问题。 它还可以在/usr/local/lib/python2.7/packagesfind通过pip安装的软件包。
接下来,我构build了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>
(当然,在/etc/apache2/mods-enabled , wsgi.conf是wsgi.conf链接的。)
最后,我重新启动了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文档的Installation Issues部分find的testingWSGI脚本,但是我在这里得到了相同的TypeError 。 从回溯的angular度来看,我猜测Apache现在将运行Python 2.5与为2.7编译的mod_wsgi相结合。
有任何想法吗?
问题解决了。 mod_python也被加载,禁用它的伎俩。 因为它是Lenny的Apache提供的vanilla mod_python ,所以它是针对Python 2.5.2进行编译的 – 当然,这不能与针对不同版本编译的mod_wsgi结合使用。
tl; dr确保Apache用户帐户inheritance的PATH看到Python2.7 /bin而不是旧版本。
http://modwsgi.googlecode.com/svn/branches/mod_wsgi-1.X/README
“如果你安装了多个版本的Python,并且你没有使用默认的版本,那么你可能需要组织Apache运行时inheritance的PATH,这样Apache会find替代版本,或者,WSGIPythonExecutable指令应该用于指定与编译的Python版本相对应的“python”可执行文件的确切位置,如果没有这样做,在Apache中运行的Python版本可能会尝试使用来自错误版本的Python的Python模块。
除此之外,除了在Debian内部运行另一个debian外,没有什么可以做的。
http://www.eggdrop.ch/texts/uml/
让Nginx反向代理到不同的虚拟环境。