## Please edit system and help pages ONLY in the master wiki!
## For more information, please see MoinMoin:MoinDev/Translation.
##master-page:HelpOnInstalling/FastCgi
##master-date:Unknown-Date
#acl -All:write Default
#format wiki
#language ru
= Использование MoinMoin с FastCgi =
<<TableOfContents>>
[[http://fastcgi.com|FastCGI]] это метод, позволяющий Apache общаться с "долгоиграющими" скриптами. Он имеет то преимущество, что скрипты запускаются и инициализируются только однажды, и данные кешируются в памяти от запроса к запросу, увеличивая производительность CGI-приложений.

== Развертывание на Apache ==
Чтобы развернуть MoinMoin с использованием FastCGI вам нужен Apache с mod_fastcgi. Пожалуйста, ознакомьтесь с документацией по mod_fastcgi, описывающей, как его собрать.

Выполните базовую apache-инсталляцию для вашей операционной системы, как описано в других частях установочной документации MoinMoin. В большинстве случаев это HelpOnInstalling/ApacheOnLinux. Там, где в документации упоминается {{{moin.cgi}}} вам следует использовать вместо этого {{{moin.fcg}}}. Убедитесь, что '''.fcg''' обрабатывается модулем FastCGI ({{{AddHandler fastcgi-script .fcg}}} в вашем конфиге apache).

Обычно, Apache запускает CGI-скрипты под своим собственным пользователем и группой, или с пользователем и группой соответствующего виртуального хоста, если вы используете suexec wrapper. Чтобы делать это с помощью FastCGI вам нужно включить в вашем конфиге apache опцию {{{FastCgiWrapper On}}} (см. документацию по FastCGI).

Убедитесь, что вы перезапустили Apache после изменения py-файлов (таких как config) для запуска сервера FastCGI, иначе вы не увидите никаких изменений!

=== Запуск как отдельного приложения и/или на Windows ===
MoinMoin может быть запущен как внешнее приложение, отвечающее на запросы FastCGI через локальный TCP/IP-сокет. Это хорошо работает на Windows. Всё, что вам нужно (имея установленный {{{mod_fastcgi}}} и работающий экземпляр MoinMoin) это:

 1. Выбрать номер порта для внутренней связи. Он должен быть больше 1023. В этом примере, мы выбрали 8888 (просто по приколу).

 1. Добавить следующие строки в ваш httpd.conf:
 {{{
Alias /moin.fcg "/your/path/to/moin.fcg"
FastCgiExternalServer "/your/path/to/moin.fcg" -host localhost:8888
}}}

 1. Отредактировать {{{moin.fcg}}}. Заменить
 {{{
fcg = thfcgi.THFCGI(handle_request)
}}}

 на
 {{{
fcg = thfcgi.THFCGI(handle_request, 0, 8888)
}}}


 1. Запустить файл {{{moin.fcg}}} вручную, как обычный скрипт Python:
 {{{
python moin.fcg
}}}

 1. Запустить Apache.

=== Откат на CGI если FastCGI недоступен ===
Установите и протестируйте MoinMoin согласно HelpOnInstalling/ApacheOnLinux. Потом сделайте и проверьте нужные правки для запуска mod_fastcgi. Если вы удовлетворены, то можете добавить следующий блок в свой конфиг Apache:

{{{
<IfModule !mod_fastcgi.c>
    ScriptAlias /mywiki "/your/path/to/moin.cgi"
</IfModule>
<IfModule mod_fastcgi.c>
    AddHandler fastcgi-script .fcg
    ScriptAlias /mywiki "/your/path/to/moin.fcg"
</IfModule>
}}}

Теперь Apache будет использовать mod_fastcgi если он доступен, и медленный cgi-скрипт в противном случае.

== Развертывание на lighttpd ==
Лучшим вариантом будет запуск moin как внешнего приложения. В этом случае вам не понадобится перезапускать веб-сервер для перезапуска moin.

=== Настройка ===
{{{
fastcgi.server = ( "/mywiki" =>
                       ( "localhost" =>
                         (
                           "host" => "127.0.0.1",
                           "port" => 8888,
                           "check-local" => "disable",
                           "broken-scriptfilename" => "enable",
                         )
                       )
                   )
}}}

 . (!) Вы увидите в логе ошибок lighttpd много ошибок "2005-12-02 16:30:11: (mod_fastcgi.c.2373) FastCGI-stderr:", причина которых не ясна.

=== Запуск экземпляра MoinMoin ===
Чтобы запустить экземпляр MoinMoin либо следуйте изменениям из "Запуск как отдельного приложения и/или на Windows" выше, или запустите moin.fcg, пользуясь {{{spawn-fcgi}}} (установлено с lighttpd).

{{{
cd /www/org.mywiki/bin
sudo -u www /usr/local/bin/spawn-fcgi -f ./moin.fcg -P moin.pid
}}}

Чтобы остановить экземпляр позже:

{{{
sudo kill `cat moin.pid`
}}}

 . (!) Запуск spawn-fcgi под root и используя -u www -g www приводит к выходу по ошибке Python ImportError, причина не ясна. sudo -u www даёт тот же эффект.

=== Множество процессов moin ===
Если вы запускаете много экземпляров moin на разных портах, lighttpd автоматически распределяет нагрузку между ними, используя все CPU.

Используйте такие настройки:

{{{
fastcgi.server             = ( "/mywiki" =>
                               ( "localhost" =>
                                 ( "host" => "127.0.0.1", 
                                   "port" => 1080,
                                   "check-local" => "disable",
                                   "broken-scriptfilename" => "enable",
                                 ),
                                 ( "host" => "127.0.0.1", 
                                   "port" => 1081, 
                                   "check-local" => "disable",
                                   "broken-scriptfilename" => "enable",
                                 ),
                               )
                             )
}}}

=== Скрипт для автоматического запуска MoinMoin ===
Вот скрипт автоматического запуска для Mac OS X, использующий систему DarwinPortsStartup. Возможно, он будет полезен и для других UNIX-подобных платформ.

{{{
#!/bin/sh

# Start and stop multiple moin fast cgi instances runnings on PORTS

NAME="moin"
DIR="/www/org.mywiki/bin"
FCGIAPP="./moin.fcg"
PREFIX="/usr/local"

# List of ports to start moin instances on, separated with whitesapce
# Keep in sync with fastcgi.server in lighttpd.conf
PORTS="1080 1081"

start_on_port () {
    # Start moin instance on port, leaving pid file
    port=$1
    
    cd "${DIR}" && sudo -u www "${PREFIX}/bin/spawn-fcgi" \
        -f "${FCGIAPP}" \
        -p $port \
        -P "${NAME}-${port}.pid" \
        > /dev/null
}

kill_on_port () {
    # Try to kill process using pid in pid file, then remove the pid file
    pidFile="${DIR}/${NAME}-$1.pid"
    kill `cat "$pidFile"` && rm -f "$pidFile" > /dev/null 
}

start () {
    for port in $PORTS; do start_on_port $port; done 
}

stop () {
    for port in $PORTS; do kill_on_port $port; done
}

case "$1" in
start)
    # XXX starting twice will break pid files (bug in spawn-fcgi)
    start && echo -n " $NAME"
        ;;
stop)
        stop && echo -n " $NAME"
        ;;
restart)
    stop
    start && echo -n " $NAME"
        ;;
*)
        echo "Usage: `basename $0` {start|stop|restart}" >&2
        ;;
esac

exit 0
}}}

=== Добавление скрипта автоматического запуска MoinMoin на Mac OS X ===
При помощи этого скрипта экземпляры moin будут автоматически запускаться при загрузке.

 1. Установите [[http://darwinports.opendarwin.org/getdp/|drarwinports]]
 1. Установите пакет DarwinPortsStartup:
 {{{
sudo port install DarwinPortsStartup
}}}
 1. Скопируйте moin.sh в {{{/opt/local/etc/rc.d}}}:
 {{{
sudo cp moin.sh /opt/local/etc/rc.d
}}}
