Назад | Перейти на главную страницу

Debian Lenny, Python 2.7 и mod_wsgi

Я использую систему 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 для различных виртуальных сред.