Содержание
Зачем использовать 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 более эффективен в этом отношении.
Базовая настройка
- Установите mod_python
- Создайте экземпляр wiki
Отредактируйте wikiconfig.py
Измените httpd.conf Apache
- Перезапустите 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.
- Скопируйте moin.cgi в каталог вашей wiki
Сконфигурируйте 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 (подробности см. здесь).
Если вы устанавливали 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.