Python@TW: 會眾| IRC| Planet| 郵件列表| 聯絡我們

Зачем использовать mod_python

mod_python включает интерпретатор Python в сервер Apache. Это сокращает время инициализации и расщепления (forking) CGI-скриптов. Этот процесс не может запускаться под разными пользователями. Он всегда запускается под основным пользователем и группой Apache. Убедитесь, что файлы вашей wiki доступны серверу Apache на чтение и запись.

<!> Базовая конфигурация пригодна для mod_python 3.1.3 и выше. Если вы используете более старую версию, смотрите раздел "Старые версии mod_python"

<!> mod_python послужит причиной значительного увеличения требований процесса Apache к памяти - особенно когда Apache запускает много отдельных процессов, каждому из которых нужна своя собственная копия кода и данных Python в памяти процесса. Вы можете найти, что FastCGI, как описано в ../ApacheWithFastCgi более эффективен в этом отношении.

Базовая настройка

  1. Установите mod_python
  2. Создайте экземпляр wiki
  3. Отредактируйте wikiconfig.py

  4. Измените httpd.conf Apache

  5. Перезапустите Apache

Ниже приводится пример конфигурации, где экземпляр wiki под названием mywiki установлен в каталог /var/www/moin/mywiki и MoinMoin установлен в расположение по умолчанию (python's default site library). wiki доступна по адресу /mywiki на сервере - http://my.ser.ver/mywiki. Вам нужно будет изменить эти значения, чтобы они соответствовали вашей установке.

Установка mod_python

Большинству людей достаточно просто добавить пакет mod_python в установку своей операционной системы. Если вы собираете его из исходников, то проконсультируйтесь с документацией по mod_python.

При установке mod_python нужно добавить несколько строк в конфигурационный файл Apache или в его собственный конфигурационный файл (например, в Red Hat или Fedora linux конфигурация mod_python находится в файле /etc/httpd/conf.d/python.conf).

Убедитесь, что в вашем httpd.conf есть эта строка, иначе mod_python работать не будет:

LoadModule python_module modules/mod_python.so

После этого перезапустите Apache и убедитесь, что он стартовал успешно и что error log содержит строку, подобную этой:

[Sat Jan 01 15:40:49 2005] [notice] mod_python: Creating 4 session mutexes based on 150 max processes and 0 max threads.

Вам может понадобиться изменить некоторые переменные окружения на (например) FreeBSD - это подробнее описано в сообщении установки порта.

Настройка экземпляра wiki

Она делается так, как описано в ../Создании экземпляра wiki. Рекомендуется сначала сконфигурировать wiki с cgi и проверить её работу, а потом уже менять конфигурацию для работы с mod_python. Это позволит вам быть уверенным, что любые проблемы при этом связаны с переходом на mod_python, а не с базовой установкой MoinMoin.

  1. Скопируйте moin.cgi в каталог вашей wiki
  2. Сконфигурируйте httpd.conf как cgi (для начала):

    • Alias /wiki/ "/usr/share/moin/htdocs/"
      ScriptAlias /mywiki "/var/www/moin/mywiki/moin.cgi"

Перезапустите Apache и проверьте работу вашей wiki.

Редактирование `wikiconfig.py`

Убедитесь, что вы используете только абсолютные пути - относительные пути не будут работать!

data_dir = '/var/www/moin/mywiki/data/'
data_underlay_dir = '/var/www/moin/mywiki/underlay/'

Если вы не хотите использовать абсолютные пути, вы можете воспользоваться Python'овским модулем os для создания относительных путей: {{{import os data_dir = os.path.join(os.path.dirname(file), 'data/') data_underlay_dir = os.path.join(os.path.dirname(file), 'underlay/') }}}

Убедитесь, что wiki работает после этих изменений.

Изменение конфигурационного файла Apache `httpd.conf`

После того, как ваша wiki запустилась как cgi-скрипт, преобразуйте её для запуска с mod_python.

Если вы запустили вашу wiki как cgi, как мы советовали ранее, удалите или закомментируйте директиву ScriptAlias:

#ScriptAlias /mywiki "/var/www/moin/mywiki/moin.cgi"

Добавьте директиву Location:

<Location /mywiki>
    SetHandler python-program
    # Add the path of your wiki directory
    PythonPath "['/var/www/moin/mywiki'] + sys.path"
    PythonHandler MoinMoin.request::RequestModPy.run
</Location>

Если у вас много экземпляров MoinMoin, то добавьте по одной директиве location для каждого из них (изменяя пути соответственно) и добавьте строку с директивой PythonInterpreter mywiki в каждый раздел Location. Эта директива создаст разные субинтерпретаторы с полностью раздельными пространствами имён, которые будут использоваться для каждой из wiki (подробности см. здесь).

Если вы устанавливали MoinMoin не в каталог по умолчанию, вам понадобится добавить путь к MoinMoin к системным путям:

    PythonPath "['/var/www/moin/mywiki', '/prefix/lib/python2.x/site-packages'] + sys.path"

Перезапустите Apache - теперь всё должно работать правильно.

Решение проблем с некорневыми wiki

На некоторых установках mod_python передаёт MoinMoin неверные script_name и path_info. Это обычно случается, когда используется директива Location Apache, с wiki в произвольном пути:

<Location /farm/mywiki>
    ...
</Location>

Это не будет работать, поскольку не ясно, что является именем скрипта, поскольку настройка location не является реальным скриптом.

Чтобы решить эту проблему, используйте директиву PythonOption:

<Location /farm/mywiki>
    # Значение Location должно совпадать со значением Location Apache!
    PythonOption Location /farm/mywiki
    ...
</Location>

Настройка корневой wiki

Вы можете пожелать, чтобы ваша wiki представлялась находящейся в корне веб-сервера - например так, что http://wiki.example.com/ будет переходить к вашей wiki, что удобнее, чем использовать http://wiki.example.com/mywiki/. Это требует слегка другой формы настроек используя mod_rewrite - это стандартынй модуль современных дистрибутивов Apache, и он часто разрешён по умолчанию.

Вам нужно установить экземпляр вашей wiki как описано выше, и также скопировать moinmodpy.py из каталога установки Moin в каталог экземпляра wiki (/var/www/moin/mywiki в этих примерах).

В настройках Apache нужно включить mod_rewrite - так что строка

LoadModule rewrite_module modules/mod_rewrite.so

должна оказаться в первой части файла настроек httpd.conf.

Настройка wiki и виртуального хоста должна выглядеть примерно так:

<VirtualHost *:80>
  ServerAdmin postmaster@example.com
  DocumentRoot /var/www/html
  ServerName wiki.example.com
  Alias /wiki/ "/usr/share/moin/htdocs/"

  # Rewrite urls
  RewriteEngine On
  RewriteLogLevel 0
  # map /wiki static files to Moin htdocs
  RewriteRule ^/wiki/(.*)$ /usr/share/moin/htdocs/$1 [last]
  RewriteRule ^/robots.txt$ /usr/share/moin/htdocs/robots.txt [last]
  RewriteRule ^/favicon.ico$ /usr/share/moin/htdocs/favicon.ico [last]
  # map everything else to server script
  RewriteRule ^(.*)$ /var/www/moin/mywiki/moinmodpy.py$1

  <Directory "/var/www/moin/testwiki">
    # Modpy stuff
    AddHandler python-program .py
    # Add the path to the wiki directory, where
    # moinmodpy.py and wikiconfig.py are located.
    PythonPath "['/var/www/moin/mywiki'] + sys.path"
    PythonHandler moinmodpy
  </Directory>
</VirtualHost>

Перезапустите Apache и FrontPage mywiki должна теперь появиться на http://wiki.example.com/.

Другие способы работы с wiki корневого уровня под Apache рассмотрены в главе с соответствующим названием HelpOnConfiguration/ApacheVoodoo.

Старые версии mod_python

Версии 2.7.10, 3.0.4 и 3.1.2b mod_python имели ошибку apache.resolve_object. О ней было доложено разработчикам the mod_python и в версии 3.1.3 она была исправлена. Наилучшим решением будет обновление до текущей версии. Однако, если вы не можете этого сделать, есть два возможных решения:

Использовать скрипт-обёртку (wrapper script)

MoinMoin идёт со скриптом-обёрткой moinmodpy.py, и это может быть использовано путём изменения директив PythonPath и PythonHandler как показано в файле moinmodpy.htaccess. В MoinMoin 1.2 обёртка называлась moin_modpy.py.

Исправление mod_python

Версии 2.7.10, 3.0.4 и 3.1.2b mod_python имеют небольную ошибку resolver. Метод resolve_object в mod_python/apache.py проверяет неверный объект и это приводит к отказу RequestModPy.run.

Чтобы исправить это вам нужно изменить метод resolve_object (в районе строки 551 для mod_python 3.1.2b) с

        if silent and not hasattr(module, obj_str):
            return None

на

        if silent and not hasattr(obj, obj_str):
            return None

Устранение проблем

Доступ к странице выдаёт ошибку Apache::