## Please edit system and help pages ONLY in the master wiki!
## For more information, please see MoinMoin:MoinDev/Translation.
##master-page:HelpOnInstalling/ApacheWithModPython
##master-date:Unknown-Date
#acl -All:write Default
#format wiki
#language ru
<<TableOfContents>>

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

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

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

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

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

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

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

== Установка mod_python ==

Большинству людей достаточно просто добавить пакет `mod_python` в установку своей операционной системы. Если вы собираете его из исходников, то проконсультируйтесь с [[http://modpython.org/live/current/doc-html/|документацией по 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 ==

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

 1. Скопируйте moin.cgi в каталог вашей wiki
 1. Сконфигурируйте `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 работает после этих изменений.

 (!) В версиях 1.2 и ранее конфигурационный файл назывался `moin_config.py`.

== Изменение конфигурационного файла 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 (подробности см. [[http://modpython.org/live/current/doc-html/pyapi-interps.html|здесь]]).

Если вы устанавливали MoinMoin не в каталог по умолчанию, вам понадобится добавить путь к MoinMoin к системным путям:
{{{
    PythonPath "['/var/www/moin/mywiki', '/prefix/lib/python2.x/site-packages'] + sys.path"
}}}

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

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

 /!\ Если у вашей wiki не корневой URL (наподобие `http://www.example.com/FrontPage`), то вам, вероятно, понадобится выполнить следующие шаги:

На некоторых установках 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>
}}}
 (!) New in release 1.3.5

= Настройка корневой 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::
 {{{PythonHandler MoinMoin.request::RequestModPy.run: OSError: [Errno 2] No such file or directory: 'data/user'}}}
 Причиной появления этой ошибки является то, что у вас не указан абсолютный путь к `data_dir` в `moin_config.py`.  Этой ошибке предшествуют несколько других строк отслеживания ошибок в логе ошибок Apache. Исправьте путь в `moin_config.py`.
