Интересная задача, python2.4 + python2.7 + wsgi + apache

123 4
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
3892

День добрый,

Интересная задача, есть веб сервер для python приложений, там стоит CentOS, в репозитарии только 2.4 питон, он и стоит на сервере, связь с апачем через mod_wsgi. Появилась задача поставить 2.7, ну проблемы вроде нет, качнул исходники, собрал в /opt/ линки разложил, даже модули установил некоторые, но подошел момент когда надо в апач mod_wsgi вложить от нового питона, и вот тут ступор, мне надо что бы оба питона были доступны, т.е какие-то сайты работали с 2.4 как и ранее, а какие-то с новым 2.7. Собственно вопрос "как быть" )))) получится ли каким-то образом для отдельного VHOST подключить модуль собранный с python2.7 ?

С Уважением,

Есть около 15.000 ipv4 !!! (http://onyx.net.ua/price.php#ipv4) Качественный хостинг с 2005 года - лучшее клиентам! (http://onyx.net.ua/)
iHead
На сайте с 25.04.2008
Offline
137
#1

два апача.

Рекомендуемый хостинг партнер 1С-Битрикс (https://www.ihead.ru/bitrix/), PHP-хостинг (https://www.ihead.ru/php/), доверенный партнер RU-CENTER (https://www.ihead.ru/news/573.html), официальный представитель REG.RU в Кирове (https://www.ihead.ru/news/851.html)
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#2
iHead:
два апача.

Та ладно :D Сейчас в голове мелькнула мысль действительно о двух апачах, с проксированием запросов... но как-то это не кошерно, это всего лишь модуль :D

---------- Добавлено 05.09.2012 в 07:38 ----------

Пытался разобрать код mod_wsgi, да бы подменить мне там необходимый WSGIScriptAlias в надежде на то, что удастся собрать копию модуля, собранного с другим python, но названного иначе и с другим ключиком который используется, собрать удалось , подменив "WSGIScriptAlias" на "27WSGIScriptAlias " но вышел факап дальше :)

Ругается об этом:


static void wsgi_python_version(void)
{
const char *compile = PY_VERSION;
const char *dynamic = 0;

dynamic = strtok((char *)Py_GetVersion(), " ");

if (strcmp(compile, dynamic) != 0) {
ap_log_error(APLOG_MARK, WSGI_LOG_WARNING(0), wsgi_server,
"mod_wsgi: Compiled for Python/%s.", compile);
ap_log_error(APLOG_MARK, WSGI_LOG_WARNING(0), wsgi_server,
"mod_wsgi: Runtime using Python/%s.", dynamic);
}
}

После чего чилды начинают круто дохнуть,


[Wed Sep 05 00:03:23 2012] [warn] mod_wsgi: Compiled for Python/2.7.3.
[Wed Sep 05 00:03:23 2012] [warn] mod_wsgi: Runtime using Python/2.4.3.
[Wed Sep 05 00:03:23 2012] [notice] child pid 11878 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:24 2012] [notice] child pid 11879 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:24 2012] [notice] child pid 11880 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:24 2012] [notice] child pid 11881 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:24 2012] [notice] child pid 11882 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:25 2012] [notice] child pid 11884 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:26 2012] [notice] child pid 11886 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:26 2012] [notice] child pid 11887 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11889 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11890 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11891 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11892 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11893 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11894 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:27 2012] [notice] child pid 11895 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:28 2012] [notice] child pid 11896 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:28 2012] [notice] child pid 11897 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:28 2012] [notice] child pid 11898 exit signal Segmentation fault (11)
[Wed Sep 05 00:03:28 2012] [notice] child pid 11899 exit signal Segmentation fault (11)
....

Возможно загруженный ранее модуль от 2.4 откладывает какую-то ссылку где-то на момент подгрузки его апачем, что второй модуль наступает на нее при проверке этой? Я не особо шарящий в C тип , может кто подскажет? Может при сборке , что-то указать принудительно, что бы он RUNTiME воспринимал иначе? именно эта копия модуля. Я так понимаю проблема пока что именно в том, что он определяет откуда-то runtime версию.

Питон собран с --enable-shared (иначе другая ошибка при сборке mod_wsgi в принципе :D)

mod_wsgi-3.3

---------- Добавлено 05.09.2012 в 07:46 ----------

На сколько я вижу срабатывает Py_GetVersion(), которая видимо берется из 'Python.h', в таком случае, какого хрена, если сборка происходила с --prefix=/opt/python/ оно python.h читает по умолчанию... или таки Py_GetVersion() уже срабатывает не из того окружения?

---------- Добавлено 05.09.2012 в 07:58 ----------

Мдя, а static void wsgi_python_version(void) выходит просто "нотификейшон".... видимо падает по какой-то другой причине.....

Andreyka
На сайте с 19.02.2005
Offline
822
#3

Так же как и с двумя php dso - через 2 отдельных апача

Не стоит плодить сущности без необходимости
Boris A Dolgov
На сайте с 04.07.2007
Offline
215
#4

Python устроен так, что для каждого процесса есть некоторая глобальная структура, в которой хранится служебная информация -- загруженные модули, состояние интерпретатора и прочее. Имена у этой структуры в python-2.4 и python-2.7 одинаковые, из-за чего при линковке при загрузке DSO одна структура перекрывает другую и они не могут работать вместе.

Может помочь в исходниках апача заменить RTLD_GLOBAL на RTLD_LOCAL в srclib/apr/dso/unix/dso.c, но я не знаю, не сломает ли это работу других модулей, которые зависят друг от друга. Можно добавить костыль в виде указания RTLD_LOCAL только для питоновских модулей.

Можно попробовать ещё добавить в flags RTLD_DEEPBIND.

С уважением, Борис Долгов. Администрирование, дешевые лицензии ISPsystem, Parallels, cPanel, DirectAdmin, скины, SSL - ISPlicense.ru (http://www.isplicense.ru/?from=4926)
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#5
Boris A Dolgov:
Python устроен так, что для каждого процесса есть некоторая глобальная структура, в которой хранится служебная информация -- загруженные модули, состояние интерпретатора и прочее. Имена у этой структуры в python-2.4 и python-2.7 одинаковые, из-за чего при линковке при загрузке DSO одна структура перекрывает другую и они не могут работать вместе.
Может помочь в исходниках апача заменить RTLD_GLOBAL на RTLD_LOCAL в srclib/apr/dso/unix/dso.c, но я не знаю, не сломает ли это работу других модулей, которые зависят друг от друга. Можно добавить костыль в виде указания RTLD_LOCAL только для питоновских модулей.
Можно попробовать ещё добавить в flags RTLD_DEEPBIND.

Так может собрать wsgi таким образом, что бы они выдавали разные данные в эту самую структуру? Или 2.7 каким-то образом собрать с другим именем для этой структуры и туда модуль направить :D Ну уж очень сильно хочется пройтись таким путем :D

Andreyka
На сайте с 19.02.2005
Offline
822
#6

Некоторые так любят наступать на грабли, что удивляет

Возьми патч для запуска 4 и 5 чпыха как dso паралельно и запусти на стенде

Дай нагрузку и аосмотри что произойдет

Boris A Dolgov
На сайте с 04.07.2007
Offline
215
#7
Romka_Kharkov:
Так может собрать wsgi таким образом, что бы они выдавали разные данные в эту самую структуру? Или 2.7 каким-то образом собрать с другим именем для этой структуры и туда модуль направить :D Ну уж очень сильно хочется пройтись таким путем :D

Ну разве что пробеганием по исходникам и заменой имён.

Но флаги к dlopen() должны решать эту пробему.

M
На сайте с 16.09.2009
Offline
278
#8
Абонементное сопровождение серверов (Debian) Отправить личное сообщение (), написать письмо ().
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#9
Boris A Dolgov:
Ну разве что пробеганием по исходникам и заменой имён.

Не помогло, пробовал...

Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#10

Забил я в общем на два модуля, уже не актуально, возникла другая проблема, есть по прежнему установленный в /usr/ питон 2.4 с ним все работает, поставленный 2.7 ведет себя странно.... А именно: собираю модуль отдельно для 2.7 питона (wsgi), включаю его вместо модуля от 2.4, все в порядке, но вот апликуха начинает выдавать ошибку подключения к базе, причем проблема в том, что пытается апликуха попасть в базу под логином root, а не указанным в settings.py данным (пробовал Django 1.3.1 / 1.4 / 1.4.1) та же фигня. Достаточно обратно вернуть модуль в апаче на 2.4 - все сразу работает, что бы это могло быть?

Я полагаю какие-то проблемы с окружением, или почему игнорируется настройка базы указанная в settings.py ?

myapp.wsgi:


import os
import sys

sys.path.append('/home/.....')
sys.path.append('/home/...../base/templatetags')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
os.environ['PYTHON_EGG_CACHE'] = '/home/...../temp/'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

При таком конфиге, с 2.4 нет никаких проблем. Переключаем на 2.7 и теряется указанное в settings.py:


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxx',
'USER': 'xxxx',
'PASSWORD': 'xxxx',
'HOST': '',
'PORT': '',
},
'afisha': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxx',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': '',
'PORT': '',
}
}

Какие соображения будут :D ?

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий