Конфигурирование и установка python2.6.7 и mod_wsgi3.3 на RHEL для производства - PullRequest
0 голосов
/ 29 сентября 2011

Это длинный вопрос, подробно описывающий все, что я делал с самого начала.Надеюсь, поможет.Я работаю над приложением django, и мне нужно развернуть его на рабочем сервере.Рабочий сервер - это виртуальный сервер, управляемый ИТ-отделом, и у меня нет корневого доступа.Они дали мне права управлять установками моих модулей в / swadm и / home / swadm.Поэтому я планировал создать следующую схему:

  • /swadm/etc/httpd/conf, где я поддерживаю httpd.conf
  • /swadm/etc/httpd/user-modules, где я поддерживаю свои модули apache (mod_wsgi)
  • /swadm/var/www/django/app, где я поддерживаю свой код django
  • /swadm/usr/local/python/2.6, где я буду поддерживать мою установку на python 2.6.7 с модулями, такими как django, южный и т. Д.
  • /home/swadm/setup, где ябудет хранить необходимые исходные архивы, выполнять сборку и установку из.
  • /home/swadm/workspace, где я буду поддерживать код приложения, который находится в разработке.

Система имеетУстановлены python2.4.3 и python2.6.5, но ИТ-отдел рекомендовал мне сохранить собственную установку python, если мне потребовалось установить много пользовательских модулей (что я и буду).

Поэтому я загрузил исходный код python2.6.7.Мне нужно было убедиться, что Python установлен так, что его общая библиотека доступна.Когда я запустил скрипт configure только с опцией --enable-shared и --prefix=/swadm/usr/local/python/2.6, он был бы установлен, но неожиданно указывал на установку системы python2.6.5.

$ /swadm/usr/local/python/2.6/bin/python
Python 2.6.5 (r265:79063, Feb 28 2011, 21:55:45)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Итак, я запустил скрипт настройки, следуя инструкциям из Сборка Python с --enable-shared в нестандартном расположении как

./configure --enable-shared --prefix=/swadm/usr/local/python/2.6  LDFLAGS="-Wl,-rpath /swadm/usr/local/python/2.6/lib"

Также убедившись, чтоЯ создал каталоги заранее (как предполагает ссылка), чтобы избежать ожидаемых ошибок.Теперь, набрав /swadm/usr/local/python/2.6/bin/python, вы получите правильную версию Python 2.6.7.Поэтому я перешел к настройке и установке mod_wsgi.Я настроил его как

./configure --with-python=/swadm/usr/local/python/2.6/bin/python

Созданный Makefile пытается установить модуль в /usr/lib64/httpd/modules, и у меня нет разрешения на запись туда, поэтому я изменил make-файл для установки в /swadm/etc/httpd/user-modules.(Там может быть аргумент команды, но я не мог понять это).Модуль создан хорошо.Тестовый сценарий wsgi, который я использовал, был

import sys

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'
    output = output + str(sys.version_info)
    output = output + '\nsys.prefix = %s' % repr(sys.prefix)
    output = output + '\nsys.path = %s' % repr(sys.path)
    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

И показанный результат был удивительно

Hello World!(2, 6, 5, 'final', 0)
sys.prefix = '/swadm/usr/local/python/2.6'
sys.path = ['/swadm/usr/local/python/2.6/lib64/python26.zip',    '/swadm/usr/local/python/2.6/lib64/python2.6/', '/swadm/usr/local/python/2.6/lib64/python2.6/plat-linux2', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-tk', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-old', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-dynload']`

Итак, вы видите, что модуль mod_wsgi каким-то образом все еще настроен с системным python 2.6.5установка, а не мой заказ.Я пробовал разные вещи, подробно описанные в документации mod_wsgi

  • Установите WSGIPythonHome в httpd.conf на /swadm/usr/local/python/2.6 и WSGIPythonPath на /swadm/usr/local/python/2.6/lib/python2.6
  • Создана символическая ссылка в каталоге конфигурации python для указания на файл libpython2.6.so

    $ ln -s ../../libpython2.6.so

Когда я делаю ldd libpython2.6.so вот что я вижу:

$ ldd libpython2.6.so
 linux-vdso.so.1 =>  (0x00007fffc47fc000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b666ed62000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00002b666ef7e000)
 libutil.so.1 => /lib64/libutil.so.1 (0x00002b666f182000)
 libm.so.6 => /lib64/libm.so.6 (0x00002b666f385000)
 libc.so.6 => /lib64/libc.so.6 (0x00002b666f609000)
 /lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)

И ldd mod_wsgi.so дает

$ ldd /swadm/etc/httpd/user-modules/mod_wsgi.so
 linux-vdso.so.1 =>  (0x00007fff1ad6e000)
 libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00002af03aec7000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00002af03b270000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00002af03b48c000)
 libutil.so.1 => /lib64/libutil.so.1 (0x00002af03b690000)
 libm.so.6 => /lib64/libm.so.6 (0x00002af03b893000)
 libc.so.6 => /lib64/libc.so.6 (0x00002af03bb17000)
 /lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)

Я пытался переустановить и перенастроитьpython и mod_wsgi но безрезультатно.Пожалуйста, дайте мне знать, где я иду не так.(Извините за очень длинный пост)

TLDR ;Система с доступом без полномочий root имеет установку по умолчанию на python.Я поддерживаю свои собственные модули Python и Python.mod_wsgi, настроенный и созданный с использованием пользовательского питона, по-прежнему указывает на системный питон, когда я запускаю тестовый сценарий, который выводит sys version_info и путь.

UPDATE : при просмотре через стековый поток (следовало бы сделать это раньше) Я нашел этот ответ Грэма Дамплтона в mod_wsgi python2.5 ubuntu 11.04, проблема , которая решила ошибку для меня.Теперь, когда я делаю ldd mod_wsgi.so, я вижу, что он связан с правильной общей библиотекой python.Теперь я установил Django и MySQLdb, используя мою собственную установку Python.И теперь я сталкиваюсь с этой ошибкой:

The following error occurred while trying to extract file(s) to the Python egg
cache:
[Errno 13] Permission denied: '/var/www/.python-eggs'
The Python egg cache directory is currently set to:
/var/www/.python-eggs
Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

Поэтому я изменил значение PYTHON_EGG_CACHE, выполнив export PYTHON_EGG_CACHE=/swadm/var/www/.python-eggs.но я все еще получаю ту же ошибку.Я расследую больше.Обновлю, когда я решу это.

1 Ответ

2 голосов
/ 29 сентября 2011

Проблема с яичным кешем решена путем установки переменной окружения в сценарии WSGI:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Access_Rights_Of_Apache_User

или в конфигурации Apache:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPythonEggs http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

Какой из последних двух используется, зависит от того, используется ли режим emebedded или режим демона.

...