Я использую систему Debian Lenny, которая поставляется с Python 2.5.2. Я хотел бы запустить Python 2.7 для своих приложений WSGI только, оставив 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
теперь из командной строки работает без проблем. Он также находит пакеты, установленные через pip
в /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
Я также попробовал тестовый сценарий WSGI, найденный в Проблемы с установкой раздел mod_wsgi
Документации, но я получаю то же самое TypeError
Вот. Судя по трассировке, я предполагаю, что Apache теперь запускает Python 2.5 в сочетании с mod_wsgi
скомпилирован для 2.7.
Любые идеи?
Задача решена. mod_python
также был загружен, отключение его помогло. Как это ваниль mod_python
поставляется с Apache Ленни, он скомпилирован против Python 2.5.2 - естественно, это не может работать в сочетании с mod_wsgi
скомпилирован против другой версии.
tl; dr Убедитесь, что PATH
унаследованный учетной записью пользователя Apache, видит Python2.7 /bin
а не более старая версия.
http://modwsgi.googlecode.com/svn/branches/mod_wsgi-1.X/README
«Если у вас установлено несколько версий Python, и вы не используете ту, которая используется по умолчанию, вам, возможно, придется организовать, чтобы PATH, унаследованный приложением Apache при запуске, приводил к тому, что Apache находил альтернативную версию. В качестве альтернативы директива WSGIPythonExecutable должна использоваться для указания точного местоположения исполняемого файла 'python', соответствующего версии Python, для которой скомпилирован. Если этого не сделать, версия Python, работающая в Apache, может попытаться использовать модули Python из неправильной версии Python ».
Кроме этого, ничего нельзя сделать, кроме запуска другого debian внутри debian.
http://www.eggdrop.ch/texts/uml/
Наличие обратного прокси Nginx для различных виртуальных сред.